我可以在同一行上编写多个汇编指令,就像我使用大多数高级语言一样。或者每个汇编程序是否以不同方式处理此功能?
答案 0 :(得分:6)
每个汇编程序都有自己的语法。即使是x86上的Intel语法实际上在不同的汇编程序中也是如此。一些例子
大多数汇编程序接受换行符作为指令分隔符,但是一些汇编程序也可能定义另一个分隔字符,因此您不必在自己的行上编写每条指令。 GAS列出了@
和$
作为其他语句结尾字符,但我不确定它们是否允许多个指令被这些字符分隔开。它还支持将指令与;
分开,因此您可以将这些指令写在inc eax; int 3
语句以换行符(
'\n'
)或" at"结束。标志('@'
)。 [...]语句以换行符('\n'
)或感叹号('!'
)结束。 [...]一个语句以换行符结尾('\n'
);或(对于H8 / 300)一个美元符号('$'
);或(对于Hitachi-SH或H8 / 500)分号(';'
)。 [...]语句以换行符('\n'
)或行分隔符结尾。 (行分隔符通常为';'
,除非这与注释字符冲突;请参阅机器相关功能部分。)
MASM不支持同一行的多条指令,但您可以创建一个VARARG宏来达到类似的效果
_ macro args:VARARG
asm_txt TEXTEQU <>
FORC char,<&args>
IFDIF <&char>,<!\>
STR asm_txt,<&char>
ELSE
asm_txt
asm_txt TEXTEQU <>
ENDIF
ENDM
asm_txt
endm
然后像_ mov eax, -1 \ mov ebx, 2
一样使用它。更多信息请访问:Multiple instructions on one line?
对于内联汇编,尤其是在gcc中,由于换行结束了上一条指令,您可以通过在它们之间发出'\n'
来获取在一行中工作的说明
// unsafe: clobbers the red-zone in the x86-64 System V calling convention.
asm("push rax\n\t" "mov rax, 0\n\t" "pop rax");
或者您可以使用多个asm语句(编辑:不推荐,如Peter Cordes在评论中所述)
// unsafe: compiler can put its own code between these, or maybe even reorder them
// and without operands + clobbers, you can't mess with the compiler's registers.
asm("mov rbx, rax"); asm("xor rdx, rbx"); asm("mov rcx, 5");
但是,由于gas
和as
支持使用;
分隔上述指示,you can also use it in gcc like __asm__("xor eax, eax; inc eax")
因为
编译器将汇编程序指令以基本asm逐字复制到汇编语言输出文件...
AssemblerInstructions
这是一个文字字符串,用于指定汇编代码。该字符串可以包含汇编程序识别的任何指令,包括指令。 GCC不解析汇编程序指令本身,也不知道它们的含义,甚至不知道它们是否是有效的汇编程序输入。
您可以将多个汇编程序指令放在一个asm字符串中,由系统汇编代码中通常使用的字符分隔。在大多数地方都可以使用的组合是断行的换行符,加上制表符(写为
\n\t
)。 某些汇编程序允许使用分号作为行分隔符。但请注意,某些汇编语言使用分号开始评论。
MSVC也有;
作为指令分隔符,因为它的语法是
__asm assembly-instruction [ ; ]
__asm { assembly-instruction-list } [ ; ]
但是,you can even used the keyword __asm
itself要分开说明
因为__asm关键字是一个语句分隔符,所以您也可以将汇编指令放在同一行:
__asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al
ARM RealView Assembler还支持;
作为指令分隔符,如:
编译C ++时,ARM编译器支持ISO C ++标准中提出的
asm
语法。您可以使用以下格式指定内联汇编程序代码:
在一行上,例如:
asm("instruction[;instruction]"); // Must be a single string
asm{instruction[;instruction]}
...如果在同一行中包含多个指令,则必须用分号(;)分隔它们。如果使用双引号,则必须将所有说明括在一组双引号中(&#34;)。
答案 1 :(得分:-1)
是的,你是对的。它取决于汇编程序是否允许。我认为,了解语法细节的最佳方法是查看汇编程序的文档。