汇编语言:基于x86处理器-学习笔记-第六章
第六章学习笔记
布尔和比较指令
《汇编语言:基于x86处理器(原书第7版)》Page 148
CPU的状态标志
布尔指令影响零标志、进位标志、符号标志、溢出标志和奇偶标志。
- 操作结果等于 0 时,零标志位置 1。
- 操作使得目标操作数的最高位有进位时,进位标志位置 1。
- 符号标志位是目标操作数高位的副本,如果标志位置 1,表示是负数;标志位清 0,表示是正数。(假设 0 为正)
- 指令产生的结果超出了有符号目的操作数范围时,溢出标志位置 1。
- 指令使得目标操作数低字节中有偶数个 1 时,奇偶标志位置 1。
AND 指令
AND 指令在两个操作数的对应位之间进行(按位)逻辑与 (AND) 操作,并将结果存放在目标操作数中:
1 |
|
下列是被允许的操作数组合,但是立即操作数不能超过 32 位:
1 |
|
AND 指令总是清除溢出和进位标志位,并根据目标操作数的值来修改符号标志位、零标志位和奇偶标志位。
OR 指令
OR指令在两个操作数的对应位之间进行(按位)逻辑或 (OR) 操作,并将结果存放在目标操作数中。
1 |
|
操作数组合与 AND 指令相同。
OR 指令总是清除溢出标志和进位标志。它根据目的操作数的值修改符号标志、零标志、奇偶标志。
XOR 指令
指令在每对操作数的对应数据之间执行异或 (XOR) 操作,格式与 AND 指令相同。
XOR 指令总是清除溢出标志和进位标志,它依据目的操作数的值修改符号标志、零标志和奇偶标志。
NOT 指令
NOT 指令将一个操作数中的所有数据位取反,得到的结果成为该操作数的反码。该指令允许下面的操作数据类型:
1 |
|
NOT 指令不影响任何状态标志。
TEST 指令
TEST 指令在两个操作数的对应数据位之间执行隐式的 AND 操作,并相应设置标志位。
TEST 指令和 AND 指令之间的唯一区别在于 TEST 指令不会修改目的操作数。
TEST 指令的操作数格式与 AND 相同。
该指令在测试操作数某些位是否被设置时特别有用。
TEST 指令总是清除溢出和进位标志位,其修改符号标志位、零标志位和奇偶标志位的方法与 AND 指令相同。
从下面的数据集例子中,可以推断只有当所有测试位都清 0 时,零标志位才置 1(本例中的0000 1001称为位掩码。):
CMP 指令
CMP(比较)指令执行从目的操作数中减去源操作数的隐含减法操作,并且不修改任何操作数:
1 |
|
当实际的减法发生时,CMP指令按照计算结果修改溢出、符号、零、进位、辅助进位和奇偶标志位。
如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系如下图所示:
如果比较的是两个有符号数,则符号标志位、零标志位和溢出标志位表示的两个操作数之间的关系如下图所示:
CMP 指令是创建条件逻辑结构的有效工具。IF 语句在汇编语言中等价于在 CMP 指令后跟一条条件跳转指令。
设置和清除单个 CPU 状态标志
1 |
|
习题整理
下列语句中,有语法错误的是:(C)
A. mov eax, arrayD[esi*4]
B. popfd
C. cmp val1, val2
D. rep stosb
CMP 指令两个操作数不能都为立即数。
条件跳转
《汇编语言:基于x86处理器(原书第7版)》Page 156
Jcond 指令
条件跳转指令在标志条件为真时分支跳转到新的目的标号处,如果条件标志为假,那么执行紧跟在跳转跳转指令之后的指令。格式如下:
$$
Jcond\space\space destination
$$
格式中的 cond 指的是一个标志条件,用来表示一个或多个标志的状态。例如:
CPU 状态标志位最常见的设置方法是通过算术运算、比较和布尔运算指令。条件跳转指令评估标志位状态,利用它们来决定是否发生跳转。
限制:MASM 在默认情况下要求跳转的目的地址在当前的过程之内,为了突破这种限制,可以声明一个全局标号(标号后面跟 ::
)。
基于特定的标志值的跳转指令
基于恒等性比较的跳转指令
$$
CMP \space\space leftOp,\space rightOp
$$
JE 指令和 JZ 指令是等价的,JNZ 指令和 JNE 指令是等价的。
基于无符号数比较的跳转指令
基于有符号数比较的跳转指令
程序示例
《汇编语言:基于x86处理器(原书第7版)》Page 160
习题整理
条件转移指令中相等跳转的指令是:(C)
A. JZ
B. JNZ
C. JE
D. JNE
JE 指令和 JZ 指令是等价的。
条件循环指令
《汇编语言:基于x86处理器(原书第7版)》Page 163
LOOPZ 和 LOOPE 指令
ECX 大于 0,并且零标志位置 1 则循环。
$$
LOOPZ\space\space destination
$$
$$
LOOPE\space\space destination
$$
LOOPNZ 和 LOOPNE 指令
ECX 大于 0,并且零标志位为 0 则循环。
$$
LOOPNZ\space\space distination
$$
$$
LOOPNE\space\space distination
$$
条件结构
IF 语句
《汇编语言:基于x86处理器(原书第7版)》Page 165
C++ 代码翻译为汇编代码示例:
1 |
|
1 |
|
WHILE 语句
《汇编语言:基于x86处理器(原书第7版)》Page 168
C++ 代码翻译为汇编代码示例:
1 |
|
1 |
|