Lecture 3. 汇编语言 Part2:寻址模式与指令格式
寻址模式
许多汇编指令都需要 运算数(operand)。这个运算数可能以字面量的形式体现在代码中,也在一个寄存器当中,也可能是在由地址字面量指定的位置,或者是表示指针的寄存器指向的位置。CPU 去寻找这个数据的方式叫做 寻址模式(addressing mode)。
寻址模式有七种,前四种最为重要。
※立即寻址,Immediate addressing
运算数以 字面量 形式写在指令里面,如 mov ax, 10,这里的运算数也称作 立即数。
※寄存器寻址,Register Addressing
指运算数保存在某个通用寄存器当中,如 mov ax, bx。
寄存器的访问是在 CPU 内部的,非常非常快,不需要寻址。
※直接寻址,Direct Addressing
比如 mov ax, Count,就把 data 段当中的变量 Count 作为操作数。
实际上,变量 Count 在汇编器的眼里,只不过是对应数据所在的地址罢了。所以相当于把 Count 所在地址的值赋给 ax
如果要指定其他的段,可以写作 mov ax, ES:Count,即表示在额外段上的内容。
※寄存器间接寻址,Register Indirect Addressing
相对于直接寻址(把偏移地址直接以字面量的形式写在指令当中),寄存器间接寻址是 把偏移地址存在寄存器(通常是索引寄存器 BX,BP,SI 或 DI)当中。如果是 BP,那对应的段就是栈段,否则就是数据段。
这种寻址方式的写法,跟高级语言当中的数组比较类似:
mov ax, [bx]表示ax = array[bx]mov [bx], ax表示array[bx] = ax
寄存器相对寻址,Register Indirect with Displacement
课件当中没有提到
基址加变址寻址,Register Indirect with base and register
类似于寄存器间接寻址,地址是基址寄存器(BX、BP)与变址寄存器(SI、DI)的直接求和。
如 mov ax, [bx][SI],相当于高级语言当中的 ax = array[bx + SI]
相对基址加变址寻址,Register Indirect with base and index and constant
相对于上面使用两个寄存器的基址加变址寻址,这种寻址不仅使用两个寄存器,还使用一个常量(字面量)。
如 mov ax, Count[bx][SI] 相当于高级语言的 ax = array[Count + bx + SI]
指令格式
8086 上的指令,至少有两个字节(16 位)。最高的六位表示 opcode,接下来十位表示 D,W,MOD,REG,R/M 信息。

- OPCODE,表示哪一条指令
- D,表示方向(direction),是 from 寄存器(D=0),还是 to 寄存器(D=1)
- W,表示操作的是字(D=0)还是字节(D=1),一个 字(word) 是两个字节
- Reg,三位数据,表示哪一个寄存器
- MOD,是 mode 缩写,表示寻址模式
- R/M,也与寻址模式相关,是寄存器还是内存
寄存器编号

寻址模式
由 MOD 和 R/M 配合指定。其中 MOD 指定寻址模式或 offset 信息,R/M 表示寄存器。
MOD 取值:
- 00:立即寻址 或 寄存器间接寻址 或 基址加变址寻址
- 01:相对基址加变址寻址,八位
- 10:相对基址加变址寻址,十六位
- 11:寄存器寻址模式

