隨着內聯彙編在GCC,您可以用"i"
約束指定立即彙編操作數,像這樣:如何在gcc中使用英特爾語法的即時約束?
void set_to_five(int* p)
{
asm
(
"movl %1, (%0);"
:: "r" (p)
, "i" (5)
);
}
int main()
{
int i;
set_to_five(&i);
assert(i == 5);
}
沒有錯,到目前爲止,除了它在可怕的AT & T語法。因此,讓我們用.intel_syntax noprefix
再試一次:
void set_to_five(int* p)
{
asm
(
".intel_syntax noprefix;"
"mov [%0], %1;"
".att_syntax prefix;"
:: "r" (p)
, "i" (5)
);
}
但是,這並不工作,因爲編譯器插入即時值,彙編器不再明白之前$
前綴。
如何在英特爾語法中使用"i"
約束?
嘗試使用'%c1'(請參閱https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#x86Operandmodifiers)。另外,請考慮使用-masm = intel而不是僞操作。 –
我一定讀過那個頁面10次,但不知何故我錯過了那一點。謝謝!你應該發佈這個答案。 – user5434231
儘管我希望使用'-masm = intel',但在使用AT&T語法asm包含頭文件時會造成麻煩。 – user5434231