目录
指令 | 示例 |
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
jump 类型
call 和 ret / iret 类型
子程序标准模板
子程序中使用的寄存器入栈
子程序内容
子程序中使用的寄存器出栈
返回(ret、retf)
如 CMOS 有两个端口,70h 是地址端口,71h 是数据端口,所以要读取 CMOS 某存储单元处(2)的数据,就要
mov al, 2
out 70h, al
in al, 71h