汇编语言(十)——条件判断指令

2023-05-16

首先了解按位指令,这里使用的技术也可以用于操作硬件设备控制位,实现通信协议以及加密数据,

操作说明
AND源操作数和目的操作数进行逻辑与操作
OR源操作数和目的操作数进行逻辑或操作
XOR源操作数和目的操作数进行逻辑异或操作
NOT对目标操作数进行逻辑非操作
TEST源操作数和目的操作数进行逻辑与操作,并适当地设置 CPU 标志位

 

布尔指令影响零标志位、进位标志位、符号标志位、溢出标志位和奇偶标志位。下面简单回顾一下这些标志位的含义:

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

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

CMP destination,source

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

 

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

CMP结果ZFCF
目的操作数 < 源操作数01
目的操作数 > 源操作数00
目的操作数 = 源操作数1 

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

CMP结果标志位
目的操作数 < 源操作数SF ≠ OF
目的操作数 > 源操作数SF=OF
目的操作数 = 源操作数ZF=1

置位和清除零标志位、符号标志位、进位标志位和溢出标志位有几种方法:(1)要将零标志位置 1,就把操作数与 0 进行 TEST 或 AND 操作;要将零标志位清零,就把操作数与 1 进行 OR 操作,TEST 指令不修改目的操作数,而 AND 指令则会修改目的操作数。若要符号标志位置 1,将操作数的最高位和 1 进行 OR 操作;若要清除符号标志位,则将操作数最高位和 0 进行 AND 操作。(2)若要进位标志位置 1,用 STC 指令;清除进位标志位,用 CLC 指令.若要溢出标志位置 1,就把两个正数相加使之产生负的和数;若要清除溢出标志位,则将操作数和 0 进行 OR 操作。

当状态标志条件为真时,条件跳转指令就分支到目标标号。否则,当标志位条件为假时,立即执行条件跳转后面的指令。语法如下所示:

Jcond destination

cond 是指确定一个或多个标志位状态的标志位条件。CPU 状态标志位最常见的设置方法是通过算术运算、比较和布尔运算指令。条件跳转指令评估标志位状态,利用它们来决定是否发生跳转。下面是基于进位和零标志位的例子:

JC

进位跳转(进位标志位置 1)

JNC

无进位跳转(进位标志位清零)

JZ

为零跳转(零标志位置 1)

JNZ

非零跳转(零标志位清零)

x86 指令集包含大量的条件跳转指令。它们能比较有符号和无符号整数,并根据单个 CPU 标志位的值来执行操作。条件跳转指令可以分为四个类型:

  • 基于特定标志位的值跳转
  • 基于两数是否相等,或是否等于(E)CX 的值跳转
  • 基于无符号操作数的比较跳转
  • 基于有符号操作数的比较跳转

LOOPZ(为零跳转)指令的工作和 LOOP 指令相同,只是有一个附加条件:为零控制转向目的标号,零标志位必须置 1。指令语法如下:

LOOPZ destination

LOOPE(相等跳转)指令相当于 LOOPZ 它们有相同的操作码。这两条指令执行如下任务:

ECX = ECX - 1
if ECX > 0 and ZF = 1, jump to destination

否则,不发生跳转,并将控制传递到下一条指令。LOOPZ 和 LOOPE 不影响任何状态标志位。32 位模式下,ECX 是循环计数器;64 位模式下,RCX 是循环计数器。

LOOPNZ(非零跳转)指令与 LOOPZ 相对应。当 ECX 中无符号数值大于零(减 1 操作之后)且零标志位等于零时,继续循环。指令语法如下:

LOOPNZ destination

LOOPNE(不等跳转)指令相当于 LOOPNZ 它们有相同的操作码。这两条指令执行如 下任务:

ECX = ECX - 1
if ECX > 0 and ZF = 0, jump to destination

否则,不发生跳转,并将控制传递到下一条指令。

表驱动选择是用查表来代替多路选择结构的一种方法。使用这种方法,需要新建一个表,表中包含查询值和标号或过程的偏移量,然后必须用循环来检索这个表。当有大量比较操作时,这个方法最有效。

有限状态机(FSM)是一个根据输入改变状态的机器或程序。用图表示 FSM 相当简明, 下图中的矩形(或圆形)称为节点,节点之间带箭头的线段称为边(或弧)。上图给出了一个简单的例子。每个节点代表一个程序状态,每个边代表从一个状态到另一个状态的转换。一个节点被指定为初始状态,在图中用一个输入箭头指出。其余的状态可以用数字或字母来标示。一个或多个状态可以指定为终止状态,用粗框矩形表示。终止状态表示程序无出错的结束状态。FSM 是一种被称为有向图的更一般结构的特例。

