4 汇编语言程序设计
表达式中的运算符和操作符在 x86 汇编语言中的用法。
表达式
表达式是由常数、变量、操作符和运算符组合而成的计算公式。
运算符类型
- 算术运算符:
- (加)、-(减)、*(乘)、/(除)、MOD(取模)
- 这些用于基本的数学运算。
- 逻辑运算符:
- AND(与)、OR(或)、XOR(异或)、NOT(非)
- 用于逻辑运算,如按位与、或、非等。
- 关系运算符:
- EQ(等于)、NE(不等于)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)
- 用于比较两个值。当比较成立时,结果为全1(通常是FFFFH),否则为0。
操作符类型
- 分析运算符:
- OFFSET:返回变量或标号的偏移量(地址的低16位)。常用于将内存地址加载到寄存器中。
- 示例:
MOV SI, OFFSET BUF
(将BUF
的偏移量存入SI
寄存器)
- 示例:
- SEG:返回变量或标号所在段的基址。常用于将段地址加载到寄存器中。
- 示例:
MOV AX, SEG BUF
(将BUF
所在段的基址存入AX
)
- 示例:
- TYPE:返回变量或标号的数据类型对应的大小。
- 示例:
MOV CX, TYPE BUF
(假设BUF
是字节类型,CX
中会存储 1)
- 示例:
- LENGTH:返回数组或重复定义的变量个数。
- 示例:
MOV CX, LENGTH BUF
(如果BUF
是定义为DUP
操作符的变量,该指令会返回变量的个数)
- 示例:
- SIZE:返回变量占用的字节总数。
- 示例:
MOV CX, SIZE BUF
(返回BUF
所占的总字节数)
- 示例:
- OFFSET:返回变量或标号的偏移量(地址的低16位)。常用于将内存地址加载到寄存器中。
- 合成运算符:
- PTR:强制将一个表达式转换为指定的类型。常用于操作指针或内存地址。
- 示例:
MOV BYTE PTR [SI], 200
(将 200 存入SI
指定的内存地址处,强制按字节存储)
- 示例:
- PTR:强制将一个表达式转换为指定的类型。常用于操作指针或内存地址。
简单例子
假设我们有一个内存地址 BUF
,需要将它的偏移量加载到 SI
,并把它所在段的段基址加载到 AX
。接着,我们强制把 SI
指向的地址处的数据视为字节并存入值 200
。
MOV SI, OFFSET BUF ; 获取 BUF 的偏移量到 SI
MOV AX, SEG BUF ; 获取 BUF 段基址到 AX
MOV BYTE PTR [SI], 200 ; 将 200 写入 SI 指定的内存地址(按字节操作)