用汇编语言划分溢出

时间:2013-04-06 11:34:04

标签: 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, 4c00h ; ending program
    int 21h
main endp
end main

因此,当我运行此代码时,结果是“Divide overflow”,我不知道为什么会发生溢出。 有什么想法吗?

3 个答案:

答案 0 :(得分:1)

DIV mem16DX:AX除以给定的操作数。因此,您需要将AX签名延伸到DX,您可以轻松地在分割前使用CWD指令(在您的情况下为MOV DX,0XOR 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

主要的结束 结束主要