2013-11-04 3 views
0

"% 연산자는 절대 표현이 필요합니다"실패 다음가스 altmacro 매크로는 내가 좋아하는 매크로를 만들려면

assert_eq $1 
assert_eq $1, %eax 
:

.altmacro 

.macro assert_eq a, b=%eax 
    LOCAL ok 
    #... 
.endm 

는 다음과 같이 사용하기

LOCAL의 경우 .altmacro을 원합니다 (\@을 사용하는 다른 가능성이 있지만, LOCAL을 원합니다). 나는이 컴파일 할 때

는하지만 얻을 : Expression results as strings, 이후 .altmacro을하지 않고 :

Error: % operator needs absolute expression 

나는이 문제가 b=%eax.altmacro에 의해 활성화 된 또 다른 기능을 사용하려고한다는 사실에 의해 만들어진 것으로 추측하고있다 나는 문제없이 이것을 쓸 수 있었다.

이것이 사실이라면 매크로가 작동하도록하려면 어떻게해야합니까? 그렇지 않다면, 내 코드에 어떤 문제가 있습니까?

보너스 : 사용 방법 %?

가스 버전 : 2.23.52

답변

1

나는 내가 사용 .altmacro을 필요로하는 매크로 인수로 레지스터를 전달하고 싶었 매우 비슷한 문제로 실행했다. 수정 된 점은 레지스터를 <>에 묶고 놓는 것이 었습니다! % 이전. 그래서

.macro assert_eq a, b=<%eax> 

을 할 매크로를 변경 시도하고 당신이 이제까지 인수로 등록하여 매크로를 호출 할 경우 .altmacro

assert_eq <%eax>, <%ecx> 
+0

감탄 부호'!'로 어떤 효과도 볼 수 없었습니다 (제외하고 :-)), 예를들 수 있습니까? –

0

, % 가져 퍼센트 어떤 전달 된 매개 변수 또는 기본을 표현으로 취급됩니다. 이 확장되지 매크로 자체가 하나의 내부, 인수 만에 발생하기 때문에

.altmacro 

.macro PERCENT x 
    mov \x, %eax 
.endm 
PERCENT <%ebx> 

.macro PERCENT_DEFAULT x=<%ebx> 
    mov \x, %eax 
.endm 
PERCENT_DEFAULT 

:

샘플 사용 : mentioned by mfbutner

.altmacro 

.macro PERCENT x 
    mov $\x, %eax 
.endm 
mov $0, %eax 
PERCENT %1+1 
/* eax == 2 */ 

.macro PERCENT_DEFAULT x=%1+1 
    mov $\x, %eax 
.endm 
mov $0, %eax 
PERCENT_DEFAULT 1 
/* eax == 1 */ 
PERCENT_DEFAULT 
/* eax == 2 */ 

일이 일어나고에서 해당 확장을 방지하기 위해, 우리는해야 할 만약 인수가 레지스터라는 것을 확신한다면, 매크로 안에 백분율을 넣는 것입니다 :

.macro PERCENT_ESCAPE_REG x 
    mov %x, %eax 
.endm 
mov $0, %eax 
mov $1, %ebx 
PERCENT_ESCAPE_REG ebx 
/* eax == 1 */ 

그러나 이것은 우리가 더 이상 $1 같은 immediate 만 통과 할 수없는 단점이 있습니다

PERCENT_ESCAPE_REG $1 

는 모든 호출에 추가 노이즈를 사용하는 호출자가 필요로 이것은, .altmacro를 사용하는 저 거대한 분기점이다 ...