我可以在同一行上写多个汇编指令吗?

时间:2014-12-29 08:18:23

标签: assembly

我可以在同一行上编写多个汇编指令,就像我使用大多数高级语言一样。或者每个汇编程序是否以不同方式处理此功能?

2 个答案:

答案 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");

但是,由于gasas支持使用;分隔上述指示,you can also use it in gcc like __asm__("xor eax, eax; inc eax")因为

  

编译器将汇编程序指令以基本asm逐字复制到汇编语言输出文件...

     

AssemblerInstructions

     

这是一个文字字符串,用于指定汇编代码。该字符串可以包含汇编程序识别的任何指令,包括指令。 GCC不解析汇编程序指令本身,也不知道它们的含义,甚至不知道它们是否是有效的汇编程序输入。

     

您可以将多个汇编程序指令放在一个asm字符串中,由系统汇编代码中通常使用的字符分隔。在大多数地方都可以使用的组合是断行的换行符,加上制表符(写为\n\t)。 某些汇编程序允许使用分号作为行分隔符。但请注意,某些汇编语言使用分号开始评论。

     

https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Basic-Asm.html

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)

是的,你是对的。它取决于汇编程序是否允许。我认为,了解语法细节的最佳方法是查看汇编程序的文档。