首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >整数溢出irvine32

整数溢出irvine32
EN

Stack Overflow用户
提问于 2021-03-28 22:34:41
回答 1查看 149关注 0票数 0

我用汇编语言编写了一个使用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

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

发布于 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中被除数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66842538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档