2017-11-08 10 views
2

(GAS 어셈블러에서) 나는이 작업을 수행 할 수 :이 문제에 대한 해결책을 찾을 수 없습니다매크로 정의가 아닌 레이블을 어떻게 연결할 수 있습니까?

add rcx,[a1] 
add rcx,[a3] 
add rcx,[a5] 

: 그것은 출력이해야

i=0 
.rept 3 
    add rcx,[a?(i*2+1)] 
    i=i+1 
.endr 

. 나는 그것이 매크로 정의 안에 있기를 원하지 않는다.

+0

gcc로 asm을 빌드하고 있습니까? 그렇다면 C preprocessor를 CPP 매크로와 함께 사용하여 두 args를 붙여 넣을 수도 있습니다. 그것은'gas'가'.rept'를보기 전에 일어난다면 작동하지 않는 것을 제외하고는. 흠. –

+1

나는 매크로를 사용하지 않고 할 수 있다고 믿지 않는다. –

+0

매크로를 사용할 수없는 이유가 궁금합니다. –

답변

2

매크로 나 다른 유형의 사전 처리를 사용하지 않고도 해결할 수 있다고 생각하지 않습니다.

loopmac 

당신은 제대로 %(i*2+1)를 처리 할 수 ​​있도록 .altmacro 지침이 필요합니다 : 당신은 다음과 같이 loopmac 매크로를 사용

.altmacro 

.macro addmac val 
    add rcx, [a\val] 
.endm 

.macro loopmac 
    i=0 
    .rept 3 
     addmac %(i*2+1) 
     i=i+1 
    .endr 
.endm 

:이 일의 GNU 어셈블러 방법은 같은 것을 볼 수 있었다 :

7.4 .altmacro

당신은 쓸 수 있습니다 '% expr'식 expr을 평가하고 결과를 문자열로 사용하십시오.

오히려 .rept를 사용하는 것보다 당신은 .irp를 사용하여 매크로를 단순화 할 수 있습니다 : .altmacro 처리를 필요로하지 않는다

.macro loopmac 
    .irp i,1,3,5 
     add rcx, [a\i] 
    .endr 
.endm 

마지막 예.