Каков синтаксис для OSX x86 GAS .macros?

У меня много проблем с работой этого крошечного макроса.

.macro int_kernel
    subl $4, %esp
    int $0x80
    addl $4, %esp
.endm

Запустив ассемблер, я получаю

as -arch i386 upper.s -o ./upper.o
upper.s:51:expecting operand before ','; got nothing
upper.s:51:suffix or operands invalid for `int'
upper.s:51:expecting operand before ','; got nothing

Ошибки возникают из-за синтаксиса макроса OSX, где $0,$1,... используются для ссылки на параметры макроса.
Каков правильный синтаксис OSX для констант в этом макросе?

Решение: необходимо использовать два знака доллара, как в subl $$4, %esp.


person user1992284    schedule 17.07.2013    source источник
comment
Я не знаю, что это за ассемблер, но это не GAS. Синтаксис макроса GAS описан здесь: sourceware.org/binutils/docs/as/Macro .html#Макрос   -  person zwol    schedule 17.07.2013


Ответы (2)


Это правильный синтаксис для газового макроса. Он не использует никаких параметров. 3 инструкции верны, как написано.

Дело в том, что ваш as не GNU. Это дальний родственник с большим количеством модификаций Apple, поэтому вы не можете полагаться на документацию GNU, чтобы что-то объяснить. Например, попробуйте поискать параметр -arch в документации GNU... его не существует.

Вам придется обратиться к документации Apple. Они хранят его копию здесь: https://developer.apple.com/library/archive/documentation/DeveloperTools/Reference/Assembler/

Одно простое отличие заключается в том, что они изменили директиву конца макроса с .endm на .endmacro. Кроме того, да, похоже, что они заменяют $0, $1 и т. д. макроаргументами вместо использования именованных аргументов, как GNU, как это делает. И они не говорят вам, как включить литерал $ в вывод макроса! (Как автор документации упустил из виду этот вопрос? Это не может быть редкостью, чтобы хотеть сделать)

Таким образом, поскольку Apple изменила ассемблер с помощью совершенно другого синтаксиса макросов и не смогла должным образом его задокументировать, нам остается только гадать. Я бы попробовал поставить пробел после каждого знака доллара, надеясь, что это поможет им пройти через процесс макросов целыми и невредимыми, не повредив их способности быть распознанными как непосредственные означающие операнды. Если это не сработает, моей следующей попыткой будет поставить обратную косую черту перед знаком доллара, затем удвоить знак доллара, а затем выяснить, можно ли установить настоящий ассемблер GNU на MacOS вместо взломанной и недостаточно документированной версии Apple. ..

person Community    schedule 18.07.2013
comment
Двойные знаки доллара сделали это! - person user1992284; 18.07.2013

gas не использует никакого специального синтаксиса для идентификации констант — это просто числа. Итак, вы, вероятно, хотите что-то вроде:

.macro int_kernel
    subl 4, %esp
    int 0x80
    addl 4, %esp
.endm
person Chris Dodd    schedule 17.07.2013
comment
Однако в AT&T [синтаксис] регистры имеют префикс «%», а immed — префикс «$» (ссылка) (другая ссылка) - person Michael; 17.07.2013
comment
4 — операнд памяти, абсолютный адрес = 4. - person Peter Cordes; 23.02.2021