汇编语言:div指令和mul指令

1. div指令

        div 是除法指令,在8086CPU中,使用div做除法时,遵循以下规则:

(1)除数:有8位(1字节)和16位(2字节)两种,放在一个寄存器(8位存放在8位寄存器中,16位存放在16位寄存器中)或内存单元中(8位存放在内存字节单元中,16位存放在内存字单元中)
(2)被除数:默认放在ax寄存器或dx和ax寄存器中
        a) 如果除数为8位时,那么被除数为16位,默认存放在ax寄存器中
        b) 如果除数为16位时,那么被除数为32位,在dx和ax寄存器中存放,其中,dx存放被除数的高16位,ax存放被除数的低16位
(3)结果:默认存放在ax寄存器或dx和ax寄存器中
        a) 如果除数为8位,那么结果存放在ax寄存器中,其中,al存放除法操作的商,ah存放除法操作的余数
        b) 如果除数为16位,那么结果存放在dx和ax寄存器中,其中,ax存放除法操作的商,dx存放除法操作的余数

格式:

div bl                           ;除数为8位,存放在bl寄存器中
div byte ptr ds:[0]        ;除数为8位,存放在ds:[0]内存字节单元中
div bx                          ;除数为16位,存放在bx寄存器中
div word ptr ds:[0]       ;除数为16位,存放在ds:[0]内存字单元中

示例1:编写代码求:1001除以100

(1)分析
        a) 因为被除数 1001 小于65535,除数 100 小于255,所以用除数为8位,被除数为16位的div操作规则
        b) 在除数为8位的div除法操作中,被除数存放在ax寄存器中,所以 ax = 1001。除数可以存放在寄存器或内存中,所以我们可以将除数存放在寄存器中,那么可以有 bl = 100.
        c) 在除数为8位的div除法操作中,结果存放在ax寄存器中,al存放div除法操作的商,ah存放div除法操作的余数。
(2)代码

assume cs:code
code segment
    ; 编写代码求 1001/100
    ; 因为被除数 1001 小于 65535,被除数为16位,除数为100,小于255,所以,用除数为8位的除法规则
    ; 除数8位除法中,被除数要放在ax寄存器中
    ; 除数可以放在寄存器或内存中,被除数 = (ax)
start:
    mov ax, 1001    ;被除数
    mov bl, 100     ;除数
    div bl          ;执行该指令后,ax寄存器中的低8位al存放 1001/100 的商,高8位ah存放 1001/100 的余数
                    ;ax = 010Ah, 即 商= (al) = 0Ah,余数 = (ah) = 01h

    mov ax, 4c00h
    int 21h
code ends
end start

示例2:编写代码求:100001除以100

(1)分析:
        a)因为被除数 100001大于65535,所以被除数只能是32位,那么除数为16位。将100001转为十六进制表示为186A1h。
        b)在除数为16位的div除法操作中,被除数存放在dx和ax寄存器中,dx存放被除数的高16位,ax存放被除数的低16位,所以,dx = 1h,ax = 86A1h。除数可以存放在寄存器或内存中,所以我们可以将除数存放在寄存器中,那么可以有 bx = 100。
        c)在除数为16位的div除法操作中,结果存放在dx和ax寄存器中,dx存放div除法操作的余数,ax存放div除法操作的商。
(2)代码

assume cs:code
code segment
    ; 编写代码求 100001/100
    ; 因为被除数 100001 大于 65535,被除数为32位,除数要用16位表示
    ; 除数16位除法中,被除数的低16位要放在ax寄存器中,高16位要放在dx寄存器中组成一个32为的数
    ; 除数可以放在寄存器或内存中,被除数 = (dx)*10000h + (ax) ,将 100001 转为16进制数为:0x186a1
start:
    mov dx, 1       ;被除数的高16位
    mov ax, 86a1h   ;被除数的低16位
    mov bx, 100     ;除数
    div bx          ;执行该指令后,ax寄存器存放 100001/100 的商,dx寄存器存放 100001/100 的余数
                    ;ax = 03E8h(即十进制数1000),dx = 0001h

    mov ax, 4c00h
    int 21h
code ends
end start

2.mul指令

        mul 是乘法指令,在8086CPU中,使用mul做乘法时,遵循以下规则:

(1)两个相乘的数,要么都是8位,要么都是16位
        a) 两个相乘的数都为8位,一个数默认放在 al 8位寄存器中,另一个数放在 8位的寄存器中或内存字节单元中。
        b) 两个相乘的数都为16位,一个数默认放在 ax 寄存器中,另一个数放在16位的寄存器中或内存字单元中
(2)结果:默认存放在ax寄存器或dx和ax寄存器中
        a) 如果是8位乘法,结果默认存放在ax寄存器中
        b) 如果是16位乘法,结果存放在dx和ax寄存器中,ax存放结果的低16位,dx存放结果的高16位

格式

mul bl                       ;8位乘法,一个数默认放在al 8位寄存器中,另一个数存放在bl 8位寄存器中
mul byte ptr ds:[0]    ;8位乘法,一个数默认放在al 8位寄存器中,另一个数存放在ds:[0]内存字节单元中
mul bx                      ;16位乘法,一个数默认放在ax寄存器中,另一个数存放在bx寄存器中
mul word ptr ds:[0]   ;16位乘法,一个数默认放在ax寄存器中,另一个数存放在ds:[0]内存字单元中

示例1:编写代码求:100乘以200

(1)分析

        a) 100和200都小于255,所以可以用mul的8位乘法来计算。
        b) mul的8位乘法中,一个数默认放在al 8位寄存器中,另一个数可以放在8位寄存器中或内存字节单元中,所以,al = 100,可以有 bl = 200。
        c) mul的8位乘法中,结果默认存放在ax寄存器中,所以执行 mul bl 指令后,ax = 20000 = 4E20h。

(2)代码

assume cs:code
code segment
start:
    mov al, 100     ;al = 100
    mov bl, 200     ;bl = 200
    mul bl          ;8位乘法,al乘以bl,结果存放在ax中

    mov ax, 4c00h
    int 21h
code ends
end start

示例2:编写代码求:100除以1000

(1)分析

        a) 100小于255,可1000大于255,所以只能用mul的16位乘法来计算。
        b) mul的16位乘法中,一个数默认放在ax寄存器中,另一个数可以存放寄存器中或内存字单元中,所以,ax = 100,可以有 bx = 1000。
        c) mul的16位乘法中,结果存放在dx和ax寄存器中,ax存放结果的低16位,dx存放结果的高16位,所以执行 mul bx 指令后,ax = 86A0h,dx = 0001h。0001h * 10000h + 86A0h = 100000

(2)代码

assume cs:code
code segment
start:
    mov ax, 100     ;ax = 100
    mov bx, 1000    ;bx = 1000
    mul bx          ;16位乘法,ax * bx,结果的低16位存放在ax,结果的高16位存放在dx

    mov ax, 4c00h
    int 21h
code ends
end start

参考

《汇编语言(第4版)》王爽

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值