处理的数据在什么地方?
要处理的数据有多长?
这两个问题,在机器指令中必须给以明确或隐含的说明,否则计算机无法进行工作
定义描述性符号:reg和sreg
reg表示一个寄存器,包括:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di
sreg表示一个段寄存器,包括:ds、ss、cs、es
bx、si、di和bp
在
8086CPU中,只用这4个寄存器可以用在[ ]中来进行内存单元的寻址在
[ ]中,这4个寄存器可以单个出现,或只以4种组合出现bx和sibx和dibp和sibp和di
只要在
[ ]中使用寄存器bp,而指令中没有显性给出段地址,段地址就默认在ss中
机器指令处理的数据在什么地方
绝大部分机器指令都是进行数据处理的指令,处理大致分为3类:读取、写入、运算
指令在执行前,所要处理的数据可以在3个地方:CPU内部、内存、端口
汇编语言中数据位置的表达
立即数(
idata)对于直接包含在机器指令中的数据(执行前在
CPU的指令缓冲器)称为立即数,在汇编指令中直接给出寄存器
指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名
段地址(
SA)和偏移地址(EA)指令要处理的数据在内存中,在汇编指令中可用
[ ]的格式给出EA,SA在某个段寄存器中存放段地址的寄存器默认在
ds或ss中,也可以显性给出
寻址方式
当数据存放在内存中时,可以使用多种方式给定内存单元的偏移地址,这种定位内存单元的方法一般称为寻址方式

指令要处理的数据有多长
8086CPU的指令,可以处理两种尺寸的数据,byte和word
在机器指令中要指明,指令进行的是字操作还是字节操作
通过寄存器指明要处理的数据的尺寸
使用
ax等寄存器时,表示进行的是字操作在没有寄存器名存在的情况下,用操作符
X ptr指明内存单元的长度,X在汇编指令中可以是word或byte用
word ptr指明了指令访问的内存单元是一个字单元mov word ptr ds:[0],1inc word ptr [bx]inc word ptr ds:[0]add word ptr [bx],2用
byte ptr指明了指令访问的内存单元是一个字节单元mov byte ptr ds:[0],1inc byte ptr [bx]inc byte ptr ds:[0]add byte ptr [bx],2在没有寄存器参与的内存单元访问指令中,用
word ptr或byte ptr显性的指明所要访问的内存单元的长度是很必要的。否则,CPU无法得知所要访问的单元是字单元,还是字节单元
其他方法
有些指令默认了访问的是字单元还是字节单元。如:
push指令只进行字操作
寻址方式的综合应用
记录更改
原纪录:
1 | 公司名称:DEC |

新记录:
1 | 公司名称:DEC |
汇编程序
1 | mov ax,seg |
用bx定位整个结构体,用idata定位结构体中的某一个数据项,用si定位数组项中的每个元素。为此,汇编语言提供了更为贴切的书写方式:[bx].idata、[bx].idata[si]
div指令
div是除法指令
除数:有8位和16位两种,在一个
reg或内存单元中被除数:默认放在
ax或dx和ax中若除数为8位,被除数则为16位,默认在
ax中存放若除数为16位,被除数则为32位,则在
dx和ax中存放,dx存放高16位,ax存放低16位结果:
若除数为8位,则
al存储除法操作的商,ah存储除法操作的余数若除数为16位,则
ax存储除法操作的商,dx存储除法操作的余数
格式:div reg、div 内存单元
例:
-
1
2
3
4div byte ptr ds:[0]
(al)=(ax)/((ds)*16+0)的商
(ah)=(ax)/((ds)*16+0)的余数除数存储在
ds:[0]中,除数8位,则被除数16位,存储在ax中;al存储除法操作的商,ah存储除法操作的余数 -
1
2
3
4div word ptr es:[0]
(ax)=[(dx)*10000H+(ax)]/((es)*16+0)的商
(dx)=[(dx)*10000H+(ax)]/((es)*16+0)的余数除数存储在
es:[0]中,除数16位,被除数32位,dx存放被除数高16位,ax存放被除数低16位;ax存储除法操作的商,dx存储除法操作的余数 -
1
2
3
4div byte ptr [bx+si+8]
(al)=(ax)/((ds)*16+(bx)+(si)+8)的商
(ah)=(ax)/((ds)*16+(bx)+(si)+8)的余数 -
1
2
3
4div 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(多于16位),不能使用
ax寄存器存放,使用dx和ax一起存放除数100小于255,可以使用一个8位寄存器存放。但因被除数是32位的,除数应为16位,所以应使用一个16位寄存器来存放除数100
1 | mov dx,1 ;对dx赋值被除数高16位 |
伪指令dd
db用来定义字节型数据
dw用来定义字型数据
dd用来定义dword(double word双字)型数据
编程实现,第一个数据除以第二个数据,结果存在第三个数据的存储单元中
1 | data segment |
分析:dd定义第一个数据,为双字型数据,32位,将第一个数据存储在dx和ax中
1 | mov ax,data |
dup
由编译器识别处理的操作符
同db、dw、dd等数据定义伪指令配合使用,用来进行数据的重复
格式:
db 重复的次数 dup (重复的字节型数据)dw 重复的次数 dup (重复的字型数据)dd 重复的次数 dup (重复的双字型数据)
例:
db 3 dup (0)定义3个字节,值为0,相当于
db 0,0,0db 3 dup (0,1,2)定义9个字节,值为0、1、2、0、1、2、0、1、2,相当于
db 0,1,2,0,1,2,0,1,2db 3 dup ('abc','ABC')定义了18个字节,值是
abcABCabcABCabcABC,相当于db 'abcABCabcABCabcABC'
当定义大容量的数据段或者栈段时,使用dup可以使程序简短
定义一个200个字节的栈段
1 | stack segment |