汇编语言全梳理(精简版)
寄存器一览
- 通用寄存器
- ax,bx,cx,dx,(ah,al,bh,bl,ch,cl,dh,dl)
- sp,bp,si,di
- 指令寄存器
- ip
- 标志寄存器
- FR
- 段寄存器
- cs,ds,ss,es
mov
指令 | 示例 |
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 ax, 'a':处理字符
- mov ax, [bx + 1]:可用作数组操作
- mov ax, [bx + si]
- mov ax, [bx + si + 1]
- mov word ptr [0],1:指定长度为一个字
- mov byte ptr ds:[0], 1:指定长度为一个字节
add / sub
格式同 mov 一样
mul
计算:其中一个乘数放在 al 或 ax 中,另一个看指令
- mul reg
- mul 内存单元
结果:8位相乘结果放在 ax 中,16位相乘结果放在(高位dx 地位ax)中
div
- div 寄存器
- div 内存单元
除数为 8 位
ax | dx | ||
ah | al | ||
计算时 | 被除数全部 16 位 | ||
结果 | 商 | 余数 |
除数为 16 位
ax | dx | ||
计算时 | 被除数低 16 位 | 被除数高 16 位 | |
结果 | 商 | 余数 |
寻址方式总结
push / pop
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 表示将标志寄存器的值压栈和出栈
loop
mov ax, 2 mov cx, 11 s: add ax, ax loop s
loop s 表示:
- cx = cx - 1
- 如果 cx 为 0 则继续执行下面的指令
- 如果 cx 不为 0 则跳转到标号 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
and / or
- and al, 10110010B:逻辑与
- or al, 10110010B:逻辑或
db dw dd dup
- db:定义字节型数据
- dw:定义字型数据
- dd:定义双字型数据
- dup
- db 3 dup (0) 相当于 db 0,0,0
- db 3 dup (1,2) 相当于 db 1,2,1,2,1,2
跳转指令
jump 类型
- jump short 标号:根据相对位移跳转 IP = IP + 8 位位移
- jump near ptr 标号:IP = IP + 16 位位移
- jump far ptr 标号:CS = 标号所在段的段地址;IP = 标号在段中的偏移地址
- jump 16位reg:转移地址在寄存器中 IP = (reg)
- jump word ptr 内存:IP = (内存)
- jump dword ptr 内存:CS = (内存+2);IP = (内存)
- jcxz 标号:(cx) == 0 时,(IP) = (IP) + 8 位位移
call 和 ret / iret 类型
- ret:形象解释相当于 pop IP
- (IP) = ((ss) * 16 + (sp))
- (sp) = (sp) + 2
- retf:形象解释相当于 pop IP;pop CS
- (IP) = ((ss) * 16 + (sp))
- (sp) = (sp) + 2
- (CS) = ((ss) * 16 + (sp))
- (sp) = (sp) + 2
- iret:形象解释相当于 pop IP;pop CS;popf
- call 标号:形象解释相当于 push IP;jmp near ptr 标号
- (sp) = (sp) - 2
- ((ss) * 16 + (sp)) = (IP)
- (IP) = (IP) + 16 位位移
- call far ptr 标号:形象解释相当于 push CS;push IP;jmp near ptr 标号
- call 16位reg:形象解释相当于 push IP;jmp 16位reg
- call word ptr 内存单元:形象解释相当于 push IP;jmp word ptr
子程序标准模板
子程序中使用的寄存器入栈
子程序内容
子程序中使用的寄存器出栈
返回(ret、retf)
rep movsb
- 传送的源地址:ds:si
- 传送的目的地址:es:di
- 传输长度:cs
- 传输方向:cld 为正向
端口读取
- in al, 20h
- out 20h, al
如 CMOS 有两个端口,70h 是地址端口,71h 是数据端口,所以要读取 CMOS 某存储单元处(2)的数据,就要
mov al, 2 out 70h, al in al, 71h
公众号 - 低并发编程
![](https://images.cnblogs.com/cnblogs_com/flashsun/1878561/o_201113062734%E5%85%AC%E4%BC%97%E5%8F%B7%E4%BA%8C%E7%BB%B4%E7%A0%81.jpg)