找回密码
 register

QQ登录

只需一步,快速开始

查看: 17|回复: 1

[汇编语言] [零基础入门学习]·41·数据处理的两个基本问题·div指令· 伪指令dd· dup

[复制链接]

[汇编语言] [零基础入门学习]·41·数据处理的两个基本问题·div指令· 伪指令dd· dup

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:94
  • 打卡月天数:17
  • 打卡总奖励:94
  • 最近打卡:2025-01-18 01:28:20
Waylee

主题

0

回帖

1万

积分

仙帝

积分
11929
Waylee 2025-1-16 21:07 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×


8.7 div指令

div是除法指令,使用div做除法的时候应注意以下问题。

  1. 除法:有8位和16位两种,在一个reg或内存单元中。
  2. 被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放在低16位。
  3. 结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数。

格式如下:

div reg
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)]/((es)*16+0)的商
(dx)=[(dx)*10000H+(ax)]/((es)*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)的余数

编程,利用除法指令计算100001/100。

首先分析一下,被除数100001大于65535,不能用ax寄存器存放,所以只能用dx和ax两个寄存器联合存放100001,也就是说要进行16位的除法。除数100小于255,可以在一个8位寄存器中存放,但是,因为被除数是32位的,除数应为16位,所以要用一个16位寄存器来存放除数100。
因为要分别为dx和ax赋100001的高16位值和低16位值,所以应先将100001表示为16进制形式:186A1H。程序如下:

mov dx,1
mov ax,86A1H        ;(dx)*10000H+(ax)=100001
mov bx,100
div bx

程序执行后,(ax)=03E8H(即1000),(dx)=1(余数为1)。读者可自行在Debug中实践。

编程,利用除法指令计算1001/100。
首先分析一下,被除数1001可用ax寄存器存放,除数100可用8位寄存器存放,也就是说,要进行8位的除法。程序如下。

mov ax,1001
mov bl,100
div bl

程序执行后,(al)=0AH(即10),(ah)=1(余数为1)。读者可自行在Debug中实践。

8.8 伪指令dd

前面我们用db和dw定义字节型数据和字型数据。dd是用来定义dword(double word,双字)型数据的。比如:

data segment
    db 1
    dw 1
    dd 1
data ends

在data段中定义了3个数据:
第一个数据01H,在data:0处,占1个字节;
第二个数据位0001H,在data:1处,占1个字;
第三个数据为00000001H,在data:3处,占2个字;

问题8.1

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

data segment
    dd 100001
    dw 100
    dw 0
data ends

思考后看分析。
分析:
data段中的第一个数据是被除数,为dowrd(双字)型,32位,所以在做除法之前,用dx和ax存储。应将data:0字单元中的低16位存储在ax中,data:2字单元的高16位存储在dx。程序如下。

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       ;把商存储在cs:6字单元中

8.9 dup

dup是一个操作符,在汇编语言中通db、dw、dd等一样,也是由编译器识别处理的符号。它是和db、dw、dd等数据定义伪指令配合使用的,用来进行数据的重复。比如:
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
  • 打卡等级:热心大叔
  • 打卡总天数:94
  • 打卡月天数:17
  • 打卡总奖励:94
  • 最近打卡:2025-01-18 01:28:20
楼主
Waylee 楼主

主题

0

回帖

1万

积分

仙帝

积分
11929
Waylee 2025-1-17 12:41 | 显示全部楼层 | Google Chrome | Windows 10

编程,利用除法指令计算100001/100。

assume cs:code

code segment

    start:
            mov dx,1
            mov ax,86A1H        ;(dx)*10000H+(ax)=100001
            mov bx,100
            div bx

            mov ax,4c00h
            int 21h
code ends

end start

编程,利用除法指令计算1001/100

assume cs:code

code segment

    start:
            mov ax,1001
            mov bl,100
            div bl

            mov ax,4c00h
            int 21h
code ends

end start

问题8.1 完整程序

assume cs:code,ds:data

data segment
    dd 100001
    dw 100
    dw 0
data ends

code segment

    start:
            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       ;把商存储在cs:6字单元中

            mov ax,4c00h
            int 21h
code ends

end start
您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |天天打卡

GMT+8, 2025-1-18 09:55 , Processed in 0.108544 second(s), 6 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表