OSX x86 GAS .macros的语法是什么?

时间:2013-07-17 15:49:40

标签: macos assembly gas

我很难让这个微小的宏工作。

.macro int_kernel
    subl $4, %esp
    int $0x80
    addl $4, %esp
.endm

运行汇编程序,我得到了

as -arch i386 upper.s -o ./upper.o
upper.s:51:expecting operand before ','; got nothing
upper.s:51:suffix or operands invalid for `int'
upper.s:51:expecting operand before ','; got nothing

错误来自osx宏语法,使用$ 0,$ 1,...来引用宏的参数 该宏中常量的正确osx语法是什么?

解决方案:必须使用两个美元符号,如 subl $$4, %esp

2 个答案:

答案 0 :(得分:2)

这是气体宏的正确语法。它不使用任何参数。 3条说明书正确无误。

你的as不是GNU。它是一个遥远的亲戚,经过Apple的大量修改,所以你不能依靠GNU文档来解释任何事情。例如,尝试在GNU文档中查找-arch选项...它不存在。

您必须参考Apple的文档。他们在这里保留了一份副本:http://developer.apple.com/documentation/DeveloperTools/Reference/Assembler

一个简单的区别是,他们已经将宏尾指令从.endm更改为.endmacro。除此之外,是的,看起来他们用宏参数替换$0$1等,而不是像GNU一样使用命名参数。而且他们不会告诉你如何在宏输出中加入文字$! (文档作者如何忽略这个问题?想要做的事情是罕见的事情)

总之,由于Apple使用完全不同的宏语法修改了汇编程序,并且无法正确记录它,我们还要猜测。我试着在每个美元符号后面放一个空格,希望这会让他们通过宏观过程不受伤害,同时不会损害他们被识别为直接操作数指示符的能力​​。如果这不起作用,我的下一次尝试是在美元符号之前加上反斜杠,然后加倍美元符号,然后找出真正的GNU汇编程序是否可以安装在MacOS而不是黑客和未记录的Apple上版本...

答案 1 :(得分:-1)

gas不使用任何特殊语法来识别常量 - 它们只是数字。所以你可能想要这样的东西:

.macro int_kernel
    subl 4, %esp
    int 0x80
    addl 4, %esp
.endm