数据处理的两个基本问题
引言
- reg(寄存器)集合:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di;
- sreg(段寄存器)集合:ds、ss、cs、es(扩展段)
8.1 bx、si、di、bp
- 可以用作[bp]
- 四个组合只能如下出现:bx和si、bx和di、bp和si、bp和di
- 如果没有直接给出bp的段地址、段地址默认在ss
8.2机器指令处理的数据所在位置
-
指令执行前,所要处理的数据可以在三个地方:CPU内部、内存、端口
-
idata (立即数)
-
寄存器
-
段地址SA和偏移地址EA
8.3汇编语言中数据位置的表达
- 显性的给出存放段地址的寄存器
- 存放段地址的寄存器是默认的
8.4寻址方式
8.5 指令要处理的数据有多长?
byte---- 8位
word—16位
高位地址指向高字节
通过寄存器名指明要处理的数据的尺寸
操作符X ptr指明内存单元的长度
mov word ptr ds:[0],1 #所以ds:[0]存放的是0001H
mov byte ptr ds:[0],1 #所以ds:[0]存放的是01H
其他方法
- push[1000H]就不用指明访问的是什么数据,因为push指令只进行字操作。
8.6寻址方式的综合应用
8.7div指令
- 除法指令,除数在内存单元或者寄存器,被除数在AX或DX和AX中
除数 | 被除数 |
---|---|
8位 | 16位(AX) |
16位 | 32位(DX+AX) |
除数如果是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)*100000H+(ax)]/((ds)*16+0)的商,(dx)=[(dx)*100000H+(ax)]/((ds)*16+0)的商,
8.8伪指令dd
data segment
db 1
dw 1
dd 1
data ends
在data段中定义了三个数据:
第一个数据为01H,在data:0处,占1个字节;
第二个数据为0001H,在data:1处,占1个字;
第三个数据为00000001H,data:3处,占2个字节;
8.9dup
db 重复的次数 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 3 dup('abc','ABC')#定义18个字节,它们是'abcABCabcABCabcABC'