汇编语言 CMP指令

article/2025/9/11 23:54:00

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

CMP 目的操作数, 源操作数

标志位 当实际的减法发生时,CMP指令按照计算结果修改溢出、符号、零、进位、辅助进位和奇偶标志位。如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系如下表所示:

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

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

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

CMP指令是创建条件逻辑结构的重要工具。当在条件跳转指令中使用CMP时,汇编语言的执行结果就和IF语句一样。
以下是目的操作数 < 源操作数的举例:

			;	ZF      CF
mov ax, 5
cmp ax, 10	;	0       1

在这里插入图片描述
以下是目的操作数 = 源操作数的举例:

                        ;	ZF      CFmov ax, 1000mov cx, 1000cmp cx, ax  ;   1       0

在这里插入图片描述

以下是目的操作数 > 源操作数的举例:

			   ;ZF      CF
mov ax, 105
cmp ax, 0      ;0       0

在这里插入图片描述
使用CMP指令统计data 段中数值为8的字节个数,用ax保存统计结果。

; 1.编程 统计data 段中数值为8的字节个数,用ax保存统计结果
assume cs:code, ds:data, ss:stackdata segmentdb 8, 11, 8, 1, 8, 5, 63, 38
data endsstack segment stackdb 128 dup(0)
stack endscode segmentstart: mov ax, stackmov ss,axmov sp, 128call init_regcall get_eightmov ax, 4C00Hint 21H;============================================
get_eight:			mov si,0mov cx, 8mov ax, 0getEight:		cmp byte ptr ds:[si], 8jne nextNumberinc ax
nextNumber:		inc siloop getEightret
;===============================================
init_reg:		mov bx, datamov ds, bxretcode endsend start		

在这里插入图片描述
使用 CMP指令 统计data 段中数值大于8的字节个数,用ax保存统计结果

; 2.编程 统计data 段中数值大于8的字节个数,用ax保存统计结果
assume cs:code, ds:data, ss:stackdata segmentdb 8, 11, 8, 12, 8, 5, 63, 38
data endsstack segment stackdb 128 dup(0)
stack endscode segmentstart: mov ax, stackmov ss,axmov sp, 128call init_regcall get_eightmov ax, 4C00Hint 21H;============================================
get_eight:			mov si,0mov cx, 8mov ax, 0getEight:		cmp byte ptr ds:[si], 8jna nextNumber    ; ja >   na <=inc ax
nextNumber:		inc siloop getEightret
;===============================================
init_reg:		mov bx, datamov ds, bxretcode endsend start

在这里插入图片描述

CMP ax, bx修改标志位符号描述
ax = bxZF = 1相等
ax != bxZF = 0不相等
ax < bxCF = 1小于
ax >= bxCF = 0大于等于
ax > bxCF = 0 并且 ZF = 0大于
ax <= bxCF = 1 或者 ZF = 1小于等于

基于有符号的举例:

mov al, 1
mov bl, 2
cmp al, bl  →  推理出来 al < bl
sub al, bl  →  影响标志位        1 - 2 = -1    SF 符号标志位置1
mov al, 22H →    34    34 - (-96) = 140    -128 ~ 127
mov bl, A0H      -96
sub al, bl  →   OF标志位   和 SF标志位     溢出标志位置1    符号标志位置1
mov al, 8AH    -118 - 112   =  - 230  溢出   1A 正数
mov bl, 70H
cmp al, bl           OF = 1  SF  = 0    溢出标志位置1   符号标志位置0

总结:基于有符号比较

设 cmp al, bl
如果 SF = 1  OF = 0
那么 al < bl如果SF = 1 OF =1
那么 al > bl如果 SF = 0 OF = 1     
因为 SF = 0
不等式应该为 al - bl > 0    al > bl        
当OF = 1 成立时,那么
al < bl如果SF = 0 OF = 0    
那么 al - bl > 0 
得到 al > bl

如果因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正。

如果因为溢出导致了实际结果为正,那么逻辑上真正的结果必然为负。

基于无符号数比较的跳转

助记符说明
JB小于跳转
JNB不小于跳转
JNBE不小于或等于跳转
JA大于跳转
JNA不大于跳转
JNAE不大于或等于跳转

基于相等性的跳转

助记符说明
JE相等跳转
JNE不相等跳转
JCXZCX = 0 跳转
JECXZECX = 0 跳转
JRCXZRCX = 0 跳转(64模式)

基于有符号数比较的跳转

助记符说明
JG大于跳转
JL小于跳转
JNLE不小于或等于跳转
JNGE不大于活等于跳转
JGE大于或等于跳转
JLE小于或等于跳转
JNL不小于跳转
JNG不大于跳转

