约定:
用reg表示一个寄存器
sreg表示一个段寄存器 ds ss cs es
reg8 :8位寄存器
reg16: 16位寄存器
mem8:表示字节单元(内存单元)
mem16 :表示字单元(内存单元)
1.概述
2.汇编指令中操作数类型
3.8086中可用于存放内存单元偏移地址的寄存器
4.8086中已学寄存器一览
5.操作数寻址方式
6.汇编运算符ptr
7.数据定义伪指令db/dw/dd和操作符dup
8.无符号除法指令div
9.小结
汇编指令中操作数类型:
常数:cpu内部,指令缓冲器,
寄存器:cpu内部,寄存器
内存单元:cpu外部,内存
8086cpu中已学的寄存器
通用寄存器:AX,BX,CX,DX
变址寄存器:SI,DI
段寄存器:CS,DS,SS,ES
指令指针寄存器:IP
栈指针寄存器:SP
可用于表示内存单元的寄存器
BX,SI,DI,BP
可以单个出现,也可以组合出现
使用BX,SI,DI表示偏移地址时,默认段地址在DS中,可以加前缀es,cs,ss
使用BP,SI,DI表示偏移地址时,默认段地址在SS中,可以加前缀ds,es,cs
注:除此之外的其他寄存器组合都是非法的
寻址方式
① mov ax, [0] ;直接寻址
② mov ax, [bx] ;寄存器间接寻址
③ mov cx, [bx+3] ;寄存器相对寻址
④ mov ax, [bx+si] ;基址变址寻址
⑤ mov ax, [bx+si+3] ;相对基址变址寻址
如何在机器指令中声明进行的是字操作还是字节操作
(1).通过寄存器名指明要处理的数据的尺寸
如:ax,al,ah
(2).在没有寄存器名存在的情况下,用操作符X ptr 指明内存单元的长度,X在汇编指令中可以为word或byte
如:
mov word ptr ds:[0],1
mov word ptr [bx]
mov byte ptr ds:[0],1
mov byte ptr [bx],2
有些指令默认了访问的是字单元还是字节单元,如push只进行字操作
8086CPU提供的如[bx+idata+si]的寻址方式为结构化数据的处理提供了方便
用bx定位整个结构体,用idata定位结构体中的某一个数据项,用si定位数组项中每个元素
可以写成[bx].data,[bx].idata[si]
C语言中结构体
汇编指令:div和mul
无符号除法指令div
无符号乘法指令mul
1.div
格式:div 除数(reg或内存单元)
被除数:默认放在AX或DX和AX中
如果除数为8位,被除数为16位,默认在AX中存放;
如果除数为16位,被除数为32位,DX存放高16位,AX存放低16位
结果:
如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;
如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数
2.mul
格式mul 乘数
如果都为8位,被乘数放在al中,积16位放在ax中
如果都为16位 被乘数放在ax中,积32位 规定在dx:ax
汇编伪指令:db,dw,dd,dup
data segment db 1,2,3 ; 每个数据分配1个字节 dw 1,2 3; 每个数据分配2个字节 dd 1,2,3; 每个数据分配4个字节 data ends
伪指令dup
data segment db 0,0,0,0,0,0,0,0 db 8 dup(0); 预留8个字节单元,每个单元值为0 dd 8 dup(?); 预留8个字节单元,每个单元值未分配 data ends
data segment db 1,2,3,1,2,3,1,2,3 db 3 dup(1,2,3); 等价于前一行 data ends