簡體   English   中英

Integer 溢出 irvine32

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM