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

标签 macos assembly gnu-assembler

我在使用这个小宏时遇到了很多麻烦。

.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/

相关文章:

assembly - ascii vs asciz vs 气体字符串

c - 访问汇编函数的浮点返回

python - CGS Flush WIndows - pygame 错误

macos - 如何打印从动态库导出的符号列表

c++ - 到达展开处理程序

c - PADDD 指令的操作数

python - 无法在 Mac OS 上运行 Airflow 1.10

iPhone 无法使用 UDP recvfrom 接收数据

c - gcc - 在 bss 中编写和执行代码 - 设置权限标志

assembly - 不支持的指令 `lidt`