2013-07-17 4 views
2

이 작은 매크로를 작동시키는 데 많은 어려움을 겪고 있습니다. 어셈블러를 실행OSX x86 GAS .macros의 구문은 무엇입니까?

.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

오류가 매크로의 매개 변수를 참조하는 $ 0 $ 1, ... 사용 OSX 매크로 구문에서 제발.
해당 매크로의 상수에 대한 올바른 osx 구문은 무엇입니까?

솔루션 : 2 달러 표지판 subl $$4, %esp

+0

는 I는 그 어떤 어셈블러 모르겠지만, GAS 없습니다. GAS 매크로 구문 여기서 설명되어 http://sourceware.org/binutils/docs/as/Macro.html#Macro – zwol

답변

2

: 그래서 당신은 아마 뭔가를 원한다. 매개 변수를 사용하지 않습니다. 3 가지 지침은 쓰여진대로 정확합니다.

as는 GNU되지 않는 것입니다. 먼 친척이고 애플에 의해 많은 수정이 있었기 때문에, 당신은 GNU 문서에 의존해서 아무것도 설명 할 수 없다. 예를 들어, GNU 문서에서 -arch 옵션을 찾으십시오 ... 존재하지 않습니다.

당신은 애플의 설명서를 참조해야 할 것입니다. 그들은 여기에 복사본을 보관합니다 : http://developer.apple.com/documentation/DeveloperTools/Reference/Assembler

하나의 간단한 차이점은 매크로 종료 지시문을 .endm에서 .endmacro으로 변경했기 때문입니다. 그들은처럼 GNU와 같은 명명 된 인수를 사용하는 대신 매크로 인수 등 $0, $1을 교체하고 같은 게다가, 그래 같습니다. 그리고 매크로 출력에 리터럴 $을 포함시키는 방법을 알려주지 않습니다. (문서 작성자는이 질문을 간과 한 적이 있습니까?) 희귀 한 일이 아니어야합니다.

요약하면 Apple은 어셈블러를 완전히 다른 매크로 구문으로 수정했으며 제대로 문서화하지 못했기 때문에, 왼쪽 추측. 각 달러 기호 다음에 공백을 넣으려고합니다. 즉, 매크로 프로세스를 무사히 통과하면서 즉시 피 연산자 기호로 인식 될 수있는 능력을 손상시키지 않기를 바랍니다. 문제가 해결되지 않은 경우, 내 다음 시도는 실제 GNU 어셈블러 대신 해킹 앤 underdocumented 애플 버전의 맥 OS에 설치할 수 있는지 여부를 알아내는 후, 달러 기호를 두 배로, 달러 기호 앞에 백 슬래시를 넣어 것입니다. ..

+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