Assembly 程序集x86中整数之间的除法

Assembly 程序集x86中整数之间的除法,assembly,x86,masm,Assembly,X86,Masm,我正在开发一个编译器,当我试图从以下自定义语言代码生成汇编代码时遇到了一个问题 b:=-2; c:=-4; a:=c/b; 为了测试这个结果,我使用了一个if条件,询问a==2但不是 这是由代码avobe生成的一段代码 mov ax, 1 mov _a, ax mov ax, -2 mov _b, ax mov ax, -4 mov _c, ax mov dx, 0 mov ax, _c mov bx, _b cmp bx, 0 JE label_div0Excp // jum

我正在开发一个编译器,当我试图从以下自定义语言代码生成汇编代码时遇到了一个问题

b:=-2;
c:=-4;
a:=c/b;
为了测试这个结果,我使用了一个if条件,询问a==2但不是

这是由代码avobe生成的一段代码

mov ax, 1
mov _a, ax

mov ax, -2
mov _b, ax

mov ax, -4
mov _c, ax


mov dx, 0
mov ax, _c   
mov bx, _b
cmp bx, 0
JE label_div0Excp  // jump to division by 0 message
idiv bx  
mov @aux0, ax

mov ax, @aux0
mov _a, ax

mov ax, _a
cmp ax,2

JNE label_1

invoke MessageBox, NULL, addr _message0, addr _message0, MB_OK  //_message0 say that result == 2
有人能帮我吗


谢谢

IDIV
进行有符号除法,因此它希望
DX:AX
中的红利是有符号双字。因此,您不应在除法之前清除
DX
,而应将
AX
扩展到
DX:AX
。这可以通过
CWD
指令完成


英特尔手册中写道:“
CWD
指令可用于从分词前的一个字产生双字红利。”

IDIV BX指令将
DX:AX
除以
BX
。DX:AX是两个粘合在一起的16位寄存器,被视为一个32位值。您已将DX归零,但对有符号算术来说,将DX归零是不够的。您需要将AX扩展到DX中。换句话说,如果
AX
为正,
DX
应为0,但如果
AX
为负,则
DX
需要为-1,也称为0xFFFF。方便的是,有一条指令在不进行显式比较或跳转的情况下进行符号扩展:
CWD
convertword todouble)

请尝试以下方法:

mov ax, _c   
cwd              //  <--------------
mov bx, _b
cmp bx, 0
JE label_div0Excp  // jump to division by 0 message
idiv bx
mov ax,\u c

cwd//您在本世纪制作了一个16位编译器?该编译器只有学术知识purposes@harold:我甚至打算这样做,因为我需要一个用于某种引导管理器(当然是在真实模式下运行)的引导管理器。要找到一个与GNU工具链(链接器)一起工作的工具几乎是不可能的。最后,我编写了一个不完整的编译器,但我完全用汇编代码编写了引导管理器,因此编译器的工作毫无用处。