基于进位和零标志位的跳转

助记符说明
JC进位跳转(进位标志位置1)
JNC无进位跳转(进位标志位清零)
JZ为零跳转(零标志位置1)
JNZ非零跳转(零标志位清零)

http://chatgpt.dhexx.cn/article/SZa3m3sf.shtml

相关文章

时钟周期、机器周期、总线周期、指令周期的关系

一、时钟周期 时钟周期由主频决定&#xff0c;是最小的时间单位 也叫节拍、T周期、cpu时钟周期 二、机器周期 cpu完成一项基本操作所需最短时间&#xff0c;用了多个时钟周期 又叫cpu周期 例&#xff1a;取指周期&#xff08;含取指令和分析指令&#xff09;、间址周期、执行…

请说明指令周期、机器周期、时钟周期之间的关系。

一条指令周期包括若干个机器周期&#xff0c;一条机器周期又包括若干个时钟周期&#xff0c;时钟周期即振荡周期。 指令周期&#xff1a;取出一条指令并执行这条指令的时间。一般由若干个机器周期组成&#xff0c;是从取指令、分析指令到执行完所需的全部时间。 机器周期&…

时钟周期、机器周期、指令周期的概念及三者之间的关系;定时器及计数器

时钟周期 时钟周期也称为振荡周期&#xff0c;定义为时钟脉冲的倒数(可以这样来理解&#xff0c;时钟周期就是单片机外接晶振的倒数&#xff0c;例如12M的晶振&#xff0c;它的时间周期就是1/12 us)&#xff0c;是计算机中最基本的、最小的时间单位。 在一个时钟周期内&#xf…

如何理解时钟周期及公式CPU执行时间 = CPU时钟周期数/主频

因为用OneNote制作的&#xff0c;公式复制不过来太麻烦&#xff0c;直接截图了。 下面看一下时钟周期的定义&#xff1a; CPU时钟周期&#xff1a;通常为节拍脉冲或T周期&#xff0c;即主频的倒数&#xff0c;它是CPU中最小的时间单位&#xff0c;每个动作至少需要一个时钟周期…

51/时钟周期、时钟频率、状态周期、机器周期

1.时钟频率是什么&#xff1f; 时钟&#xff1a;顾名思义&#xff0c;时钟以精确和固定的时间间隔&#xff0c;触发电信号&#xff0c;其信号被控制单元用于推进CPU的内部操作。而CPU执行 取指令–解码–执行的速度为时钟速度&#xff08;时钟频率&#xff09;。 在各类CPU当中…

时钟周期,机器周期,指令周期的区别

时钟周期 时钟周期也称为振荡周期&#xff0c;定义为时钟脉冲的倒数&#xff08;时钟周期就是单片机外接晶振的倒数&#xff0c;例如12M的晶振&#xff0c;它的时钟周期就是1/12us&#xff09;&#xff0c;是计算机中的最基本的、最小的时间单位。 在一个时钟周期内&#xff0c…

【嵌入式百科】003——时钟周期、指令周期、机器周期、总线周期

一、时钟周期 时钟周期也称为振荡周期&#xff0c;定义为时钟脉冲的倒数(时钟周期就是单片机外接晶振的倒数&#xff0c;例如12M的晶振&#xff0c;它的时钟周期就是1/12us)&#xff0c;是计算机中的最基本的、最小的时间单位。在一个时钟周期内&#xff0c;CPU仅完成一个最基本…

IC基础知识(十一)时钟周期、状态周期、机器周期、指令周期和总线周期的定义及关系

目录 ​ ​1.时钟周期、振荡周期、节拍周期 2.状态周期 3.机器周期、CPU周期 4.指令周期 5.总线周期 总结 微信公众号 ​1.时钟周期、振荡周期、节拍周期 时钟周期又叫做振荡周期、节拍周期&#xff0c;定义为时钟晶振频率的倒数。时钟周期是计算机中最基本的、最小的时…

CPU时钟周期和时钟频率

就工作方式而言&#xff0c;CPU 分两种&#xff1a;同步 CPU 和异步 CPU。异步 CPU并不常见&#xff0c;用途广泛的是同步 CPU 。 既然是同步 CPU&#xff0c;当然就需要有一个同步机制&#xff0c;或者说要有个“主管”来维护同步状态&#xff0c;不然你做一样&#xff0c;我…

CPU中的指令周期、CPU周期和时钟周期

https://zhuanlan.zhihu.com/p/90829922 1&#xff0c;指令周期 指令周期&#xff1a;是指计算机从取值到执行执行完毕的时间 计算机执行指令的过程可以分为以下三个步骤&#xff1a; Fetch&#xff08;取指&#xff09;&#xff0c;也就是从 PC 寄存器里找到对应的指令地址…

