Я пытаюсь построить цикл, но это дает мне бесконечный цикл:NASM сборочного цикла
SECTION .data
i: dd 0
message: db "The number is %d",10,0
SECTION .text
extern printf
global main
main:
push ebp
mov ebp, esp
mov eax, DWORD [i]
mov ecx, DWORD 10
L1:
add eax, DWORD 1
push eax
push message
call printf
add esp, 8
loop L1
mov esp, ebp
pop ebp
NASM дает мне выход как The number is 18
бесконечно. Но если я положил printf
в конце кода. Он дает мне правильный результат
L1:
add eax, DWORD 1
loop L1
push eax
push message
call printf
add esp, 8
mov esp, ebp
pop ebp
Кто-нибудь знает, где я ошиблась?
_ECX_ (переменная цикла) необходимо сохранить (сохранить) перед вызовом _printf_. Соглашение о вызове C для 32-битного кода в Linux заключается в том, что _EAX_, _ECX_ и _EDX_ могут быть уничтожены вызовом функции. Если вам нужен какой-либо из этих регистров, чтобы быть тем, кем они были до вызова, вам нужно будет его сохранить, а затем восстановить. У вас такая же проблема с _EAX_ –