Многосточный макрос в ассемблере NASM, линукс, такой разве может быть?

Любые разговоры которые хоть как-то связаны с тематикой форума

Модератор: Модераторы разделов

Ответить
Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

Многосточный макрос в ассемблере NASM, линукс, такой разве может быть?

Сообщение жучара »

Друзья! Может, знаком кто:
%macro _syscall_write 2
mov rax, 1
mov rdi, 1
mov rsi, %%str
mov rdx, %%strln
syscall
%endmacro
это, понимаешь, многострочный макрос ассемблера NASM в параметрами. Причём %%str и %%strln- параметры. Но должно быть что-то вроде %1 и %2 или №1 и №2 или что-нибудь в этом роде. Но не вот это же вот. Или я что-то не понимаю и %%str и %%strln это зарезервированные имена первого и второго параметров? Отсюда взял
https://0xax.github.io/categories/assembler/

Спасибо, кто откликнется.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Многосточный макрос в ассемблере NASM, линукс, такой разве может быть?

Сообщение olecya »

Это всего лишь локальные метки:
where %%str is local label to which is get first parameter of PRINT macro
Эта метка определена в макросе который вы пропустили и является первым параметром к этому макросу

Код: Выделить всё

%%str db %1, 0
Следующая метка это длина этого сообщения
And %%strlen which calculates string length

Код: Выделить всё

%%strln equ $-%%str
Которая также вычисляется в макросе PRINT
Вот метка %%astr строчки записи тела этого макроса с двумя локальными метками:

Код: Выделить всё

%%astr: _syscall_write %%str, %%strln
Думаю так как препроцессор встраивает один макрос в другой то параметры %1 %2 и т.д. будут относиться только ко внешнему макросу, а так препроцессор подставляет правильные значения по меткам определенным во внешнем макросе.
Добавлено (09:14):
Но думаю есть вероятность того что если вы подставите вместо меток в теле внутреннего макроса параметры %1 %2, то препроцессор сможет правильно распознать очередность в подстановке аргументов. Если проведете эксперимент, то отпишитесь, пожалуйста. Мне тоже интересно будет узнать о передаче параметров во вложенном макросе.

Код: Выделить всё

        mov rsi, %1
        mov rdx, %2
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Многосточный макрос в ассемблере NASM, линукс, такой разве может быть?

Сообщение olecya »

Не вытерпела, сама проверила. Это фигня какая-то. Чтобы позиционные параметры не совпадали, добавила дополнительный. Ну и ни как локальная метка из первого макроса не работает во втором, только обычные позиционные параметры:

Код: Выделить всё

%macro _syscall_print 2
        jmp %%astr
        %%str:    db  %2, %1, 0
        %%strln:  equ $ - %%str
        %%astr: _syscall_write %%str, %%strln

%endmacro

%macro _syscall_write 2
        mov rax, 1
        mov rdi, 1
        mov rsi, %1
        mov rdx, %2
        syscall
%endmacro

        section .text
        global _start
_start:

        _syscall_print 10, "Hello World!"

        mov rax, 60
        xor rdi, rdi
        syscall
Добавлено (15:15):
И как то секции с данными и кодом получаются перепутаны
Добавлено (15:57):
Инструкции pusha и popa это 32 битная архитектура. А системный вызов write и syscall из 64 битной. Думаю это чистая "победа" копирайтера, а возможно и нескольких
Добавлено (16:03):
Я уже писала, что встречала такие симбиозы. Надо помнить что параметры в 32 битной архитектуре передаются в стеке и локальные переменные в стеке. Так что возможно изначальный код как-то и работает на 32 битах. Не хочу копаться в этой архитектуре, это уже архив
P.S Мало мне насма с интеловской нотацией в линухе!
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

Re: Многосточный макрос в ассемблере NASM, линукс, такой разве может быть?

Сообщение жучара »

olecya писала:
05.09.2022 09:00
Это всего лишь локальные метки:
where %%str is local label to which is get first parameter of PRINT macro
Эта метка определена в макросе который вы пропустили и является первым параметром к этому макросу

Код: Выделить всё

%%str db %1, 0
так о том и речь, %%str и %%strln- это такие имена первого и второго параметров? Гениально, что могу сказать.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Многосточный макрос в ассемблере NASM, линукс, такой разве может быть?

Сообщение olecya »

жучара писал(а):
09.09.2022 01:02
так о том и речь, %%str и %%strln- это такие имена первого и второго параметров?
На сколько мне это удалось выяснить экспериментально, нет. Получается, что это просто локальные переменные. Ну и понятное дело ни кто не запрещает использовать их как аргументы при вызове макроса в доступной области видимости, но я так и не смогла их подставить как позиционные параметры в теле макроса. Думаю в приведенном источнике есть опечатка или неточность.
Спасибо сказали:
Ответить