示例
mov SP, BX 的二进制指令是:
| opcode | D | W | Mod | Reg | R/M |
|---|---|---|---|---|---|
| 100010 | 1 | 1 | 11 | 100 | 011 |
mov | to 寄存器 | 字 | 寄存器寻址模式 | 到 SP 寄存器 | 从 BX 寄存器 |
ASCII 码表
控制字符(0~31)
不可打印,用于控制打印机等外围设备
| DEC | HEX | Symbol | Description |
|---|---|---|---|
| 0 | 0 | NUL | Null character |
| 1 | 1 | SOH | Start of Heading |
| 2 | 2 | STX | Start of Text |
| 3 | 3 | ETX | End of Text |
| 4 | 4 | EOT | End of Transmission |
| 5 | 5 | ENQ | Enquiry |
| 6 | 6 | ACK | Acknowledge |
| 7 | 7 | BEL | Bell, Alert |
| 8 | 8 | BS | Backspace |
| 9 | 9 | HT | 水平制表,Horizontal Tab |
| 10 | 0A | LF | 换行,Line Feed |
| 11 | 0B | VT | Vertical Tabulation |
| 12 | 0C | FF | Form Feed |
| 13 | 0D | CR | 回车,Carriage Return |
| 14 | 0E | SO | Shift Out |
| 15 | 0F | SI | Shift In |
| 16 | 10 | DLE | Data Link Escape |
| 17 | 11 | DC1 | Device Control One (XON) |
| 18 | 12 | DC2 | Device Control Two |
| 19 | 13 | DC3 | Device Control Three (XOFF) |
| 20 | 14 | DC4 | Device Control Four |
| 21 | 15 | NAK | Negative Acknowledge |
| 22 | 16 | SYN | Synchronous Idle |
| 23 | 17 | ETB | End of Transmission Block |
| 24 | 18 | CAN | Cancel |
| 25 | 19 | EM | End of medium |
| 26 | 1A | SUB | Substitute |
| 27 | 1B | ESC | 退出,ESC,Escape |
| 28 | 1C | FS | File Separator |
| 29 | 1D | GS | Group Separator |
| 30 | 1E | RS | Record Separator |
| 31 | 1F | US | Unit Separator |
通用可打印字符(32~127)
对于各种 ASCII 码表的变体,32~127 这个范围内的可打印字符都是通用的。表中省略了阿拉伯数字和大小写字母。
| DEC | HEX | Symbol | Description |
|---|---|---|---|
| 32 | 20 | SP | 空格,Space |
| 33 | 21 | ! | 感叹号,Exclamation mark |
| 34 | 22 | " | 双引号,Double quotes (or speech marks) |
| 35 | 23 | # | 井号,Number sign |
| 36 | 24 | $ | 美元符号,Dollar |
| 37 | 25 | % | 百分号,Per cent sign |
| 38 | 26 | & | 与符号,Ampersand |
| 39 | 27 | ' | 单引号,Single quote |
| 40 | 28 | ( | 左括号,Open parenthesis (or open bracket) |
| 41 | 29 | ) | 右括号,Close parenthesis (or close bracket) |
| 42 | 2A | * | 星号,Asterisk |
| 43 | 2B | + | 加号,Plus |
| 44 | 2C | , | 逗号,Comma |
| 45 | 2D | - | 横线(减号),Hyphen-minus |
| 46 | 2E | . | 点,Period, dot or full stop |
| 47 | 2F | / | 斜杠,Slash or divide |
| 58 | 3A | : | 冒号,Colon |
| 59 | 3B | ; | 分号,Semicolon |
| 60 | 3C | < | 小于,Less than (or open angled bracket) |
| 61 | 3D | = | 等于,Equals |
| 62 | 3E | > | 大于,Greater than (or close angled bracket) |
| 63 | 3F | ? | 问号,Question mark |
| 64 | 40 | @ | at 符号,At sign |
| 91 | 5B | [ | 左方括号,Opening bracket |
| 92 | 5C | \ | 反斜杠,Backslash |
| 93 | 5D | ] | 右方括号,Closing bracket |
| 94 | 5E | ^ | 幂号,Caret - circumflex |
| 95 | 5F | _ | 下划线,Underscore |
| 96 | 60 | ` | 重音号,Grave accent |
| 123 | 7B | { | 左花括号,Opening brace |
| 124 | 7C | | | 竖线,Vertical bar |
| 125 | 7D | } | 右花括号,Closing brace |
| 126 | 7E | ~ | 波浪线,Equivalency sign - tilde |
| 127 | 7F | DEL | 删除,Delete |
重要字符
- 回车(Carriage Return,CR),是 13,编程语言用
\r表示,表示回到行首 - 换行(Line Feed,LF),是 10,编程语言用
\n表示 - 退出(Escape,ESC),是 27,被用于许多输出设备,标志着开始一个转义字符序列。几十年前 ESC 键用来做这个事情,但是现在基本没有了。
汇编指示符
