两个基本问题:
处理的数据在什么地方?
要处理的数据多长?
计算机是进行数据处理、运算的机器。
描述性符号 reg 寄存器 sreg 段寄存器
reg的集合包括:ax bx cx dx sp bp si di
sreg的集合包括: ds ss cs es
1、bx、si、di、dp
只有这四个寄存器(bx、si、di、dp)可以用于[……]中来表示内存单元的寻址。
在[……]中,4个寄存器只能单独出现或以四种组合出现:bx和si、bx和di、bp和si、bp和di
只要在[……]中使用bp,而指令没有显性的给出段地址,段地址就默认在ss中。ss:堆栈段地址寄存器。
2、机器指令处理的数据所在位置
绝大部分的机器指令都是进行数据处理的指令,处理大致可分为三类:
读取、写入、运算
指令在执行前,所要处理的数据可以在三个地方:
CPU内部、内存、端口
3、汇编语言中数据位置的表达
立即数(idata)
直接包括在机器指令中的数据(执行前在CPU的指令缓存器中)
例:mov ax,1
寄存器
指令要处理的数据在寄存器中。
例:mov ax,bx
段地址(SA)和偏移地址(EA)
指令要处理的数据在内存中。
例:mov ax,[0]
mov ax,ss:[bp]
4、寻址方式
5、指令要处理的数据有多长
8086CPU的指令,可以处理两种尺寸的数据,byte(字节,8位)和word(字型,16位)。
- 通过寄存器指明要处理的数据的尺寸
- 在没有寄存器名存在的情况下,用操作符 X ptr指明内存单元长度,X在汇编指令中可以为word或byte(显性指明)
例:mov word ptr ds:[0],1
mov byte ptr ds:[0],1
3..其他方法
有些指令默认了访问的是字单元还是字节单元
如:push指令 (只进行字操作)
技巧:用[bx+idata+si]方式可以访问结构体中数据
bx定位结构体
idata定位结构体中的某一项
si定位数组项中的每个元素
6、div指令
除法指令。
除数:8位或16位,在寄存器或内存单元中
被除数:(默认)放在AX或DX+AX中
除数 | 被除数 |
8位 | 16位(AX) |
16位 | 32位(DX+AX) |
结果:
运算 | 8位 | 16位 |
商 | AL | AX |
余数 | AH | DX |
格式: div reg(除数)或div 内存单元
例: div byte ptr ds:[0]
含义:(al)=(ax)/((ds)*16+0)的商
(ah)=(ax)/((ds)*16+0)的余数
7、伪指令dd
dd是用来定义dword(double word 双字(32位))型数据。
8、dup
是一个操作符,同db、dw、dd一样,也是由编译器识别处理的符号。
用来进行数据的重复
格式:db 重复次数 dup (重复的数据)
例:db 3 dup (0)
定义了三个字节他们的值都是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