我有一个简单的汇编程序,我想要分割两个数字(两个字节大小)和打印余数。这是我的代码
.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
因此,当我运行此代码时,结果是“Divide overflow”,我不知道为什么会发生溢出。 有什么想法吗?
答案 0 :(得分:1)
DIV mem16
将DX:AX
除以给定的操作数。因此,您需要将AX
签名延伸到DX
,您可以轻松地在分割前使用CWD
指令(在您的情况下为MOV DX,0
或XOR DX,DX
也会工作)。即:
mov ax,12
cwd
div ten
您的代码的另一个问题是您似乎假设int 21h / ah=9
可用于打印数值。事实并非如此。如果要打印DX
的值(即余数),则必须先将其转换为字符串并打印该字符串。否则你只会得到垃圾输出,你的程序甚至可能会崩溃。
答案 1 :(得分:0)
写"十个DB 10"或者" div BYTE PTR ten"。
我确信你写的是
mov cl, 10
div cl
你也会得到你想要的东西。如果它应该是分词,你必须清除DX,迈克尔在下面的帖子中写道,如何。
是的,我不知道,它是什么汇编方言,但你真的需要写这个吗?mov ax, @data
mov ds, ax
DS没有通过defaut指向数据部分吗?
而09h并不能做你想做的事。看看02h。
答案 2 :(得分:0)
。模特小 .stack 256
。数据 10 dw 10
.CODE 主要过程 mov ax,@ dat 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
主要的结束 结束主要