[英]Integer Overflow irvine32
我使用 32 位無符號操作數用匯編語言為這個 c++ 表達式編寫了代碼
如果 (val2 ==0) 那么
{val2 = 1}
val1 = (val3 / val2) * (val1 + val3)
但我得到錯誤“溢出整數”當我輸入 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
您正在使用 32 位無符號操作數,但您的變量val1 BYTE?
etc 僅聲明為 8 位,超過 255 的數字將不適合它們。 從readint
獲得的 32 位二進制數應與
mov val1,eax
而不是mov val1,al
。
;;CLEAR ALL REGISTERS
是沒有意義的,但一定要在div val2;;CALCULATE VAL3/VAL2
之前清除 EDX,因為指令DIV期望它在 64 位寄存器對 EDX:EAX 中被除數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.