汇编语言 CMP指令
CMP(比较)指令执行从目的操作数中减去源操作数的隐含减法操作,并且不修改任何操作数。
指令格式:
CMP 目的操作数, 源操作数
标志位 当实际的减法发生时,CMP指令按照计算结果修改溢出、符号、零、进位、辅助进位和奇偶标志位。如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系如下表所示:
CMP结果 | ZF | CF |
---|---|---|
目的操作数 < 源操作数 | 0 | 1 |
目的操作数 > 源操作数 | 0 | 0 |
目的操作数 = 源操作数 | 1 | 0 |
如果比较的是两个有符号数,则符号标志位、零标志位和溢出标志位表示的两个操作数之间的关系如下表所示:
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 = bx | ZF = 1 | 相等 |
ax != bx | ZF = 0 | 不相等 |
ax < bx | CF = 1 | 小于 |
ax >= bx | CF = 0 | 大于等于 |
ax > bx | CF = 0 并且 ZF = 0 | 大于 |
ax <= bx | CF = 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 | 不相等跳转 |
JCXZ | CX = 0 跳转 |
JECXZ | ECX = 0 跳转 |
JRCXZ | RCX = 0 跳转(64模式) |
基于有符号数比较的跳转
助记符 | 说明 |
---|---|
JG | 大于跳转 |
JL | 小于跳转 |
JNLE | 不小于或等于跳转 |
JNGE | 不大于活等于跳转 |
JGE | 大于或等于跳转 |
JLE | 小于或等于跳转 |
JNL | 不小于跳转 |
JNG | 不大于跳转 |
基于进位和零标志位的跳转
助记符 | 说明 |
---|---|
JC | 进位跳转(进位标志位置1) |
JNC | 无进位跳转(进位标志位清零) |
JZ | 为零跳转(零标志位置1) |
JNZ | 非零跳转(零标志位清零) |
汇编语言 CMP指令相关推荐
- 汇编语言--cmp指令
cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果.cmp指令执行后,将对标志寄存器产生影响. 其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果. cmp指令格式:cmp 操作对象 ...
- linux汇编语言cmp,汇编语言中cmp指令用法笔记与总结
这篇文章主要介绍了汇编语言中cmp指令用法,结合实例形式总结分析了汇编语言cmp指令基本功能.使用方法及操作注意事项,需要的朋友可以参考下 本文实例讲述了汇编语言中cmp指令用法.分享给大家供大家参考 ...
- 汇编语言-中括号-mov指令-cmp指令-lea指令
文章目录 1.汇编语言中"[]"的用法 2.mov指令中用到"[]" 3.cmp指令中用到"[]" 4.lea指令 5.test指令 其实& ...
- [汇编] 关于补码和汇编语言的cmp指令
文章目录 复习背景 分析"三码" 反码 补码 引出问题 问题背景下,CF与OF的深入 解决:回到cmp 附赠(debug模式查看标志寄存器) 复习背景 事情是这样的:cmp指令配合 ...
- 浮点数不能全等比较吗php,汇编语言FCOM指令:比较浮点数值
浮点数不能使用 CMP 指令进行比较,因为后者是通过整数减法来执行比较的.取而代之,必须使用 FCOM 指令. 执行 FCOM 指令后,还需要采取特殊步骤,然后再使用逻辑 IF 语句中的条件跳转指令( ...
- 汇编语言cmp的问题
汇编语言cmp 今天,期末复习写了一个简单的比较大小程序,然后我发现在进行了一次cmp指令之后,出现了,cmp比较出错的问题.代码如下 DATA SEGMENTDATA0 DB 9,3,5,7MAX ...
- 嵌入式cmp指令的判断标志位_ARM汇编指令集
ARM处理器的指令集可以分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.加载/存储指令.协处理器指令和异常产生指令6大指令. 一.跳转指令 跳转指令用于实现程序流程的跳转,在ARM程序中 ...
- 汇编语言常用指令汇总(持续更新)
汇编语言常用指令汇总(持续更新) 通用数据传送指令 累加器专用指令 有效地址送寄存器指令 标志寄存器传送指令 加法指令 减法指令 乘法指令 除法指令 逻辑指令 移位指令 通用数据传送指令 MOV(Mo ...
- 计算机cmp代表什么意思,CMP指令
CMP指令是由美国斯坦福大学提出的,英文名称是Chip multiprocessors,翻译成中文就是单芯片多处理器,也指多核心其思想是将大规模并行处理器中的SMP(对称多处理器)集成到同一芯片内,各 ...
最新文章
- R语言glmnet交叉验证选择(alpha、lambda)拟合最优elastic回归模型:弹性网络(elasticNet)模型选择最优的alpha值、模型最优的lambda值,最终模型的拟合与评估
- go语言调用python_Golang中调用Python3
- 修改build:gradle版本
- 微软官方大秀DX12:性能暴涨50%
- python的argparse模块parse_known_args()方法的使用
- netty java_GitHub - leihuazhe/Java11-Netty-Demo: 基于Java11 构建的 netty 服务端客户端 模块化例子...
- ELK logstash的grok 自带的正则匹配、自定义正则 使用
- python:数组和列表相互转化
- Chrome浏览器查看Axure原型图文件,提示Axure RP Extension for Chrome
- 不要等到双十一,MathType公式编辑器提前降价!
- 计算机等级考试数据库三级模拟题7
- IE浏览器下载文件中文文件名乱码问题解决
- python爬取付费漫画_Python爬虫---爬取腾讯动漫全站漫画
- 易基因|RNA m7G甲基化测序(m7G-MeRIP-seq)
- python爬取美女_Python爬取高颜值美女(爬虫+人脸检测+颜值检测)附学习教程
- 【CTF】【渗透】【msf】三、绕过杀毒软件技巧
- No Feign Client for loadBalancing defined.错误
- 试论软件的可靠性及其保证
- 棱镜门事件将唤起用户对个人隐私的关注和重视
- 征婚网站php免费源码,php交友网站系统正式版php征婚网站模板