2013-10-27 4 views
0

아래 코드는 for 루프가 문자열 반복을 중지하지 않도록합니다. 그것은 영원히 계속됩니다. 그러나 사용자가 숫자를 입력하는 기간을 계속해야합니다.for 루프 어셈블리가 영원히 계속됩니다

segment .data 
    integer1: times 4 db 0 
heeder: db "%d", 0 
strin: db "Enter the number: ", 0 
segment .bss 



SECTION .text 
global _main 

extern _scanf 
extern _printf 

_main: 

    push integer1 ; address of integer1 (second parameter) 
    push heeder ; arguments are right to left (first parameter) 
    call _scanf 
add esp, 8 
mov eax, 0 
mov eax, [integer1] 

mov ecx, eax 




loop: 
cmp eax, ecx 
jbe for 
jmp end 
for: 
push strin 
call _printf 
add esp, 4 
inc eax 
     jmp loop 
end: 

코드에 문제가 생길 수 있습니까?

답변

3

printf()을 호출 한 후에는 eax의 값이 printf 함수의 반환 값입니다. eax은 호출로 보존되지 않습니다.

그 문제를 해결 한 후에도 적어도 하나의 다른 버그가 있습니다. eaxecx은 동일한 값으로 루프를 시작합니다. eax1을 0으로 설정하려고합니다. 너무 빨리.

+0

일반적으로 어셈블리에서 호출하는 모든 함수의 호출 규칙에서 유지되는 레지스터를 알고 있어야합니다. cdecl 호출 규칙에서 ecx는 일반적으로 보존되지 않습니다. –