![](/img/trans.png)
[英]What style assembly is this (intel, att...etc?) and how can I produce it?
[英]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.