Skip to content

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 的二进制指令是:

opcodeDWModRegR/M
1000101111100011
movto 寄存器字寄存器寻址模式到 SP 寄存器从 BX 寄存器

ASCII 码表 ​

控制字符(0~31) ​

不可打印,用于控制打印机等外围设备

DECHEXSymbolDescription
00NULNull character
11SOHStart of Heading
22STXStart of Text
33ETXEnd of Text
44EOTEnd of Transmission
55ENQEnquiry
66ACKAcknowledge
77BELBell, Alert
88BSBackspace
99HT水平制表,Horizontal Tab
100ALF换行,Line Feed
110BVTVertical Tabulation
120CFFForm Feed
130DCR回车,Carriage Return
140ESOShift Out
150FSIShift In
1610DLEData Link Escape
1711DC1Device Control One (XON)
1812DC2Device Control Two
1913DC3Device Control Three (XOFF)
2014DC4Device Control Four
2115NAKNegative Acknowledge
2216SYNSynchronous Idle
2317ETBEnd of Transmission Block
2418CANCancel
2519EMEnd of medium
261ASUBSubstitute
271BESC退出,ESC,Escape
281CFSFile Separator
291DGSGroup Separator
301ERSRecord Separator
311FUSUnit Separator

通用可打印字符(32~127) ​

对于各种 ASCII 码表的变体,32~127 这个范围内的可打印字符都是通用的。表中省略了阿拉伯数字和大小写字母。

DECHEXSymbolDescription
3220SP空格,Space
3321!感叹号,Exclamation mark
3422"双引号,Double quotes (or speech marks)
3523#井号,Number sign
3624$美元符号,Dollar
3725%百分号,Per cent sign
3826&与符号,Ampersand
3927'单引号,Single quote
4028(左括号,Open parenthesis (or open bracket)
4129)右括号,Close parenthesis (or close bracket)
422A*星号,Asterisk
432B+加号,Plus
442C,逗号,Comma
452D-横线(减号),Hyphen-minus
462E.点,Period, dot or full stop
472F/斜杠,Slash or divide
583A:冒号,Colon
593B;分号,Semicolon
603C<小于,Less than (or open angled bracket)
613D=等于,Equals
623E>大于,Greater than (or close angled bracket)
633F?问号,Question mark
6440@at 符号,At sign
915B[左方括号,Opening bracket
925C\反斜杠,Backslash
935D]右方括号,Closing bracket
945E^幂号,Caret - circumflex
955F_下划线,Underscore
9660`重音号,Grave accent
1237B{左花括号,Opening brace
1247C|竖线,Vertical bar
1257D}右花括号,Closing brace
1267E~波浪线,Equivalency sign - tilde
1277FDEL删除,Delete

重要字符 ​

  • 回车(Carriage Return,CR),是 13,编程语言用 \r 表示,表示回到行首
  • 换行(Line Feed,LF),是 10,编程语言用 \n 表示
  • 退出(Escape,ESC),是 27,被用于许多输出设备,标志着开始一个转义字符序列。几十年前 ESC 键用来做这个事情,但是现在基本没有了。

汇编指示符 ​

汇编指示符