Почему в GAS не функционирует препроцессорное ветвление?

Здравствуйте! Подскажите, почему может не работать препроцессорное ветвление в gas? Не буду приводить полный листинг, но вот как выглядит конструкция: 

```
.macro my_macro arg1,arg2
.global func\arg1
....(code)
.if arg2 == 1
....(code)
.else
....(code)
.endif
....(code)
.if arg2 == 1
....(code)
.endif
....(code)
.endm

my_macro 0, 0 
my_macro 1, 1 
....
```

При вызове макроса (my_macro), независимо от значения arg2, итоговый код содержит только ветку с false условием. Как это можно исправить и где может быть ошибка?
  • 6 февраля 2025 г. 13:14
Ответы на вопрос 2
В вашем коде макроса в GAS (GNU Assembler) проблемы возникают из-за особенностей обработки аргументов при использовании препроцессорного ветвления. Давайте разберемся с вашими моментами.

### Проблема:
Когда вы используете `.if` для проверки значений аргументов, GAS рассматривает `arg1` и `arg2` как текстовые строки, а не как значения, потому что они не подставляются в препроцессорный контекст. В результате ваши проверки всегда возвращают `false`.

### Решение:
Для корректной работы вам нужно использовать `.set` или `.equ`, чтобы оценить аргументы макроса как константы в контексте, необходимом для условной компиляции.

Попробуйте изменить код следующим образом:

```asm
.macro my_macro arg1,arg2
    .set CUR_ARG1, arg1
    .set CUR_ARG2, arg2

    .global func\CUR_ARG1
    ....(code)
    .if CUR_ARG2 == 1
        ....(code)
    .else
        ....(code)
    .endif
    ....(code)
    .if CUR_ARG2 == 1
        ....(code)
    .endif
    ....(code)
.endm

my_macro 0, 0 
my_macro 1, 1 
....
```

### Объяснение:
1. Мы используем `.set` для назначения значений аргументов `arg1` и `arg2` новым символам `CUR_ARG1` и `CUR_ARG2`. Это позволяет рассматривать их как числовые константы в процессе компиляции.
2. Теперь вы можете использовать `CUR_ARG2` в условных операторах. Это гарантирует, что значение будет корректно оценено во время компиляции.

В результате, когда вы вызываете `my_macro 0, 0` и `my_macro 1, 1`, препроцессор будет правильно интерпретировать значения и сгенерирует нужный код.
Почему не работает препроцессорное ветвление в GAS?
.macro my_macro arg1,arg2
...
.if arg2 == 1


Нужно добавить \ чтобы gas выполнил макроподстановку: .if \arg2 == 1 .
Похожие вопросы