Assembly 为什么程序不能精确地计算整数和?
我是汇编编程(x86)新手,不知道我的程序哪里出错了。在我重新显示移动到数组中的值之后,我想显示当前的“总和”。我认为,通过使用“ebx”寄存器,因为它在程序中除了Loop2之外没有其他地方使用,所以该值不会被覆盖,因此每个“add”语句都会将新的数组位置值添加到我的“SUM”中 谁能看出我做错了什么Assembly 为什么程序不能精确地计算整数和?,assembly,x86,masm,irvine32,Assembly,X86,Masm,Irvine32,我是汇编编程(x86)新手,不知道我的程序哪里出错了。在我重新显示移动到数组中的值之后,我想显示当前的“总和”。我认为,通过使用“ebx”寄存器,因为它在程序中除了Loop2之外没有其他地方使用,所以该值不会被覆盖,因此每个“add”语句都会将新的数组位置值添加到我的“SUM”中 谁能看出我做错了什么 INCLUDE Irvine32.inc COUNT = 3 .data inputMsg BYTE "Input an integer: ", 0 outputMsg BYTE "Redisp
INCLUDE Irvine32.inc
COUNT = 3
.data
inputMsg BYTE "Input an integer: ", 0
outputMsg BYTE "Redisplaying the integers: ", 0dh, 0ah, 0
sumMsg BYTE " Sum is now: ", 0
strArray SDWORD COUNT DUP(?)
.code
main PROC
; Read Integers from User
mov ebx, 0
mov ecx, COUNT
mov edx, OFFSET inputMsg
mov esi, OFFSET strArray
L1: call WriteString ; Display Prompt
call ReadInt ; Read input from user
mov [esi], eax ; Store value into array
add esi, TYPE strArray ; Move to next array position
loop L1
call Crlf
; Redisplay the integers
mov edx, OFFSET outputMsg ; Display 'outputMsg'
call WriteString
mov ecx, COUNT
mov esi, OFFSET strArray
L2: mov ebx, 0 ; Initialize ebx to 0
mov eax, [esi] ; Get integer from array
call WriteInt ; Display integer
mov edx, OFFSET sumMsg ; Display value of 'sumMsg'
call WriteString
; mov eax, ebx
add ebx, [esi]
mov eax, ebx ; <---- MOVED from above add ebx, [esi]
call WriteInt
call Crlf
add esi, TYPE strArray ; Move to next array position
loop L2
exit
main ENDP
END main
包括Irvine32.inc
计数=3
.数据
inputMsg字节“输入整数:”,0
outputMsg字节“重新显示整数:”,0dh,0ah,0
sumMsg字节“现在求和:”,0
strArray SDWORD计数重复(?)
.代码
主进程
; 从用户读取整数
mov-ebx,0
mov ecx,计数
mov edx,偏移量输入msg
胶印带
L1:呼叫写入;显示提示
调用ReadInt;从用户处读取输入
mov[esi],eax;将值存储到数组中
添加esi,输入strArray;移动到下一个阵列位置
回路L1
呼叫Crlf
; 重新显示整数
mov edx,偏移量输出msg;显示“outputMsg”
通话记录
mov ecx,计数
胶印带
L2:mov-ebx,0;将ebx初始化为0
mov-eax[esi];从数组中获取整数
通话记录;显示整数
移动edx,偏移总和SG;“summasg”的显示值
通话记录
; mov-eax,ebx
添加ebx,[esi]
mov-eax,ebx 在调用最后一个WriteInt之前,您可能必须“mov eax,ebx”。在调用WriteInt之前,您需要将ebx移动到eax。在求和循环之前将ebx初始化为0也是一个好主意。我尝试按照您的建议去做(如果我理解正确的话)。现在所有读取为数组输出的行,后跟“Sum is Now:+0”
。我已经编辑了上面的代码以反映更改。还有什么想法吗?你把mov-eax,ebx
放错地方了。把它放在callwriteint
I移动的moveax,ebx
下的addebx,[esi]
和上面的callwriteint
。现在输出是:+1和现在是:+1+2和现在是:+2+3和现在是:+3
我还缺少什么?mov ebx,0
应该在L2
之前,否则每次迭代都会将和重置为0。就是这样,谢谢!)我已经按照你和ooga的建议编辑了我的代码。现在,输出读取为数组值,后跟修改代码后的“总和现在为:+0”
。还有其他想法吗?