汇编语言原理:语句格式与伪操作详解
立即解锁
发布时间: 2025-08-20 02:12:41 阅读量: 1 订阅数: 4 


计算机架构:软件、编码与硬件的综合探讨
# 汇编语言原理:语句格式与伪操作详解
## 1. 汇编语言语句格式
汇编语言程序由许多语句组成,每个语句是一行或一串 ASCII 字符,分为四个字段,如下图所示:
| 字段 | 说明 |
| ---- | ---- |
| 地址(Address) | 可能包含一个符号作为地址定义,该符号代表存储代码或数据位的内存地址名称 |
| 操作码(Opcode) | 可以是机器操作(mop)、伪操作(pop)或宏调用 |
| 操作数(Operand) | 指定如何定位操作数,可能有零个、一个或多个操作数,用逗号分隔 |
| 注释(Comment) | 可选字段,以分号(;)开头 |
语言采用自由格式,两个字段之间可以用一个或多个空格分隔,字段之间没有固定边界。为了清晰起见,语句之间可以插入空行。汇编语言语句不区分大小写。
### 1.1 符号地址
符号地址有两种类型:可重定位和绝对。
- **绝对符号**:由汇编器转换为指令地址字段中的二进制数,是无需进一步修改的绝对地址。
- **可重定位符号**:转换为代码中的地址,在链接和加载过程中可能会发生进一步变化。
符号定义和符号引用有很大区别:
- **符号定义**:无论地址类型如何,符号必须在语句的操作码字段之前定义。
- **符号引用**:已定义的符号可以在语句的操作数字段中在其定义之前或之后被引用。
#### 1.1.1 符号定义
放在操作码之前的符号是地址定义。每个符号在程序中只能定义一次,如果同一符号被定义多次,汇编器会标记此错误并不生成目标代码。需要强调的是,高级语言语句中引用的符号代表位置的内容,而汇编语言语句中引用的符号代表位置的地址。
以下是一些 MASM 符号定义的示例:
```asm
HUNDRED equ 100 ; equate the absolute symbol HUNDRED to 100 in decimal
opd1 dw 100 ; define a 16-bit word containing the integer 100 in decimal whose address is named opd1.
opd2 dw 255 ; define a 16-bit word containing 255 in decimal whose symbolic address opd2 is 2 bytes greater than opd1.
b0010: sub ax, ax ; ax <- ax - ax; b0010 is the symbolic address or label of the sub instruction.
```
- `equ` 语句将符号 `HUNDRED` 定义为绝对符号,值为十进制的 100。
- `dw` 语句是伪操作,用于生成数据。第一个 `dw` 定义一个 16 位字,值为 100,地址为 `opd1`;第二个 `dw` 定义一个 16 位字,值为 255,地址为 `opd2`,比 `opd1` 大 2 字节。
- `b0010` 是 `sub` 指令的符号地址。
#### 1.1.2 符号引用
如果符号出现在指令的操作数字段中,则是符号地址引用。符号只能定义一次,但可以在程序中多次引用。与高级语言不同,符号引用被转换为代码中的二进制地址,即无符号整数。
以下是一个编码示例:
```asm
mov ax, opd1 ; ax <- M[ds:opd1]
jmp skip010 ; ip <- skip010
...
skip010: jmp skip010 ; ip <- skip010 {infinite loop}
```
- `mov` 指令将内存中名为 `opd1` 的操作数复制到 `AX` 中,执行后 `opd1` 的内容不变。
- `jmp` 指令将控制权转移到操作数字段指定地址的指令。第一个 `jmp` 指令将控制权转移到 `skip010` 处的指令,第二个 `jmp` 指令形成无限循环,用于调试。
### 1.2 地址表达式
在操作数字段中,可以指定地址表达式。例如:
```asm
mov cx, opd1+2 ; cx <- M[ds:opd1+2]; cx contains 255 in decimal or 00ff in hexadecimal.
```
地址表达式 `opd1+2` 告诉汇编器将 2 加到 `opd1` 上,并将和作为偏移量放入代码中。汇编器会在汇编时完成加法运算。执行该指令后,将比 `opd1` 大 2 字节偏移量处的内存内容复制到 `cx` 中。
确定地址表达式地址类型的基本规则如下:
1. 如果绝对地址与可重定位地址相加或相减,结果是可重定位的。
2. 如果绝对地址与绝对地址相加或相减,结果是绝对的。
3. 如果一个可重定位地址减去另一个可重定位地址,结果变为绝对的。
4. 可重定位地址不能与另一个可重定位地址相加,因为这样做没有意义。
大多数汇编器不考虑操作数的长度,对所有地址一视同仁。然而,MASM 会根据操作数的长度(如字节、字或双字)进行类型检查。如果长度属性不兼容,可以使用 `byte ptr` 关键字来覆盖类型检查规则。
以下是一些示例:
```asm
mov byte ptr opd1, cl ; store low order byte
mov byte ptr opd1+1, ch ; store high order byte
```
0
0
复制全文
相关推荐










