0

我有一个简单的汇编程序,我想将两个数字(两个字节大小)相除并打印余数。这是我的代码

  .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

所以当我运行这段代码时,结果是“除法溢出”,我不知道为什么会发生溢出。有任何想法吗?

4

3 回答 3

2

DIV mem16除以DX:AX给定的操作数。所以你需要零扩展AXDX, with MOV DX,0or XOR DX,DXIe:

mov ax,12
xor dx,dx
div ten

(在用 符号除法之前idiv,用于cwd符号扩展 AX。)

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

于 2013-04-06T11:40:19.347 回答
0

写“十 DB 10”或“div BYTE PTR 十”。

我敢肯定,如果你写类似

mov cl, 10
div cl 

你也会得到你想要的。如果是分词,你必须清除DX,迈克尔在下面的帖子中写道,如何。

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

mov ax, @data
mov ds, ax

DS不是默认指向数据部分吗?

09h 不会做你想做的事。看看02h。

于 2013-04-06T11:42:33.030 回答
-1

.model 小 .stack 256

.data 十 dw 10

.code main proc 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

主要结束主要

于 2013-09-25T18:49:11.820 回答