Я написал простую программу для сборки:Почему значение EDX перезаписывается при вызове printf?
section .data
str_out db "%d ",10,0
section .text
extern printf
extern exit
global main
main:
MOV EDX, ESP
MOV EAX, EDX
PUSH EAX
PUSH str_out
CALL printf
SUB ESP, 8 ; cleanup stack
MOV EAX, EDX
PUSH EAX
PUSH str_out
CALL printf
SUB ESP, 8 ; cleanup stack
CALL exit
Я ассемблер NASM и GCC, чтобы связать объектный файл в исполняемый файл на Linux.
По существу, эта программа сначала помещает значение указателя стека в регистр EDX, а затем дважды печатает содержимое этого регистра. Однако после второго вызова printf значение, напечатанное на stdout, не соответствует первому.
Такое поведение кажется странным. Когда я заменяю любое использование EDX в этой программе с помощью EBX, вычисленные целые числа идентичны ожидаемым. Я могу только указать, что EDX перезаписывается в какой-то момент во время вызова функции printf.
Почему это так? И как я могу убедиться, что регистры, которые я использую в будущем, не конфликтуют с функциями C lib?
Этот человек получил меня впервые много лет назад. Ответ, который вы приняли, является правильным, но опускает 'ebp' и' esp' в качестве спасения. Эти двое, кажется, не говорят, но вы можете технически испортить это. Добро пожаловать в сборку! – sqykly
@sqykly Спасибо. Это, безусловно, намного менее прощающий, чем языки более высокого уровня, к которым я привык. Но я не потерплю поражения! :) – Jake
Ответьте на столько вопросов, сколько я делаю, и вы начнете задумываться об этом. – sqykly