1、内存中字的存储
CPU 中,用 16 位寄存器来存储一个字,高 8 位放在高位字节,低 8 位放在低字节。比如我们从 0 地址开始存放 20000,如下图所示,在图中用 0 和 1 两个内存单元来存储 20000(4E20H), 0 和 1 这两个单元可以看做一个起始地址为 0 的字单元,则数据 4E20H 的低位字节放在 0 号单元中,高位字节存放在 1 号单元中。

2、mov、add、sub 指令
mov 指令有以下几种形式
mov 寄存器,数据 如:mov ax,6
mov 寄存器,寄存器 如:mov ax,bx
mov 寄存器,内存单元 如:mov ax,[0]
mov 内存单元,寄存器 如:mov [0],ax
mov 段寄存器,寄存器 如:mov ds,ax
注:mov 内存单元,内存单元 如:mov [0],[1] 这是错误的写法,mov 指令不能用内存地址直接对内存地址赋值
3、栈
栈是一种具有特殊的访问方式的存储空间,遵循后进先出的规则。8086 CPU 用 SS:SP 指示栈顶的位置,并提供 push 和 pop 指令实现压栈和出栈。push 和 pop 指令有以下几种形式
push 寄存器 push ax 将寄存器 ax 的数据压入栈中
pop 寄存器 pop ax 从栈顶取出数据送入 ax
注:8086 CPU 的压栈和出栈操作都是以字节为单位进行的。
4、loop 指令
英文单词 loop 有循环的意义,显然这个指令和循环有关。loop 指令格式:loop 标号,CPU 执行 loop 指令的时候,要进行两部操作
1. sub cx,1H 先将 cx 减一
2. 判断 cx 中的值,不为零则跳转至标号处执行程序,为零则向下执行。
例:add ax,ax 需要重复执行 10 次
mov cx,10
s: add ax,ax
loop s
5、mul、div 指令
mul 乘法指令
(1)两个相乘的数要么都是 8 位,要么都是 16 位;如果是 8 位,一个存放在 al 中,另一个存放在 8 位的寄存器或者内存字节单元中;如果是 16 位,一个默认值 ax 中,另一个放在 16 位寄存器或内存单元字中。
(2)结果:如果是 8 位乘法,结果默认放在 ax 中;如果是 16 位乘法,结果高位默认在 dx 中,地位在 ax 中。
指令格式:mul 寄存器 如:mul ax
mul 内存单元 如:mul byte ptr ds:[0]
div 除法指令
(1)除数:有 8 位和 16 位两种,在一个寄存器或内存单元中;
(2)被除数:默认放在 ax 或 dx 和 ax 中,如果除数为 8 位,则被除数为 16 位,默认存放在 ax 中,如果除数为 16 位,被除数则为 32 位, dx 存放高 16 位, ax 存放低 16 位。
(3)结果:如果除数为 8 位,则 al 存储除法操作的商, ah 存储除法操作的余数,如果除数为 16 位,则 ax 存储除法操作的商, dx 存储除法操作的余数。
指令格式:div 寄存器 如:div ax
div 内存单元 如:div word ptr ds:[0]
6、伪指令db、dw、dd、dup
db = define byte 定义数据宽度为一个字节
dw = define word 定义数据宽度为一个字
dd = define duble word 定义数据宽度为两个字
dup 是一个操作符,它是配合 db dw dd 等数据伪指令一起使用的,用来数据的重复。
指令格式:db 重复次数 dup(重复的字节型数据)
指令格式:dw 重复次数 dup(重复的字型数据)
指令格式:dd 重复次数 dup(重复的双字型数据)
db 3 dup(0,1,2)
定义了 `9` 个字节,相当于 `db 0,1,2,0,1,2,0,1,2`
7、offset 操作符
操作符 offset 在汇编语言中是由编译器处理的符号,它的功能就是取得标号的偏移地址,比如下面的程序
assume cs:code
codesg segment
start: mov ax,offset start ;相当于 mov ax,0
s: mov ax,offset s ;相当于 mov ax,3
codesg ends
end start
在上面的程序中,offset 操作符取得了标号 start 和 s 的偏移地址 0 和 3,因为第一条指令的长度为 3 个字节,则 s 的偏移地址为 3。
8、转移指令
可以修改 IP 或者同时修改 CS 和 IP 的指令统称为转移指令,概括的讲,转移指令就是可以控制 CPU 执行内存中某处代码的指令。
8086 CPU 的转移行为有以下几类
* 只修改 IP 时,称为段内转移,比如:jmp ax
* 同时修改 CS 和 IP 时,称为段间转移,比如:jmp 1000:10
由于转移指令对 IP 的修改范围不同,段内转移又分为以下两种情况
* 短转移 IP 的修改范围为 -128~127
* 近转移 IP 的修改范围为 -32768~32767
8086 CPU 的转移指令有以下几类
* 无条件转移指令,如:jmp
* 条件转移指令,如:jz
* 过程
* 中断
jmp 指令格式
jmp short 标号 实现段内短转移
jmp near ptr 标号 实现段内近转移
jmp far ptr 标号 实现段间转移,又称为远转移
jmp word ptr 内存单元地址(段内转移)
jmp dword ptr 内存单元地址(段间转移)
功能:从内存单元地址处放着两个字,高地址处的字是转移的目的段地址,低地址处是转移目的偏移地址。
8、call 和 ret 指令
ret 指令用栈中的数据,修改 IP 的内容,从而实现近转移;retf 指令用栈中的数据,修改 CS 和 IP 的内容,从而实现远转移;
CPU 执行 ret 指令时,进行下面 2 步操作
1、(IP) = ((ss)* 16 + (sp))
2、(sp) = (sp) + 2 相当于 pop ip
CPU 执行 retf 指令时,进行下面 4 步操作
1、(IP) = ((ss)* 16 + (sp))
2、(sp) = (sp) + 2 相当于 pop ip
3、(CS) = ((ss)* 16 + (sp))
4、(sp) = (sp) + 2 相当于 pop cs
call 不能实现短转移,除此之外,call 指令实现转移的方法和 jmp 指令的原理相同,主要进行两个步骤
1、将当前的 `IP` 或 `CS` 和 `IP` 压入栈中
2、转移