通用寄存器
数据寄存器 AX CX DX BX
AX=ABCDH 高八位AH–ABH 低八位 AL–CDH
基本指令
nop 空指令
mov
MOV指令是数据传送指令,用于将一个数据从源地址传送到目标地址,其特点是不破坏源地址单元的内容。add 加 格式 ADD OPRD1,OPRD2 结果储存在OPRD1中
sub 减 同上
ps:低位加减不影响高位 后缀h或H表示16进制 16进制从00-FF 00-1=FF FF+1=00
物理地址=段地址*10H+偏移地址 段地址CS 偏移地址IP
8086为16位CPU,地址总线20位,最大FFFFF
DS
mov ax,[bx] 将bx地址中的数赋给ax
栈
push
push ax 把ax放入栈中
ESP指向当前栈点
pop
pop ax 把ax出栈
SS堆栈段 SP堆栈指针
内存寻址方式
mov ax,[bx]
ax=[ds*10H+bx]
loop
循环指令,循环次数由计数寄存器CX指定。是否执行循环体的判断指令在循环体之后,所以,至少执行1次循环体,即至少循环1次。执行LOOP指令时,CPU自动将CX的值减1,若CX=0,则结束循环;否则,重复执行循环体。
loop指令等价于C的do…while结构:
cx = 循环次数;
do {
// 循环体
cx–;
} while (cx);
结构:
1 start: mov ax, 2
2 mov cx, 11
3 s: add ax, ax
4 loop s
and , or 指令
and 与 &
or 或 |
xor 异或 ^
not 非 ~
###内存寻址方式
BP:基数指针寄存器 和堆栈指针SP联合使用,作为SP的校准
(1)在8086CPU中只有这四个寄存器可以在[…]中进行内存单元的寻址。
比如,下面的指令都是正确的:
mov ax,[bx]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp]
mov ax,[bp+si]
mov ax,[bp+di]
而下面都是错误的:
mov ax,[cx]
mov ax,[ax]
mov ax,[dx]
mov ax,[ds]
(2).在[…]中,这四个寄存器可以单独出现,或者只能以四种组合出现:bx和si、bx和di、bp和si、bp和di。
比如下面都是正确的
mov ax,[bx]
mov ax,[si]
mov ax,[di]
mov ax,[bp]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp+si]
mpv ax,[bp+di]
mov ax,[bx+si+idata]
mov ax,[bx+si+idata]
mov ax,[bp+si+idata]
mov ax,[bp+di+idata]
下面就是错误的
mov ax,[bx+bp]
mov ax,[si+di]
(3)只要在[….]中使用寄存器bp,而指令汇总没有显示给出段地址,段地址就默认在ss中。
比如下面的指令。
mov ax,[bp] 含义:(ax)=((ss)*16+(bp))
mov ax,[bp+idata] 含义:(ax)=((ss)*16+(bp)+idata)
mov ax,[bp+si] 含义:(ax)=((ss)*16+(bp)+(si))
mov ax,[bp+si+idata] 含义:(ax)=((ss)*16+(bp)+(si)+idata)
跳转指令和指令跳转原理
jmp指令
jmp 地址 跳转到地址
call指令
ret指令
mul指令
MUL AB
乘法指令的功能是将A和B中两个无符号8位二进制数相乘,所得的16位积的低8位存于A中,高8位存于B中。如果乘积大于256,即高位B不为0,则OV置1;否则OV清0,CY总是清0。
例如:设(A)=50H(80),(B)=0A0H(160)
若执行MUL AB,
则执行结果为:
乘积为3200H(12800),
(A)=00H,(B)=32H,(OV)=1,(CY)=0
####div指令
A / B A是被除数,B是除数
除数B有 8位和16位两种,保存在一个reg寄存器里 或是内存单元中。
被除数A 默认存放在AX中(16位以内) 或
AX和DX中(32位,DX存放高16位,AX存放低16位)
结果: 如果除数B是8位,那么除法的结果AL保存商,AH保存余数,
如果除数B是16位,那么除法的结果 AX保存商,DX保存余数。
公式如下:
1: div byte ptr ds:[0]
含义:(al)= (ax)/((ds)\*16+0) 的商
(ah) = (ax/(ds)\*16+0) 的余数
2:div word ptr es:[0]
含义:(ax) = [(dx)\*10000H+(ax)] / ((es)\*16+0)的商
(dx) = [(dx)\*10000H+(ax)] / ((es)\*16+0)的余数
3:div byte ptr [bx+si+8]
含义:(al) = (ax) / ((ds)\*16+(bx)+(si)+8) 的商
(ah) = (ax) / ((ds)\*16+(bx)+(si)+8) 的余数
4:div word ptr [bx+si+8]
含义:(ax) = [(dx)\*10000h+(ax)] / ((ds)\*16+(bx)+(si)+8) 的商
(dx) = [(dx)\*10000h+(ax)] / ((ds)\*16+(bx)+(si)+8) 的余数