For-loop-in-assembly将永远持续下去

For-loop-in-assembly将永远持续下去,assembly,x86,nasm,Assembly,X86,Nasm,在下面的代码中,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 i

在下面的代码中,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:

调用
printf()
后,
eax
中的值是
printf
函数的返回值-
eax
不被调用保留


请注意,即使修复了该问题,至少还有一个错误-
eax
ecx
使用相同的值启动循环-看起来您希望将`eax1设置为0,但这样做太早了。

在调用
printf()之后
eax中的值是
printf
函数的返回值-
eax
不被调用保留


请注意,即使修复了该问题,至少还有一个错误-
eax
ecx
使用相同的值启动循环-看起来您希望将`eax1设置为0,但这样做太早了。

在调用
printf()之后
eax中的值是
printf
函数的返回值-
eax
不被调用保留


请注意,即使修复了该问题,至少还有一个错误-
eax
ecx
使用相同的值启动循环-看起来您希望将`eax1设置为0,但这样做太早了。

在调用
printf()之后
eax中的值是
printf
函数的返回值-
eax
不被调用保留


请注意,即使修复了该问题,至少还有一个错误-
eax
ecx
使用相同的值启动循环-看起来您希望将`eax1设置为0,但这样做太早了。

一般来说,在汇编中,了解在调用任何函数的调用约定中保留的寄存器是很重要的。在cdecl调用约定中,ecx通常也不保留。一般来说,在汇编中,了解在调用任何函数的调用约定中保留的寄存器是很重要的。在cdecl调用约定中,ecx通常也不保留。一般来说,在汇编中,了解在调用任何函数的调用约定中保留的寄存器是很重要的。在cdecl调用约定中,ecx通常也不保留。一般来说,在汇编中,了解在调用任何函数的调用约定中保留的寄存器是很重要的。在cdecl调用约定中,ecx通常也不保留。