通用寄存器
指令寄存器
标志寄存器
段寄存器
| 指令 | 示例 |
|---|---|
| mov 寄存器, 数据 | mov ax, 8 |
| mov 寄存器, 寄存器 | mov ax, bx |
| mov 寄存器, 内存 | mov ax, [0] mov ax, [bx] |
| mov 内存, 寄存器 | mov [0], ax mov [bx], ax |
内存地址由 段地址:偏移地址 决定,8086 选择 ds 段寄存器作为默认的段地址
由于段寄存器也是寄存器,除了硬件规定不能直接将数据 mov 到段寄存器之外,其他的和正常寄存器一样
| 指令 | 示例 |
|---|---|
| mov 段寄存器, 寄存器 | mov ds, ax |
| mov 寄存器, 段寄存器 | mov ax, ds |
| mov 段寄存器, 内存 | mov ds, [0] |
| mov 内存, 段寄存器 | mov [0], ds |
变种
格式同 mov 一样
计算:其中一个乘数放在 al 或 ax 中,另一个看指令
结果:8位相乘结果放在 ax 中,16位相乘结果放在(高位dx 地位ax)中
除数为 8 位
|ax|dx|
|:—|:—|:—|
|ah|al|
|计算时|被除数全部 16 位|
|结果|商|余数|
除数为 16 位
|ax|dx|
|:—|:—|—|
|计算时|被除数低 16 位|被除数高 16 位|
|结果|商|余数|
CPU 取 SS:SP 作为栈顶地址,我们可以自己初始化栈顶地址为 10010H
mov ax, 1000H
mov ss, ax
mov sp, 0010H
| 指令 | 步骤 |
|---|---|
| push ax | SP = SP – 2 ax 内容送入栈顶的内存地址 |
| pop ax | 栈顶的内存地址的内容送入 ax SP = SP + 2 |
| push/pop 段寄存器 | 同理 |
| push/pop 内存单元 | 同理 |
另外:pushf 和 popf 表示将标志寄存器的值压栈和出栈
mov ax, 2
mov cx, 11
s: add ax, ax
loop s
loop s 表示:
assume cs:code, ds:data, ss:stack
data segment
dw 0001h, 0002h, ... 000fh
data ends
stack segment
dw 0,0,0,0 ... 0
stack ends
code segment
;定义数据段
mov ax, data mov ds, ax
;定义栈段
mov ax, stack mov ss, ax
mov sp, 20h
...
code ends
end
db:定义字节型数据
dw:定义字型数据
dd:定义双字型数据
dup
jump 类型
call 和 ret / iret 类型
子程序标准模板
子程序中使用的寄存器入栈
子程序内容
子程序中使用的寄存器出栈
返回(ret、retf)
如 CMOS 有两个端口,70h 是地址端口,71h 是数据端口,所以要读取 CMOS 某存储单元处(2)的数据,就要
mov al, 2
out 70h, al
in al, 71h