简单的有限状态机

.IF、.ELSE、.ELSEIF 和 .ENDIF 伪指令使得程序员易于对多分支逻辑进行编码。它们让汇编器在后台生成 CMP 和条件跳转指令,ELSEIF 和 .ELSE 是可选的,而 .IF 和 .ENDIF 则是必需的。

除了用 CMP 和条件跳转指令外,.REPEAT 和 .WHILE 伪指令还提供了另一种方法来编写循环。.REPEAT 伪指令执行循环体,.WHILE 伪指令显示数值 1 到 10。循环之前,计数器寄存器 (EAX) 被初始化为 0。之后,循环体内的第一条语句将 EAX 加 1。当 EAX 等于 10 时,.WHILE 伪指令将分支到循环体外。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汇编语言(十)——条件判断指令 的相关文章

  • 汇编语言,and、or指令

    and 和 or指令 and指令 xff0c 作用按位与运算 mov ax 1011 1100b mov bx 1100 1011b and ax bx ax的结果为 xff1a 1000 1000 or指令 xff0c 作用 xff1a
  • 蜂鸣器(汇编语言)

    蜂鸣器的发声主要需要搞懂两点问题 xff0c 第一 xff0c 如何使用单片机控制蜂鸣器发声 xff1b 第二 xff0c 选择合适的延时时间 如何使用单片机控制蜂鸣器的发声 xff1f 蜂鸣器分为有源和无源 xff0c 本实验采用无源蜂鸣
  • 汇编语言,数据段中,标号前面加不加offset有什么区别?

    data segment string db 40h dup 0 string 1 db 39 Input characters 39 0dh 39 39 data ends 那么 xff0c mov bx string 和 mov bx
  • 汇编语言----mul指令

    mul指令 把操作数与AX相乘 最后存放在AX中 例子 mov ax 4 mov bx 5 mul bx ax 20
  • 内中断

    1 CPU根据中断码如何找到中断处理程序 要定位中断处理程序 就需要找到中断处理程序的段地址和偏移地址 如果根据中断码找到他们 这就引入中断向量表 CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址 2 使用中断类型码找
  • 学习汇编语言MASM笔记1

    关于源程序书写格式 太基础的略去 只记录一些我还不熟悉的内容 参考https wenku baidu com view 7ca70e0ef342336c1eb91a37f111f18582d00c5d html 其他网页的参考以挂上相关连接
  • ret和call的原理

    1 ret 指令用栈中的数据 修改IP的内容 从而实现近转移 CPU执行ret指令时 进行下面两步操作 1 IP ss 16 sp 使用栈顶元素修改IP实现跳转 2 sp sp 2 2 retf 用栈中的数据 修改CS和IP的内容 从而实现
  • DF标志和串移动指令(movsb/movsw)

    1 标志寄存器的第10位DF 方向标志位 在串处理指令中 控制每次操作后si di的增减 DF 0 每次操作后 si di增加 DF 1 每次操作后 si di减小 我们可以用汇编语法描述movsb的功能如下 mov es di byte
  • CPU的标志寄存器

    1 ZF 零标志位 执行指令后结果为0 ZF 1 否则ZF 0 2 PF 奇偶标识位 它记录相关指令执行后 其结果的所有二进制位中1的个数是否为偶数 如果是偶数 PF 1 否则PF 1 3 SF 符号标识位 它记录相关指令执行后 其结果是否
  • 汇编语言(1)——从机器到汇编

    汇编语言 王爽 著 读书笔记 1 汇编语言的出现 最早期出现的计算机 是名副其实的 计算 机 这个机器可以执行一系列特定的指令 即机器指令 而由机器指令构成的集合被称为指令集 也就是我们说的机器语言 机器指令是由一系列的二进制数字0和1构成
  • 对int、iret和栈的深入理解

    我们以一个程序来展开讨论 用7ch中断例程完成loop指令的功能 在屏幕中间显示80个 1 程序框架如下 assume cs code code segment start mov ax 0b800h 向8086CPU显存的地址 mov d
  • ARM汇编指令集——跳转指令、内存传输指令、软中断产生指令、协处理器指令、伪指令、伪操作(如何从底层直接操纵CPU)

    一 跳转指令 完成程序跳转 实质就是对PC操作 赋值 b bl跳转是短跳转 跳转范围 32MB start mov r0 1 mov r1 2 mov r3 3 b func b跳转 不带返回值 mov r4 4 func mov r5 5
  • VMware Workstation 不可恢复错误: (vcpu-0) vcpu-0:VERIFY vmcore/vmm/main/cpuid.c:376 bugNr=1036521

    这个问题的原因有几个 第一个原因就是网上说的要开启BIOS的Interl virtual technology 而我当时开启了之后依然报错 最后找到问题的原因在VMWare Workstation 右键我们的虚拟机 选择最下面的设置 然后注
  • [bx]和loop指令

    1 bx 的含义 bx 表示一个内存单元 它的偏移地址在bx中 比如 mov ax bx 会将一个内存单元的内容送入ax 这个内存单元的长度是2个字节 存放一个字 偏移地址存放在bx中 段地址在ds中 mov al bx 则是移动半个字 2
  • 在dos下使用debug被提示incorrect ms dos version的解决办法

    原创 在dos下使用debug被提示incorrect ms dos version的解决办法 首先可以确定一点 直接使用debug时它是直接在当前目录下寻找的 一旦当前目录下没有debug或debug版本不合适 则会出错 直接在 开始 中
  • 汇编语言 第3版 王爽 检测点答案及详细解析

    第一章 基础知识 检测点1 1 1 1个CPU的寻址能力为8KB 那么它的地址总线的宽度为 13位 2 1KB的存储器有 1024 个存储单元 存储单元的编号从 0 到 1023 3 1KB的存储器可以存储 8192 2 13 个bit 1
  • MOV指令在32位汇编程序和64位汇编程序下的相同与不同之处

    mov指令原则 两个操作数 目标操作数和源操作数 的大小必须相同 两个操作数不能同时为内存操作数 也就是不能内存 到 内存 指令指针寄存器不能作为目标操作数 64位汇编程序下 32位汇编程序和64位汇编程序都依照上面的规则 语法也相同 但如
  • win32汇编语言实现冒泡排序

    1 背景 现在大多数的大规模程序并不是由汇编语言来编写 原因很简单 因为太耗时了 但是汇编语言仍然被广泛运用在配置硬件设备以及优化程序的执行速度和尺寸大小等方面 特别是在逆向工程方面 更需要深入理解与熟练掌握汇编语言 针对现阶段 看汇编基本
  • C++反汇编 利用反汇编分析常见C/C++语句的底层实现(硬核)

    文章目录 赋值操作 if条件判断 指针和引用的实质 跳转函数 两个数字的交换操作 数组的赋值及 858993460数字的由来 总结 本节我们利用反汇编技术来对我们最常见的C语言语句进行解析 C 反汇编技术可以让你更好的理解C C语言的底层含
  • x86 32位机的特权保护

    优先级划分 指令的权限检查和超出权限访问的异常处理等是构成特权保护的基础 本文将试图讲解为大家解决两大问题 win32汇编中为什么找不到中断指令的应用 比如int 7ch windows错误的 蓝屏 是从哪里来的 保护模式下 中断或异常往往

