Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 这段简单代码在x86汇编中的工作方式_Assembly_X86_Nasm - Fatal编程技术网

Assembly 这段简单代码在x86汇编中的工作方式

Assembly 这段简单代码在x86汇编中的工作方式,assembly,x86,nasm,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

我已经做了一个简单的程序,它将计算前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个数字之和的预期结果。

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


其他问题:您应该对
c1
使用
dd
,因为整数是4字节,而不是1。您还应该零终止格式字符串,并将
消息
放入
.data
部分。

您所说的“它应该给出一个值9”是什么意思?它不应该给出正确的结果吗(10)?或者你的意思是它给了你不正确的9的结果?@Micheal这可能会让人困惑,但当我运行它时,它给了我正确的值10,但是如果你手动查看此代码,它不应该给9。谢谢Jester,我明白了你的意思,probem确实是你提到的。