汇编语言学习笔记
一、概论
8086,8088 构架
1. 寄存器
8 个通用寄存器
- AX [AH, AL] - 累加器
- BX [BH, BL] - 基址寄存器
- CX [CH, CL] - 计数器
- DX [DH, DL] - 数据寄存器
- SP - 堆栈指针
- BP - 基址指针
- SI - 源地址寄存器
- DI - 目的地址寄存器
2 个控制寄存器
- IP - 指令指针 【用户不能直接访问 IP】
- F - 状态标志寄存器 (溢出、方向、符号、进位、零、奇偶...)
4 个段寄存器
- CS - 代码段寄存器
- DS - 数据段寄存器
- SS - 堆栈段寄存器
- ES - 附加段寄存器
2. 存储器
数据长度
类型名称 | 定义符号 | 类型值 |
---|---|---|
字节变量 | DB | 1 |
字变量 | DW | 2 |
双字变量 | DD | 4 |
长节变量 | DQ | 8 |
10 字节变量 | DT | 10 |
近标号 | NEAR | -1(FFH) |
远标号 | FAR | -2(FEH) |
far 是远调用;near 是近调用。
near 只能在段内被调用,所以调用是只需将 ip 进栈;而 far 则可以在段间被调用,所以需要 cs 与 ip 都进栈。
jmp short 标号(转移标号处执行指令) / jmp near ptr 标号 功能:(IP) = (IP)+16 位位移。 实现的是段内近转移。
jmp far ptr 标号 实现的是段间转移(远转移)
数制
- 2 进制 - B
- 10 进制 - D (BCD 码)
- 16 进制 - H
字符
- ASC II 码
二、寻址方式
() - 表示地址内的内容
[] - 直接地址
与数据有关的寻址方式
1. 立即数寻址
MOV ax, 13 ; (ax) ← 13
a. 立即数可以使八位或者十六位
b. 目的寄存器可以是 8 或者 16 位的 通用寄存器 或者 段寄存器
2. 寄存器寻址
MOV ax, bx ; (ax) ← (bx)
3. 存储器寻址
1. 直接寻址 (有效地址 = 基址 + 偏移地址)
MOV ax, [2000H] ; 将存储器 [ds:2000H] 的内容赋值到 ax
MOV ax, es:[2000H] ; 将存储器 [es:2000H] 的内容赋值到 ax
*a. * DS 隐含指定
2. 寄存器间接寻址 (有效地址 = 段寄存器地址 x16 + 寄存器内容)
MOV ax, [bx] ; 将存储器 [(ds)*16 + (bx)] 对应的存储单元的内容送到 ax中
MOV ax, [ss] ; 将存储器 [(bp)*16 + (ss)] 对应的存储单元的内容送到 ax中
a. bx,si,di 所对应的段寄存器为 ds (数据段 )
b. bp 所对应的段寄存器为 ss (堆栈段 ss - 寄存器 bp)
c. 物理地址 = (段寄存器) x 16 + (寄存器) 即段寄存器后面加一个 0,再加上制定寄存器的值为地址
3. 寄存器相对寻址 (有效地址 = 段寄存器地址 x16 + 寄存器内容 + 8/16 位移量)
MOV ax, count[si] ;将存储器[(ds)*16 + count + (si)]对应的存储单元的内容送到 ax 中
MOV ax, count[bp] ;将存储器[(ss)*16 + count + (si)]对应的存储单元的内容送到 ax 中
a. bx,si,di 所对应的段寄存器为 ds (数据段 )
b. bp 所对应的段寄存器为 ss (堆栈段 ss - 寄存器 bp)
4. 基址变址寻址 (有效地址 = 段寄存器地址 x16 + 基址寄存器 + 变址寄存器)
MOV ax, [bx + di] ; (ax) ← mem[(ds)*16 + (bx) + (di)]
MOV ax, [bp][si] ; (ax) ← mem[(ds)*16 + (bp) + (si)]
a. 基址寄存器 bx,bp
b. 变址寄存器 si,di
5. 相对基址变址寻址 (有效地址 = 段寄存器*16 + 基址寄存器 + 编制寄存器 + 位移量)
; (ax) ← mem[mk + (bx) + (si)]
MOV AX, MK[BX][SI]
MOV AX, MK[BX+SI]
MOV AX, [MK+BX+SI]
*a. * DS 隐含指定
转移地址寻址
1. 段内直接转移
1. JMP SHORT OPR
JMP SHORT OPR ; (IP) ← (IP) + 8位位移量
a. 8 位和 16 位位移量由 目标地址 OPR *确定 *
2. JMP NEAR PTR OPR
JMP NEAR PTR OPR ; (IP) ← (IP) + 16位位移量
2. 段内间接转移
1. JMP WORD PTR OPR
JMP ax ; (IP) ← (ax)
JMP WORD PTR TABLE[bx] ; (IP) ← (mem[(ds)*16 + TABLE + (bx)])
a. 有效地址 EA 值由 OPR 的寻址方式确定,可以使用 mem 或 reg
3. 段间直接转移
1. JMP FAR PTR OPR
; (IP) ← OPR的段内偏移地址
; (CS) ← OPR所在段的段地址
JMP FAR PTR NEXT ; NEXT 与 当前指令不在一个段内
4. 段内间接转移
1. JMP DWORD PTR OPR
;(IP) ← (EA)
;(CS) ← (EA+2)
JMP DWORD PTR OPR
a. EA 由 OPR 的寻址方式为存储器寻址方式
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于