Скажите, что у меня есть этот код сборки ниже. Точно так же, как вызов printf знает, что печатать? Он просто распечатывает все, что находится по адресу, который выталкивается чуть выше него все время? В этом случае «push msg»?Как printf в сборке знает, что печатать?
SECTION .data
msg: db "Hello World!",10,0
SECTION .text
extern printf
global main
main:
push ebp
move ebp, esp
push msg
call printf
move esp, ebp
pop ebp
ret
Да, он смотрит на свои аргументы, как на любую другую функцию. Прочтите соглашение ABI/call, чтобы узнать, как аргументы передаются функциям. http://stackoverflow.com/tags/x86/info –
Он принимает строковый адрес формата из памяти стека ('ss: esp'), как следующее значение после обратного адреса, не имеет значения, как вы устанавливаете этот память до некоторого значения, выполнение 'push' перед' call' является удобным и обычным «нормальным» способом, но я смогу имитировать то же самое с инструкциями 'mov',' sub' и 'jmp' (нет' push 'или' call'). – Ped7g