2013-07-17 19 views
2

我在使这个微小的宏工作时遇到了很多麻烦。OSX x86 GAS .macros的语法是什么?

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

运行汇编器,我得到使用$ 0,$ 1,...来指代宏的参数

 
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语法来。
该宏中的常量的正确的osx语法是什么?

解决方案:两块钱标志必须被用作subl $$4, %esp

+0

我不知道那是什么汇编,但它不是GAS。 GAS宏语法记录在这里:http://sourceware.org/binutils/docs/as/Macro.html#Macro – zwol

回答

2

这是一个气体宏的正确语法。它不使用参数。这3条指令的写法是正确的。

这就是你的as不是GNU。这是一个遥远的亲戚,苹果有很多修改,所以你不能依靠GNU文档来解释任何事情。例如,尝试在GNU文档中查找-arch选项......它不存在。

您将不得不引用Apple的文档。他们在这里保留一份副本:http://developer.apple.com/documentation/DeveloperTools/Reference/Assembler

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

综上所述,由于苹果公司已经修改了汇编用完全不同的宏语法和未能正确我们”的文件它再左猜测。我会尝试在每个美元符号之后放置一个空格,希望能够在不损害其被视为立即操作符的能力的情况下,通过宏观过程而不会受到伤害。如果这样做不起作用,我的下一个尝试就是在美元符号前加一个反斜杠,然后加倍美元符号,然后找出真正的GNU汇编程序是否可以安装在MacOS上,而不是黑客和苹果版本。 ..

+0

双美元符号做到了! – user1992284

-1

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

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

“在AT&T [语法]中,但是寄存器前缀为'%',** immed的前缀为'$'**“([link](http://asm.sourceforge.net/articles/linasm.html#Syntax))([另一个链接](http://www.ibm.com/developerworks/library/) l-gas-nasm /)) – Michael