2016-12-17 1 views
-2

Скажите, что у меня есть этот код сборки ниже. Точно так же, как вызов 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 
+3

Да, он смотрит на свои аргументы, как на любую другую функцию. Прочтите соглашение ABI/call, чтобы узнать, как аргументы передаются функциям. http://stackoverflow.com/tags/x86/info –

+0

Он принимает строковый адрес формата из памяти стека ('ss: esp'), как следующее значение после обратного адреса, не имеет значения, как вы устанавливаете этот память до некоторого значения, выполнение 'push' перед' call' является удобным и обычным «нормальным» способом, но я смогу имитировать то же самое с инструкциями 'mov',' sub' и 'jmp' (нет' push 'или' call'). – Ped7g

ответ

0

Когда вы push msg, вы выдвигая на Адресные первый байте вектора байт, который является вашим переменной msg в стек. Когда вызывается printf, он выполняет и печатает вектор, байт на байт, с первого (тот, который вы передали), до символа сигнала, который сообщает ему, чтобы он остановился. Этот символ сигнала - 0 после ввода строки.

 Смежные вопросы

  • Нет связанных вопросов^_^