在装配中卡住了scanf

时间:2013-06-28 12:03:21

标签: assembly x86

我是程序员的新手,并制作了一个程序,可以从键盘读取值。我为此目的使用了scanf函数。我在循环中调用scanf函数,以便我可以输入多个值。但问题是我无法限制键盘输入的值。下面是代码

现在我想从scanf输入四个值,但它不断询问用户的值。

  section .bss
  c1 dd
  b dd
  section .data
  x db "%d",10,0
  y db "number is =%d",10,0
  section .text
global main
extern printf
extern scanf


main:
mov edx,0
loop_done:
mov [b],edx
lea ebx ,[c1]
push ebx
push x
call scanf
mov edx,[b]
push dword [c1]
cmp edx,3
inc edx
jnz loop_done
push y
call printf


add esp,16

ret

2 个答案:

答案 0 :(得分:1)

您没有为bc1预留足够的空间。 dw仅保留一个16位字,但由于您要存储32位双字,因此需要使用dd。当scanf将读取值写入c1时,当前发生的情况是它会覆盖b(您存储了edx的值,即您的循环计数器)。

答案 1 :(得分:0)

这就是我改变代码以便运行良好的方法。如果代码中有下面的内容,请纠正我。

section .bss
c1 dd
b dd
section .data
x db "%d",10,0
y db "number is =%d",10,0
section .text
global main
extern printf
extern scanf


main:
mov edx,1
loop_done:
push edx
;mov [b],edx
lea ebx ,[c1]
push ebx
push x
call scanf
add esp,8
pop edx
;mov edx,[b]


;mov ecx,[c1]
;ush dword [c1]
;mov edx,[b]
 inc edx
 cmp edx,4

 jnz loop_done
 ;add esp,8

  ret