2013-07-17 47 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