大家好,欢迎来到IT知识分享网。
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:编写代码求:除以100
(1)分析:
a)因为被除数 大于65535,所以被除数只能是32位,那么除数为16位。将转为十六进制表示为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 ; 编写代码求 /100 ; 因为被除数 大于 65535,被除数为32位,除数要用16位表示 ; 除数16位除法中,被除数的低16位要放在ax寄存器中,高16位要放在dx寄存器中组成一个32为的数 ; 除数可以放在寄存器或内存中,被除数 = (dx)*10000h + (ax) ,将 转为16进制数为:0x186a1 start: mov dx, 1 ;被除数的高16位 mov ax, 86a1h ;被除数的低16位 mov bx, 100 ;除数 div bx ;执行该指令后,ax寄存器存放 /100 的商,dx寄存器存放 /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 =
(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版)》王爽
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/144571.html