Assembly 整数溢出irvine32 我用32位无符号操作数< /P>在汇编语言中编写了C++表达式的代码

Assembly 整数溢出irvine32 我用32位无符号操作数< /P>在汇编语言中编写了C++表达式的代码,assembly,x86,masm,irvine32,Assembly,X86,Masm,Irvine32,如果(val2==0),则 {val2=1} val1=(val3/val2)*(val1+val3) 但我得到了错误“溢出整数” 当我输入val1=600,val2=0,val3=1000时,错误在div val2处。任何更高的数字都不能工作,只有较小的数字。。。如何纠正这一点 您使用的是32位无符号操作数,但变量val1 BYTE?etc仅声明为8位,255以上的数字不适用于它们。从readint获取的32位二进制数应与 mov-val1,eax和notmov-val1,al 这是毫无意义

如果(val2==0),则

{val2=1}

val1=(val3/val2)*(val1+val3)

但我得到了错误“溢出整数” 当我输入val1=600,val2=0,val3=1000时,错误在
div val2
处。任何更高的数字都不能工作,只有较小的数字。。。如何纠正这一点

您使用的是32位无符号操作数,但变量
val1 BYTE?
etc仅声明为8位,255以上的数字不适用于它们。从
readint
获取的32位二进制数应与
mov-val1,eax
和not
mov-val1,al


这是毫无意义的
;;在将任何内容移动到寄存器之前,请清除所有寄存器,但务必在
div val2;之前清除EDX;;计算VAL3/VAL2
因为指令希望在64位寄存器对EDX:EAX中进行除法。

我明白你的意思,但我如何在64位进行除法,因为我尝试过,但我认为我做到了wrong@MohamadAlkousi实际上它是32位除法。除法的位由除数宽度控制,如果将变量
val2
声明为DWORD,则除数宽度为32。英特尔表示:无符号除以EDX:EAX除以r/m32,结果存储在EAX中← 商← 剩余的。
    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