В вашем коде макроса в 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`, препроцессор будет правильно интерпретировать значения и сгенерирует нужный код.