LINUX.ORG.RU

GAS, макрос, повторное вхождение


0

0

Всем доброго времени суток. Не подскажите, как сделать правильно.
Есть макрос который имеет 2 параметра:
1-идентификатор макроса; 2-передаваемая строчка

Я вынужден указывать в 1-ом параметре значение или символ,
который идентифицирует макрос. В программе таких макросов много.
Приходится вручную отслеживать, неудобно.
Как переложить это на препроцессор GAS ?
перерыл массу документов не могу найти, если не сложно.

макрос:
@;--------------------------------
.macro macro_print_msg NN, msg
b 1f
msg_\NN:
.asciz "\msg"
.align
.byte 13,13,13,13

1:
stmfd r13!, {R0,R2, R5}
ldr R0, =msg_\NN
....

2:
....
cmp r2, #13
bne 2b

ldmfd r13!, {R0,R2, R5}
.endm
@;----------------------------------

в программе вызываю:
macro_print_msg 1, "msg_xx"
macro_print_msg 2, "msg_xx"
...

Хочется в макросе в 'msg_\NN' подставить вместо 'NN'
что-то вроде "MACRO_V=MACRO_V+1"
Но как это сделать не знаю, возможно ли это, если возможно,
подскажите, если не сложно?

Решение 1 (номер нафиг не нужен, т.к. можно использовать временные
метки):

.macro macro_print_msg NN, msg
b 1f
3:
.asciz "\msg"
.align
.byte 13,13,13,13
                                                                               
1:
stmfd r13!, {R0,R2, R5}
adr R0,3b    <<<<<< реально будет  sub  r0, pc, #24

                                                                               
2:
cmp r2, #13
bne 2b
                                                                               
ldmfd r13!, {R0,R2, R5}
.endm
                                                                               
macro_print_msg 1, "msg_xx"
macro_print_msg 2, "msg_yy"

io ★★
()

Решение 2 (номер генерируется автоматически через \@):

.macro macro_print_msg NN, msg
b 1f
msg\@:
.asciz "\msg"
.align
.byte 13,13,13,13
                                                                               
1:
stmfd r13!, {R0,R2, R5}
ldr R0,=msg\@
                                                                               
2:
cmp r2, #13
bne 2b
                                                                               
ldmfd r13!, {R0,R2, R5}
.endm
                                                                               
macro_print_msg 1, "msg_xx"
macro_print_msg 2, "msg_yy"

$ gas -alm
....
  19                    > msg0:
  19 0004 6D73675F      > .asciz "msg_xx"
....
  19 0010 25002DE9      > stmfd r13!,{R0,R2,R5}
  19 0014 2C009FE5      > ldr R0,=msg0
....
  20                    > msg1:
  20 0028 6D73675F      > .asciz "msg_yy"
....
  20 0034 25002DE9      > stmfd r13!,{R0,R2,R5}
  20 0038 0C009FE5      > ldr R0,=msg1

io ★★
()
Ответ на: комментарий от io

Спасибо, большое спасибо за 2 варианта.

user209
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.