数据处理的两个基本问题04 - 零基础入门学习汇编语言41
2011-01-03 01:18
896 查看
第八章:数据处理的两个基本问题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 regdiv 内存单元
现在我们可以用多种方法来表示一个内存单元了。
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。
[codesyntax lang="asm"]
mov dx,1 mov ax,86A1H ;(dx)*10000H+(ax)=100001 mov bx,100 div bx
[/codesyntax]
程序执行后,(ax)=03E8H(即1000),(dx)=1(余数为1)。
大家可自行在Debug中实践。
编程实现2:利用除法指令计算1001/100。
我们首先分析一下被除数1001可用 ax寄存器存放,除数100可用 8位寄存器存放,也就是说,要进行8位的除法。程序如下:
[codesyntax lang="asm"]
mov ax,1001 mov bl,100 div bl
[/codesyntax]
程序执行后,(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程序实现代码
[codesyntax lang="asm"]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字单元中
[/codesyntax]
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
[buy] 获得所有教学视频、课件、源代码等资源打包 [/buy]
[Downlink href='http://kuai.xunlei.com/d/LGMCFPCKREXN']视频下载[/Downlink]
相关文章推荐
- 数据处理的两个基本问题04 - 零基础入门学习汇编语言41
- 数据处理的两个基本问题02 - 零基础入门学习汇编语言39
- 数据处理的两个基本问题02 - 零基础入门学习汇编语言39
- 数据处理的两个基本问题03 - 零基础入门学习汇编语言40
- 数据处理的两个基本问题03 - 零基础入门学习汇编语言40
- 数据处理的两个基本问题01 - 零基础入门学习汇编语言38
- 数据处理的两个基本问题01 - 零基础入门学习汇编语言38
- 数据处理的两个基本问题05 - 零基础入门学习汇编语言42
- 数据处理的两个基本问题05 - 零基础入门学习汇编语言42
- <学习笔记>王爽汇编语言__处理数据的两个基本问题
- 转移指令的原理04 - 零基础入门学习汇编语言46
- 转移指令的原理04 - 零基础入门学习汇编语言46
- 汇编语言入门:数据处理的两个基本问题
- 标志寄存器04 - 零基础入门学习汇编语言57
- 标志寄存器04 - 零基础入门学习汇编语言57
- [BX]和loop指令04 - 零基础入门学习汇编语言26
- 基础知识04 - 零基础入门学习汇编语言04
- 寄存器(CPU工作原理)04 - 零基础入门学习汇编语言09
- [BX]和loop指令04 - 零基础入门学习汇编语言26
- 基础知识04 - 零基础入门学习汇编语言04