时钟周期和机器周期之间的关系

时钟周期和机器周期之间的关系 时钟周期&#xff08;小&#xff09;机器周期&#xff08;中&#xff09;指令周期 &#xff08;大&#xff09;作用 时钟周期&#xff08;小&#xff09; 时钟周期&#xff1a;单片机时钟控制的基本时间单位。以微秒(μs)作单位。 时钟周期受时…

凸包和凸集

凸集&#xff1a;在欧氏空间中&#xff0c;凸集是对于集合内的每一对点&#xff0c;连接该对点的直线段上的每个点也在该集合内。 凸包&#xff1a;点集Q的凸包&#xff08;convex hull&#xff09;是指一个最小凸多边形&#xff0c;满足Q中的点或者在多边形边上或者在其内。 凸…

凸优化理论(一)深入理解仿射集,凸集,锥等定义及相关证明

文章目录 1&#xff1a;仿射集相关定义与证明2&#xff1a;相关子空间与性质证明3&#xff1a;线性方程组的解集与化零空间4&#xff1a;任意集合构建最小仿射集-仿射包5&#xff1a;凸集相关&#xff1a;凸包-凸组合6&#xff1a;锥 Cone与凸锥 Convex Cone7&#xff1a;概念比…

泛函分析笔记(八) 凸集和凸函数

文章目录 1. 凸集2. 凸函数 1. 凸集 线段&#xff1a; 给定向量空间的两点 a 和 b &#xff0c;集合 [ a , b ] : { x ∈ X ; x λ a ( 1 − λ ) b , 0 ≤ λ ≤ 1 } [a,b]: \{ x\in X; x \lambda a (1-\lambda)b,0\le \lambda \le 1\} [a,b]:{x∈X;xλa(1−λ)b,0≤λ…

【第1章】凸集——几种重要的凸集

凸集——几种重要的凸集 2.几种重要的凸集2.1 超平面与半空间2.2 球和椭球2.3 多面体(关注单纯形)2.4 半正定锥2.5参考 Date: 2020/04/11 Editor:萧潇子&#xff08;Jesse&#xff09; Contact: 1223167600qq.com 2.几种重要的凸集 本节讲述一些重要凸集的概念,首先介绍一些简…

凸集、凸函数及其充分必要条件

凸集的定义&#xff1a; 设集合 D⊂Rn D ⊂ R n &#xff0c;若对于任意点 x,y∈D x , y ∈ D 及实数 α∈[0,1] α ∈ [ 0 , 1 ] &#xff0c;都有 αx(1−α)y∈D α x ( 1 − α ) y ∈ D 则称集合 D D 为凸集。 由凸集的定义可以看出凸集的几何意义,对于非空集合D"…

凸函数与凸集

文章目录 1、凸集2、凸函数 对于《欠定线性系统与正则化》一节中的优化问题&#xff1a; ( P J ) : min ⁡ x J ( x ) s . t . b A x (P_J):\min \limits_{\bf x} J({\bf x})\quad {\rm s.t.} \quad{\bf bAx} (PJ​):xmin​J(x)s.t.bAx 只要 J ( ⋅ ) J(\cdot) J(⋅)为严格凸的…

凸集与凸函数

凸集的定义为&#xff1a; 其几何意义表示为&#xff1a;如果集合C中任意2个元素连线上的点也在集合C中&#xff0c;则C为凸集。其示意图如下所示&#xff1a; 常见的凸集有&#xff1a; n维实数空间&#xff1b;一些范数约束形式的集合&#xff1b;仿射子空间&#xff1b;凸集…

凸组合和凸集

前言 对无人机进行轨迹规划时&#xff0c;需要对可行空间进行数学表示&#xff0c;可行空间通常被表示为凸组合的形式。 结论 在 R n R^n Rn中的m个向量 a 1 , a 2 , a 3 , . . . . . , a m a_1,a_2,a_3,.....,a_m a1​,a2​,a3​,.....,am​的凸组合是它们在n维空间的最小凸…

凸集、凸函数与凸规划

文章目录 1 凸集2 凸函数2.1 凸函数性质2.2 一阶判别公式2.3 二阶判别公式 3 凸规划 1 凸集 设集合 S ⊂ R n S\subset \R^n S⊂Rn&#xff0c;若 S S S中任意两点连线仍属于 S S S&#xff0c;则 S S S称为凸集&#xff0c;即 x 1 λ ( x 2 − x 1 ) ∈ S \bm x_1 \lambda…