簡體   English   中英

在GCC中的Intel和ATT模式之間切換

[英]Switching between Intel and ATT mode in GCC

因此,我擁有此內聯匯編代碼以及C代碼,並且我想針對此對asm()的特定調用使用intel語法,但是我需要切換回ATT語法,否則它將給出一堆錯誤。

asm(".intel_syntax prefix");
     asm volatile (
        "add %0, $1 \n\t"
         : "=r" (dst)
         : "r" (src)); 

asm(".att_syntax prefix");

現在給出以下錯誤

/tmp/ccDNa2Wk.s: Assembler messages:
/tmp/ccDNa2Wk.s:180: Error: no such instruction: `movl -16(%ebp),%eax'
/tmp/ccDNa2Wk.s:187: Error: no such instruction: `movl %eax,-12(%ebp)'

我不明白如何解決該錯誤,我沒有在我的代碼的任何部分調用movl。

由於您尚未接受答案(<hint> <hint>),讓我添加第三個想法:

1)在1中執行以下操作,而不是使用3條asm語句:

asm(".intel_syntax prefix\n\t"
    "add %0, 1 \n\t"
    ".att_syntax prefix"
     : "=r" (dst)
     : "r" (src));

2)更改編譯選項以包括-masm=intel並省略2個語法語句。

3)可以在同一時間同時支持英特爾和ATT。 這樣,無論為-masm傳遞了什么值,您的代碼都可以工作:

asm("{addl $1, %0 | add %0, 1}"
     : "=r" (dst)
     : "r" (src));

我還要指出,您的asm可能無法正常工作。 由於您正在更新dst的內容(而不是覆蓋它),因此您可能要使用“ + r”而不是“ = r”。 您確實意識到該代碼實際上並沒有使用src,對嗎?

哦,您原來的asm不是intel格式的($ 1是贈品)。

我會嘗試做以下測試:

在一些不包含內聯匯編器的C代碼中插入行

asm(".att_syntax prefix");

在多個不同的位置。 然后將C代碼編譯為目標文件並反匯編這些目標文件(在此測試中,編譯為匯編程序將無效)。

然后將原始代碼的反匯編與包含“ .att_syntax”行的代碼的反匯編進行比較。

如果“ .att_syntax前綴”行確實是切換回AT&T模式的正確行,則拆卸必須相等,並且編譯必須正確無誤。

在下一步中,將您的代碼編譯為匯編程序,而不是目標代碼(GCC的“ -S”選項)。 然后,您可以查看匯編代碼。

我的想法如下:

如果您在內聯匯編程序中使用數據交換(例如“ = r”和“ r”),則GCC需要插入進行數據交換的代碼:

 asm(".intel_syntax prefix");
 // GCC inserts code moving "src" to "%0" here
 asm volatile (
    "add %0, $1 \n\t"
     : "=r" (dst)
     : "r" (src)); 
 // GCC inserts code moving "%0" to "dst" here
 asm(".att_syntax prefix");

GCC插入的這段代碼當然是AT&T語法。

如果要在嵌入式匯編中使用Intel語法,則必須在同一嵌入式匯編塊中使用“ .att_syntax”和“ .intel_syntax”指令,如下所示:

 // GCC inserts code moving "src" to "%0" here
 asm volatile (
    ".intel_syntax prefix \n\t"
    "add %0, $1 \n\t"
    ".att_syntax prefix \n\t"
     : "=r" (dst)
     : "r" (src)); 
 // GCC inserts code moving "%0" to "dst" here

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM