汇编语言:基于x86处理器-学习笔记-第六章

《汇编语言:基于x86处理器(原书第7版)》
第六章学习笔记

布尔和比较指令

《汇编语言:基于x86处理器(原书第7版)》Page 148

CPU的状态标志

布尔指令影响零标志、进位标志、符号标志、溢出标志和奇偶标志。

  • 操作结果等于 0 时,零标志位置 1。
  • 操作使得目标操作数的最高位有进位时,进位标志位置 1。
  • 符号标志位是目标操作数高位的副本,如果标志位置 1,表示是负数;标志位清 0,表示是正数。(假设 0 为正)
  • 指令产生的结果超出了有符号目的操作数范围时,溢出标志位置 1。
  • 指令使得目标操作数低字节中有偶数个 1 时,奇偶标志位置 1。

AND 指令

AND 指令在两个操作数的对应位之间进行(按位)逻辑与 (AND) 操作,并将结果存放在目标操作数中

1
AND dest, source

下列是被允许的操作数组合,但是立即操作数不能超过 32 位

1
2
3
4
5
AND reg, reg
AND reg, mem
AND reg, imm
AND mem, reg
AND mem, imm

AND 指令总是清除溢出和进位标志位,并根据目标操作数的值来修改符号标志位、零标志位和奇偶标志位。

OR 指令

OR指令在两个操作数的对应位之间进行(按位)逻辑或 (OR) 操作,并将结果存放在目标操作数中。

1
OR dest, source

操作数组合与 AND 指令相同。

OR 指令总是清除溢出标志和进位标志。它根据目的操作数的值修改符号标志、零标志、奇偶标志。

XOR 指令

指令在每对操作数的对应数据之间执行异或 (XOR) 操作,格式与 AND 指令相同。

XOR 指令总是清除溢出标志和进位标志,它依据目的操作数的值修改符号标志、零标志和奇偶标志。

NOT 指令

NOT 指令将一个操作数中的所有数据位取反,得到的结果成为该操作数的反码。该指令允许下面的操作数据类型:

1
2
NOT reg
NOT mem

NOT 指令不影响任何状态标志。

TEST 指令

TEST 指令在两个操作数的对应数据位之间执行隐式的 AND 操作,并相应设置标志位。

TEST 指令和 AND 指令之间的唯一区别在于 TEST 指令不会修改目的操作数

TEST 指令的操作数格式与 AND 相同。

该指令在测试操作数某些位是否被设置时特别有用。

TEST 指令总是清除溢出和进位标志位,其修改符号标志位、零标志位和奇偶标志位的方法与 AND 指令相同。

从下面的数据集例子中,可以推断只有当所有测试位都清 0 时,零标志位才置 1(本例中的0000 1001称为位掩码。):

image

CMP 指令

CMP(比较)指令执行从目的操作数中减去源操作数的隐含减法操作,并且不修改任何操作数:

1
CMP dest, source

当实际的减法发生时,CMP指令按照计算结果修改溢出、符号、零、进位、辅助进位和奇偶标志位。

如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系如下图所示:

如果比较的是两个有符号数,则符号标志位、零标志位和溢出标志位表示的两个操作数之间的关系如下图所示:

CMP 指令是创建条件逻辑结构的有效工具。IF 语句在汇编语言中等价于在 CMP 指令后跟一条条件跳转指令。

设置和清除单个 CPU 状态标志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
test al, 0     ; 零标志位置 1
and al, 0 ; 零标志位置 1
or al, 1 ; 零标志位清零

or al, 80h ; 符号标志位置 1
and al, 7Fh ; 符号标志位清零

stc ; 进位标志位置 1
clc ; 进位标志位清零

mov al, 7Fh ; AL = +127
inc al ; AL = 80h (-128), OF = 1, 溢出标志位置 1

or eax, 0 ; 溢出标志位清零

习题整理


下列语句中,有语法错误的是:(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
2
3
4
5
if (op1 == op2)
{
X = 1;
Y = 2;
}
1
2
3
4
5
6
7
    mov eax, op1
cmp eax, op2 ; op1 == op2 ?
jne L1 ; False : Skip To L1
mov X, 1 ; True : X = 1
mov Y, 2 ; Y = 1
L1: .
.

WHILE 语句

《汇编语言:基于x86处理器(原书第7版)》Page 168

C++ 代码翻译为汇编代码示例:

1
2
3
4
5
while (val < val2)
{
val1++;
val2--;
}
1
2
3
4
5
6
7
8
9
    mov eax, val1       ; eax = val1
beginWhile:
cmp eax, val2 ; if not (val1 < val2)
jnl endWhile ; 退出循环
inc eax ; val1++
dec val2 ; val2--
jmp beginWhile ; 重复循环
endWhile:
mov val1, eax ; val1 = eax

汇编语言:基于x86处理器-学习笔记-第六章
https://luoyuy.top/posts/aa0ae44a7053/
作者
LuoYu-Ying
发布于
2023年1月2日
许可协议