数据处理的两个基本问题04 – 零基础入门学习汇编语言41

第八章:数据处理的两个基本问题04

让编程改变世界

Change the world by program

div指令

div是除法指令(division),使用div作除法的时候:

除数:8位或16位,在寄存器或内存单元中

被除数:(默认)放在AX或DX和AX中

除数 被除数

8位     16位(AX)

16位   32位(DX+AX)

结果:运算  8位   16位

商    AL    AX

余数   AH   DX

div指令格式:

div  reg

div  内存单元

现在我们可以用多种方法来表示一个内存单元了。

div指令示例

div byte ptr ds:[0]

含义为:

(al) = (ax) / ((ds)*16+0) 商

(ah) = (ax) / ((ds)*16+0) 余数

div word ptr es:[0]

含义为:

(ax) = [(dx)10000H+(ax)]/((ds)16+0) 商

(dx) = [(dx)10000H+(ax)]/((ds)16+0) 余数

div byte ptr [bx+si+8]

(al)= (ax)/((ds)*16+(bx)+(si)+8) 商

(ah)=(ax)/((ds)*16+(bx)+(si)+8) 余数

div word ptr [bx+si+8]

(ax)=[(dx)10000H+(ax)]/((ds)16+(bx)+(si)+8) 商

(dx)=[(dx)10000H+(ax)]/((ds)16+(bx)+(si)+8) 余数

编程实现1:利用除法指令计算100001/100。

我们首先分析一下,被除数 100001 大于65535,不能用ax寄存器存放,所以我们要用dx和ax两个寄存器联合存放100001,也就是说要进行16位的除法。

除数100小于255,可以在一个 8位寄存器中存放,但是,因为被除数是32位的,除数应为16位,所以要用一个16位寄存器来存放除数100。

因为要分别为dx和ax赋100001的高16位值和低16位值,所以应先将100001表示为十六进制形式:186A1H。

mov dx,1

mov ax,86A1H  ;(dx)*10000H+(ax)=100001

mov bx,100

div bx

程序执行后,(ax)=03E8H(即1000),(dx)=1(余数为1)。

大家可自行在Debug中实践。

编程实现2:利用除法指令计算1001/100。

我们首先分析一下被除数1001可用 ax寄存器存放,除数100可用 8位寄存器存放,也就是说,要进行8位的除法。

程序如下:

mov ax,1001

mov bl,100

div bl

程序执行后,(al)=0AH(即10),(ah)=1(余数为1)。

伪指令dd

前面我们用db和dw定义字节型数据和字型数据。

dd是用来定义dword (double word双字)型数据的。

示例:

data segment

db 1

dw 1

dd 1

data ends

在data段中定义了三个数据:

第一个数据为01H,在data:0处,占1个字节。

第二个数据为0001H,在data:1处,占1个字。

第三个数据为00000001H,在data:3处,占2个字节。

问题8.1

用div 计算data段中第一个数据除以第二个数据后的结果,商存放在第3个数据的存储单元中。

data segment

dd 100001

dw 100

dw 0

data ends

思考后看分析。

data段中的第一个数据是被除数,为dword(双字)型,32位,所以在做除法之前,用dx和ax存储。应将data:0字单元中的低16位存储在 ax中,data:2字单元中的高16位存储在dx中。

问题8.1程序实现代码

mov ax,data

    mov ds,ax

    mov ax,ds:[0]       ;ds:0字单元中的低16位存储在ax中

    mov dx,ds:[2]       ;ds:2字单元中的高16位存储在dx中

    div word ptr ds:[4] ;用dx:ax中的32位数据除以ds:4字

                        ;单元中的数据

    mov ds:[6],ax       ;将商存储在ds:6字单元中

dup

dup是一个操作符,在汇编语言中同db、dw、dd 等一样,也是由编译器识别处理的符号。

它是和db、dw、dd 等数据定义伪指令配合使用的,用来进行数据的重复。

dup示例

db 3 dup (0)

定义了3个字节,它们的值都是0,相当于 db 0,0,0

db 3 dup (0,1,2)

定义了9个字节,它们是0、1、2、0、1、2、0、1、2,相当于 db 0,1,2,0,1,2,0,1,2

db 3 dup (‘abc’,’ABC’)

定义了18个字节,它们是‘abcABCabcABCabcABC’,相当于db ‘abcABCabcABCabcABC’

可见,dup的使用格式如下:

db 重复的次数 dup (重复的字节型数据)

dw 重复的次数 dup (重复的字型数据)

dd 重复的次数 dup (重复的双字数据)

dup是一个十分有用的操作符

比如我们要定义一个容量为 200 个字节的栈段,如果不用dup,则必须用这样的格式:

stack segment

dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

stack ends

当然,读者可以用dd,使程序变得简短一些,但是如果要求定义一个容量为1000字节或10000字节的呢?

如果没有dup,定义部分的程序就变得太长了

有了dup就可以轻松解决。如下:

stack segment

db  200  dup (0)

stack ends

视频下载
技术, IT技术, 汇编语言, 视频教程



                                                    风险提示及免责条款

市场有风险,投资需谨慎。本文不构成个人投资建议,也未考虑到个别用户特殊的投资目标、财务状况或需要。用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部