Assembly 我可以在同一行上编写多个装配说明吗?
我可以用与大多数高级语言相同的方法在同一行上编写多个汇编指令吗。或者每个汇编程序对该功能的处理方式都不同吗?是的,您是正确的。这取决于汇编程序是否允许它。我认为,了解语法细节的最佳方法是查看汇编程序的文档。每个汇编程序都有自己的语法。甚至x86上的英特尔语法在不同的汇编程序中也不相同。一些例子Assembly 我可以在同一行上编写多个装配说明吗?,assembly,Assembly,我可以用与大多数高级语言相同的方法在同一行上编写多个汇编指令吗。或者每个汇编程序对该功能的处理方式都不同吗?是的,您是正确的。这取决于汇编程序是否允许它。我认为,了解语法细节的最佳方法是查看汇编程序的文档。每个汇编程序都有自己的语法。甚至x86上的英特尔语法在不同的汇编程序中也不相同。一些例子 大多数汇编器接受换行符作为指令分隔符,但有些汇编器也可以定义另一个分隔字符,这样就不必将每条指令写在自己的行上。将@和$列为其他语句结尾字符,但我不确定它们是否允许多条指令由这些字符分隔。它
@
和$
列为其他语句结尾字符,但我不确定它们是否允许多条指令由这些字符分隔。它还支持用分隔指令代码>这样您就可以在一行中编写它们,如inceax;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
或者您可以使用多个asm语句(编辑:不推荐使用,正如Peter Cordes在评论中所说的)
//不安全:编译器可以将自己的代码放在它们之间,甚至可以对它们重新排序
//如果没有操作数+缓冲区,就不能弄乱编译器的寄存器。
asm(“mov rbx,rax”);asm(“xor rdx,rbx”);asm(“mov rcx,5”);
但是,因为gas
和as
支持使用
将上述指令分开,因为
编译器将汇编指令以基本asm格式逐字复制到汇编语言输出文件
汇编指令
这是一个文字字符串,用于指定汇编程序代码。字符串可以包含汇编程序识别的任何指令,包括指令。GCC不解析汇编指令本身,也不知道它们的意思,甚至不知道它们是否是有效的汇编输入
您可以将多条汇编指令放在一个asm字符串中,由系统汇编代码中通常使用的字符分隔。在大多数情况下,一个有效的组合是换行符和制表符(写为\n\t
)一些汇编程序允许分号作为行分隔符。但是,请注意,一些汇编语言使用分号来开始注释
MSVC也有代码>作为指令分隔符,因为其语法为
__asm assembly-instruction [ ; ]
__asm { assembly-instruction-list } [ ; ]
但是,要分开说明
由于_asm关键字是语句分隔符,因此也可以将汇编指令放在同一行:
__asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al
还支持代码>作为指令分隔符,如:
<>编译C++时,ARM编译器支持ISO C++标准中提出的<>代码ASM>代码>语法。可以使用以下格式指定内联汇编程序代码:
- 例如,在单行上:
asm(“指令[;指令]”);//必须是单个字符串
asm{instruction[;instruction]}
- 如果在同一行中包含多条指令,则必须用分号(;)分隔它们。如果使用双引号,则必须将所有指令括在一组双引号(“)中
GAS使用;
作为指令的分隔符。@PeterCordes感谢您的输入。但在我看来,分号并不能保证在所有情况下都是行分隔符。例如,当前的GAS手册上说“存在“;”一行中的任意位置表示注释的开始,该注释延伸到该行的结尾。“根据第9.5节“AVR相关特征”(小节:“特殊字符”).Neat,我想知道;
是否是GAS支持的任何体系结构的注释字符。由于您删除了此答案的错误部分,因此删除了我的否决票。@PeterCordes自GAS手册:分号适用于LLVM的内置GAS兼容汇编程序。啊,不,您不能使用多个asm语句。编译器可以自由放置任何它支持的内容单独的asm
语句之间的蚂蚁,可能会破坏寄存器。请不要建议人们这样做。用于x86的GNU C+GAS确实支持asm(“mov rbx,rax;”
“xor rdx,rbx;”
“mov rcx,5”);
而不是\n\t
,但是\n\t
在查看gcc-S
输出时看起来更好(单独的行而不是一个长行)。ARM上GAS的注释字符是@
@PeterCordes:gcc甚至不能保证连续的asm
语句(即使是易变的)将按照它们在源代码中出现的相同顺序输出。@PeterCordes:至于MSVC/C++我很确定它曾经被记录(可能在多年前的设备驱动程序开发工具包中)可以将\u asm
语句一个接一个地分开,MSVC不会在它们之间放置任何代码。MSVC还将按顺序保留连续的\u asm
语句。我可以