这个简单的代码如何在x86程序集中工作

时间:2014-04-01 12:34:50

标签: assembly x86 nasm

我制作了一个简单的程序,它将计算前n个数字的总和(存储在varibale c1中)并将它们打印到控制台上。

当我运行它时,工作正常并给我想要的结果。例如,如果我从keyborad输入4,它给我10。

但现在当我手动完成它时,发现当我提供输入为4时它应该给出值9。

代码写得好吗?

section .bss
c1 db
section .data
x db "%d"
section .text
global main
extern printf
extern scanf
main:
mov ebx,1
mov eax,0
lea ecx,[c1]
push ecx
push x
call scanf
add esp,8
well_done:

inc ebx
add eax,ebx

cmp ebx,[c1]

jnz well_done
push eax
push message
call printf
add esp,8
ret
message:
db "sum is =%d",10,0

编辑:

section .text
global main
extern printf
main:
mov ebx,0
mov eax,0
well_done:

inc ebx
add eax,ebx
cmp ebx,4

jnz well_done
push eax
push message
call printf
add esp,8
ret
message:
db "sum is =%d",10,0

上面的代码给出了前4个数字之和的预期结果。

1 个答案:

答案 0 :(得分:1)

问题是scanf会返回eax中处理的项目数,从而覆盖之前放入的0。由于您阅读了1个项目,eax将为1,这就解释了为什么在运行代码时获得10个项目。您应该将mov eax, 0向下移至scanf之后,并从ebx开始0

其他问题:您应该使用dd作为c1,因为整数是4个字节,而不是1.您还应该零终止格式字符串并将message放入.data {1}}部分也是如此。