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 为什么程序不能精确地计算整数和?_Assembly_X86_Masm_Irvine32 - Fatal编程技术网

Assembly 为什么程序不能精确地计算整数和?

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

我是汇编编程(x86)新手,不知道我的程序哪里出错了。在我重新显示移动到数组中的值之后,我想显示当前的“总和”。我认为,通过使用“ebx”寄存器,因为它在程序中除了Loop2之外没有其他地方使用,所以该值不会被覆盖,因此每个“add”语句都会将新的数组位置值添加到我的“SUM”中

谁能看出我做错了什么

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”
。还有其他想法吗?