Не вытерпела, сама проверила. Это фигня какая-то. Чтобы позиционные параметры не совпадали, добавила дополнительный. Ну и ни как локальная метка из первого макроса не работает во втором, только обычные позиционные параметры:
Код: Выделить всё
%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 Мало мне насма с интеловской нотацией в линухе!