随机推荐

  • Linux下查看服务器各硬件信息

    span class hljs comment 内存 span span class hljs preprocessor free m span span class hljs preprocessor cat proc meminfo s
  • Day2、Hive json_tuple性能比get_json_object更高吗?为什么?

    目录 一 执行过程 二 源码比较 三 实验论证 四 总结 在对离线任务进行优化时 xff0c 一般来说有两种思路 一是参数优化 xff0c 尽量提高CPU 内存利用率 xff0c 或者减少spill率 xff1b 二是SQL优化 xff0c
  • Ubuntu18.04下更改apt源

    任意版本的系统代号 xff1a Ubuntu 12 04 LTS 代号为precise Ubuntu 14 04 LTS 代号为trusty Ubuntu 15 04 代号为vivid Ubuntu 15 10 代号为wily Ubuntu
  • C语言中数的二进制、八进制、十进制以及十六进制表示及输出

    以十进制数163为例 xff1a 二进制的英文是Binary xff0c 简写为B或BIN xff0c 所以163 61 0b10100011 xff08 前面加上 0b 或 0B xff09 八进制的英文是Octal xff0c 简写为O
  • java-字符串数组排序

    问题 43 代码 xff1a 创建一个长度是8的字符串数组 使用8个长度是5的随机字符串初始化这个数组 对这个数组进行排序 xff0c 按照每个字符串的首字母排序 无视大小写 注1 xff1a 不能使用Arrays sort 要自己写 注2
  • python 装饰器

    1 装饰器 装饰器 Decorators 是Python的一个重要部分 简单地说 xff1a 他们是修改其他函数的功能的函数 他们有助于让我们的代码更简短 xff0c 也更Pythonic xff08 Python范儿 xff09 大多数初
  • Java的俩个list之间比较,判断是否一致的方法

    前文 我看了一篇博客 xff0c 是关于判断俩个list的 看完之后我觉得可能并不是很好 结合他的思路 xff0c 我重新整理了一下代码 同时也看了看String中的equals的实现 原文是 xff1a https blog csdn n
  • ARP地址解析过程(同一子网和不同子网)

    人们最熟悉的网络可以说是以太网 xff0c 而且人们都知道 xff0c 每块网卡都有一个编号 xff0c 也就是网卡地址 xff08 称为MAC地址 xff09 xff0c 代表计算机的物理地址 另外 xff0c 网络中的每一台计算机都分配
  • (2)树莓派3B连接隐藏wifi网络

    连接隐藏wifi可以使用nano编辑器打开wpa supplicant配置文件 xff1a sudo nano etc wpa supplicant wpa supplicant conf 在文件底部添加 xff1a network 61
  • 获取本地外网ip的api接口

    开发时偶尔会需要前端传客户端的ip地址 xff0c 以下方法可以获取客户端外网ip 1 新增加载js方法 export const loadScript 61 src 61 gt return new Promise resolve rej
  • Ubuntu 18.04 配置ibus中文拼音输入法

    Ubuntu 18 04系统想安装中文输入法 xff08 利用ibus输入法配置 xff09 只要三步 注意 xff1a 你的Ubuntu需要可以上网 xff01 xff01 xff01 因为要下载一系列安装包 第一步 xff1a 首先需要
  • VMware安装Kali后黑屏 只有左上角光标

    在安装过程中选择安装GRUB引导程序 xff0c 默认是否 xff0c 我们需要选择是
  • vCenter Server目录/storage/core,/storage/log 空间不足问题解决

    概述 xff1a VC是7 0的 xff0c 存储警告 storage core及 storage log目录空间不足 xff1b 且出现VC web管理页面运行缓慢 xff1b 用途概述 storage core xff1a 存储来自vC
  • C#反编译利器--dotPeek

    在开发项目的时候 xff0c 当项目数量变大 xff0c 源代码管理也是一件非常头疼的事 xff0c 如果没有专门的人员来管理代码 xff0c 没有code review机制的话 xff0c 代码很容易乱 xff0c 这就会导致现场的代码与
  • C/C++调用Rust编写的动态库

    目录 C C 43 43 调用Rust编写的动态库一 背景二 解决方案三 测试3 1 正确性检验3 2 内存安全检验 C C 43 43 调用Rust编写的动态库 一 背景 Rust通过大量的编译期检查能够有效避免程序运行时出现的各种内存问
  • 计蒜客习题-班长竞选 最小割 “二选一 方案不同有额外开销”模型

    设源点S xff0c 汇点T 对于所有赞成的人 从S连一条边到他们对应的点上 容量设为1 对于所有反对的人 从他们对应的点上连一条边到T 容量为1 对于所有有朋友 关系的a和b 在他们之间连一条无向边 容量为1 最小割可以用dinic跑出来
  • 百度之星2020 初赛第三场

    Discount Accepts 1432 Submissions 2728 Time Limit 2000 1000 MS Java Others Memory Limit 65536 65536 K Java Others Proble
  • 快速幂取模_C++

    一 题目背景 已知底数a xff0c 指数b和模数mo xff0c 求ans 61 ab mo 二 朴素算法 就是暴力啦 1 void power int a int b int mo 2 long long ans 61 1 3 for
  • python抓取Windows系统内存和CPU占用率

    python抓取Windows系统内存和CPU占用率 主要参考来源 xff1a https www jianshu com p 23c2a518019a 1 源代码 cpuget py from time import sleep strf
  • 汇编语言(十)——条件判断指令

    首先了解按位指令 xff0c 这里使用的技术也可以用于操作硬件设备控制位 xff0c 实现通信协议以及加密数据 xff0c 操作说明AND源操作数和目的操作数进行逻辑与操作OR源操作数和目的操作数进行逻辑或操作XOR源操作数和目的操作数进行