Assembly 汇编语言中的除法溢出

Assembly 汇编语言中的除法溢出,assembly,x86,division,Assembly,X86,Division,我有一个简单的汇编程序,我想把两个数字(两个字节大小)除以,然后打印余数。这是我的密码 .model small .stack 256 .data ten dw 10 .code main proc mov ax, @data mov ds, ax mov ax, 12 ; divident div ten ; ax/10 mov ah, 9 ; for printing dx int 21h mov ax,

我有一个简单的汇编程序,我想把两个数字(两个字节大小)除以,然后打印余数。这是我的密码

  .model small
.stack 256

.data 
    ten dw 10

.code
main proc
    mov ax, @data
    mov ds, ax

    mov ax, 12 ; divident
    div ten    ; ax/10

    mov ah, 9  ; for printing dx
    int 21h

    mov ax, 4c00h ; ending program
    int 21h
main endp
end main
所以当我运行这段代码时,结果是“除法溢出”,我不知道为什么会发生溢出。
有什么想法吗?

divmem16
用给定的操作数除以
DX:AX
。因此,您需要将
AX
零扩展到
DX
,使用
MOV-DX,0
XOR-DX,DX
,即:

mov ax,12
xor dx,dx
div ten
(在使用
idiv
对除法进行签名之前,请使用
cwd
对扩展AX进行签名。)

代码的另一个问题是,您似乎假设可以使用
int 21h/ah=9
打印数值。事实并非如此。如果要打印
DX的值(即剩余值),必须先将其转换为字符串并打印该字符串。否则您只会得到垃圾输出,您的程序甚至可能崩溃。

写“十分贝10”或“div BYTE PTR十”

我敢肯定如果你写了这样的东西

mov cl, 10
div cl 
你也会得到你想要的。“若它应该是分词,你们必须清除DX,”迈克尔在下面的帖子中写道,“怎么做?”

顺便说一句,我不知道它是什么汇编语言,但你真的需要写这个吗

mov ax, @data
mov ds, ax
DS不是通过defaut指向数据段吗

09h也不是你想要的。看看02h。

.model small .堆栈256

.数据 10德瓦10

.代码 主进程 mov-ax,@data mov-ds,ax

mov ax, 12 ; divident
div ten    ; ax/10
add dl,48;
mov ah, 02h  ; for printing dl not the ascii vlaue
int 21h

mov ax, 4c00h ; ending program
int 21h
主端
end main

mov segreg,reg16是一条完全有效的x86指令。我可能错了,但我认为它在DOS下不起作用。(并且在dosbox中确实有效)我总是写push reg16/pop segreg。也许你在想类似于
mov-es,0a000h
的东西。这不是有效的指令,可以用
push/pop
代替。但是,从最早的x86机型开始,就可以将16位GPR移动到段寄存器中。问题不在
mov ds,ax中。我也在其他程序中尝试过,在这里,您是否尝试过搜索组装划分问题/问题?你的问题不是第一个。有趣的是,当我调试我的代码时,一切都是正确的,但当它试图打印值时,它在调试模式下打印垃圾,在正常模式下打印“除溢出”。在某些环境中,当程序启动时,您可能会得到
DX
为0的结果。在这些情况下,部门将正常工作,但您不应该依赖于此。使用
CWD
,您就安全了。至于打印垃圾,我在回答的第二部分提到了为什么会这样。如果您只想打印一个数字,可以在除法后将
'0'
添加到
DL
,并使用
int 21h/ah=2
。或者你可以实现自己的int-to-string函数,例如,你的答案最终帮助了我,我的主程序也成功了(这只是一个测试)。非常感谢。