1. 总线
总线分为地址总线, 数据总线和控制总线.
-
n根地址总线可以寻址 \$2^n\$个内存单元.
-
n根数据总线可以一次性传输 \$n/8\$个字节的数据.
-
控制总线的宽度决定了CPU对外部器件的控制能力.
2. CPU
2.1. 内存地址
对于16位CPU, 物理地址 = 段地址 * 16 + 偏移地址.
一个段的长度最大为64KB(偏移地址数量).
2.2. 寄存器
2.2.2. 段寄存器
提供内存单元的段地址
CS DS SS ES
8086CPU不支持将数据直接送入到段寄存器, 只能送入一个数据寄存器/内存空间的值. 段寄存器的值可以送入到数据寄存器/内存空间中. |
2.2.3. 指令指针寄存器
保存下一条将要指定的指令地址.
IP
-
jmp <cs>:<ip>.
段间偏移
jmp FFFFH,3
-
jmp <ip>.
段内偏移
jmp ax
2.3. 指令执行流程
-
CPU从 \$CS*16+IP\$ 中读取指令, 读取到的指令放入指令缓冲器.
-
IP+=读取到的指令长度.
-
执行指令.
-
重复步骤1.
CS初始值0xFFFFH, IP初始值0x0000H,内存单元0xFFFF0H保存第一条要被执行的指令地址.
2.4. 栈寄存器
SS:SP指向栈顶元素, push和pop指令执行时, CPU从SS和SP中得到栈顶地址.
3. 指令
3.1. 伪指令
assume cs:demo ;伪指令, 将demo的段地址送入cs
demo segment
mov ax,0
demo ends
end
3.3. loop
CPU执行loop指令的时候,要进行两步操作:
. (cx) = (cx) - 1
. 判断cx中的值,如果不为0则转至标号处执行程序, 如果为0则向下执行.
assume cs:code
code segment
mov ax,2
mov cx,11
s: add ax,ax
loop s
mov ax,4c00H
int 21H
code ends
end
3.4. 逻辑指令
and ax,10000000B ;后面7位置为0
or ax,10000000B ;最高位置为1
3.5. 转移指令
-
无条件转移指令
-
条件转移指令
-
循环指令
-
过程
-
中断
3.7. 定义重复数据
-
dd 重复次数 dup (重复数据)
dd 3 dup (0) === dd 0,0,0
dd 3 dup (0,1,2) === dd 0,1,2,0,1,2,0,1,2
dd 3 dup ('abc','ABC') === dd 'abcABCabcABCabcABC'
4. 寻址方式
-
直接寻址
-
[idata]
-
-
寄存器间接寻址
-
[bx]
-
[si]
-
[di]
-
[bp]
-
-
寄存器相对寻址
-
[bx+idata]
-
[si+idata]
-
[di+idata]
-
[bp+idata]
-
-
基址变址寻址
-
[bx+si]
-
[bx+di]
-
[bp+si]
-
[bp+di]
-
-
相对基址变址寻址
-
[bx+si+idata]
-
[bx+di+idata]
-
[bp+si+idata]
-
[bp+di+idata]
-