我很难让这个微小的宏工作。
.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
答案 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