我在使用这个小宏时遇到了很多麻烦。
.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
最佳答案
这是 gas 宏的正确语法。它不使用任何参数。 3 条说明正确无误。
你的as
不是GNU。它是远房亲戚,Apple 做了很多修改,所以你不能依赖 GNU 文档来解释任何事情。例如,尝试在 GNU 文档中查找 -arch
选项……它不存在。
您将不得不引用 Apple 的文档。他们在这里保留了它的副本:https://developer.apple.com/library/archive/documentation/DeveloperTools/Reference/Assembler/
一个简单的区别是他们将宏结束指令从 .endm
更改为 .endmacro
。除此之外,是的,看起来他们用宏参数替换了 $0
、$1
等,而不是像 GNU 那样使用命名参数。而且他们没有告诉您如何在宏输出中包含文字 $
! (文档作者怎么忽略了这个问题?想做的事应该不会少吧)
总而言之,由于 Apple 使用完全不同的宏语法修改了汇编程序并且未能正确记录它,我们只能猜测。我会尝试在每个美元符号后放置一个空格,希望能让它们在宏观过程中毫发无伤,同时又不会损害它们被识别为直接操作数指示符的能力。如果这不起作用,我的下一次尝试是在美元符号前加一个反斜杠,然后将美元符号加倍,然后找出是否可以在 MacOS 上安装真正的 GNU 汇编程序,而不是被黑客攻击和记录不足的 Apple 版本。 ..
关于macos - OSX x86 GAS .macros 的语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17704474/