我用汇编语言编写了一个使用32位无符号操作数的c++表达式代码
如果(val2 ==0)则
{val2 = 1}
val1 = (val3 / val2) * (val1 + val3)
但是我得到了错误"overflow Integer“当我输入val1 = 600,val2= 0,val3= 1000时,错误出现在div val2,任何更大的数字都不会只适用于更小的数字...如何纠正这一点?
https://i.imgur.com/ivcRkVI.png
INCLUDE Irvine32.inc
.data
val1 BYTE ?
val2 BYTE ?
val3 BYTE ?
prompt BYTE "Please enter 3 numbers: ",0
out1 BYTE "val1 = (val3 / val2) * (val1 + val3) = ",0
.code
main PROC
;;CLEAR ALL REGISTERS
xor eax,eax
xor ebx,ebx
xor ecx,ecx
xor edx,edx
;;DISPLAY PROMPT
mov edx,offset prompt
call writestring
;;NEWLINW
mov al,0ah
call writechar
;;READ VAL1 AND STORE
call readint
mov val1,al
;;READ VAL2 AND CHECK AND STORE
call readint
cmp al,0 ;;CHECK IF 0
jnz skip
mov val2,1 ;;IF 0, MAKE VAL1 AS 1
jmp readnext
skip:
mov val2,al ;;ELSE STORE SAME VALUE
readnext:
;;READ VAL3 AND STORE
call readint
mov val3,al
div val2 ;;CALCULATE VAL3/VAL2
mov bl,al ;;SAVE IN BL
mov al,val3
add al,val1 ;;ADD VAL3+VAL1
mul bl ;;(VAL3/VAL2)*(VAL3+VAL1)
;;DISPLAY MESSAGE
mov edx,offset out1
call writestring
;;DISPLAY ANSWER
call writedec
;;DUMP REGISTERS
call dumpregs
call waitmsg ;;WAIT FOR A KEY PRESS
INVOKE ExitProcess, 0
main ENDP
END main发布于 2021-03-28 23:03:31
您正在使用32位无符号操作数,但您的变量val1 BYTE ?等仅声明为8位,大于255的数字将不适合它们。从readint获取的32位二进制数应与
mov val1,eax而不是mov val1,al。
在你移动任何东西到它们之前,对;;CLEAR ALL REGISTERS是没有意义的,但是一定要在div val2 ;;CALCULATE VAL3/VAL2之前清除EDX,因为指令DIV期望在64位寄存器对EDX:EAX中被除数。
https://stackoverflow.com/questions/66842538
复制相似问题