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工具链(链接器)一起工作的工具几乎是不可能的。最后,我编写了一个不完整的编译器,但我完全用汇编代码编写了引导管理器,因此编译器的工作毫无用处。