请不用条件转移指令JG,JGE,JL,JLE等指令实现如下程序片段的功能
杨季文主编的《80X86汇编语言程序设计教程》的第二章有如下习题:
题2.37 请不用条件转移指令JG、JGE、JL和JLE等指令实现如下程序片段的功能:
CMP AL,BL
JGE OK
XCHG AL,BL
OK: ......
Tarzan前辈的做的答案:
PUSH CX ;CX入栈保存
XOR CX,CX ;使CX异或清零
MOV CH,02H ;将 CX的高八位设置为2,以便后面的减法做借位用
MOV CL,AL ;将AL传送给CX的低八位
MOV BH,0H ;清BX的高八位
SUB CX,BX ;If CH=2, 说明减法没有向高八位产生借位,AL>=BL; If CH=1, 说明低位产生了借位,AL<BL
SHR CX,8 ;将CH数据移动到CL,使CX=2 or 1
LOOP OK ;LOOP指令会将CX内容再次减一,CX=(2-1)时跳转到OK;CX=(1-1)时执行LOOP后的语句
XCHG AL,BL ;即交换AL与BL的值
OK:
POP CX ;恢复CX的内容
......
我认为该答案是错误的。首先,就语法而言,“SHR CX,8”这句就不符合语法。当移位数大于1时,需要先将移位数放进CL中然后再进行移位操作
其次,题意的要求是模拟JGE指令,JGE是处理有符号数的,它的原理是根据SF 异或 OF后的值来判断两数的大小。以上程序只能判断无符号数,对于减数为负数,或者溢出的情况,会出现错误
而DelphiGuy前辈的程序构造非常巧妙,不采用任何条件转移指令和交换指令,完全模拟出JGE原理和功能:
MOV AH,BL;将第二个数BL传送至AH
MOV CH,AL;将第一个数AL传送至CH
MOV CL,0CH ;使CL==12
SUB CH,BL;CH保存两数相减的差
PUSHF;将标志寄存器的数据存入栈中
POP BX;用BX接收出栈的标志寄存器状态数据
ROR BX,CL ;右循环移位12位以后,OF溢出标志正好位于最高位
XOR CH,BH;XOR指令的特点,0和0得0、0和1得1、1和1得0,即(同为0,异为1)
;将差与BH异或运算,这里只关心CH的最高位(符号SF位),BH的最高位(OF标志)
;得到的结果只可能是00000000B或10000000B
AND CH,80H ;把得到的结果与10000000B作与运算,AND指令的特点:0和0得1、0和1得0、1和1得1
;本指令执行后有两种结果,00000000B或者10000000B
SHR CX,CL ; 将CX中的数据逻辑右移12位,得到的结果只可能是0或者8
ROL AX,CL ;AL>=BL(AH)时,移0位,即保持不变;
;当AL<BL时,循环左移8位,这样较大的数始终在AL中,较小的数始终在AH中
MOV BL,AH ;把AH放回BL
附JGE指令原理:
转移条件:sf异或of为0转移说明:大于等于转移 其他说明:有符号数,两个标志位sf和of
标志寄存器:
请不用条件转移指令JG,JGE,JL,JLE等指令实现如下程序片段的功能相关推荐
- 018-JL,JNGE JLE,JNG JG,JNLE JGE,JNL带符号条件转移指令小结
l 条件转移指令JG(> 时转移) l 条件转移指令JNLE(<=时不转移) l 标志寄存器PSW 标志寄存器PSW(程序状态字寄存器PSW) 标志寄存器PSW是一个16 ...
- 【汇编语言与计算机系统结构笔记07】条件码,比较、测试、条件跳转与条件转移指令,结合微体系结构与流水的说明
本次笔记内容: 08.控制流-1 文章目录 条件码 基于add的CF, ZF, SF, OF 比较(Compare)指令 测试(Test)指令 读取条件码(SetX)指令 例子 拓展:流水设计与微体系 ...
- 汇编语言——条件转移指令
标志寄存器PSW 标志寄存器PSW(程序状态字寄存器PSW) 标志寄存器PSW是一个16为的寄存器.它反映了CPU运算的状态特征并且存放某些控制标志.8086使用了16位中的9位,包括6个状态标 ...
- 条件转移指令(Transfer Conditionally)
功能 根据标志寄存器中一个(或多个)标志位来决定是否需要转移. 分类 基于无符号数的条件转移指令 基于有符号数的条件转移指令 基于特殊算术标志位的条件转移指令 基于无符号数的条件转移指令 指令助忆符 ...
- 【debug】汇编跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
汇编跳转指令: JMP.JECXZ.JA.JB.JG.JL.JE.JZ.JS.JC.JO.JP 等 2017年11月12日 15:01:09 zmmycsdn 阅读数 19334 转自:http:// ...
- 标志寄存器PSW和汇编条件转移指令解释
标志寄存器PSW 标志寄存器PSW(程序状态字寄存器PSW) 标志寄存器PSW是一个16为的寄存器.它反映了CPU运算的状态特征并且存放某些控制标志.8086使用了16位中的9位,包括6个状态标 ...
- 汇编语言随笔(9)-实验11(用条件转移指令来编写子程序)
编写一个子程序,将包含任意字符.以0结尾的字符串中的小写字母转变为大写字母 子程序名称:letterc 参数:ds:si指向字符串首地址. 因为字符串中包含有任意字符,所以不能采用and操作 ...
- 汇编语言随笔(3)-条件转移指令和标志寄存器
标志寄存器 标志寄存器通常具有以下三种作用: 1,用来存储相关指令的某些执行效果 2,用来为CPU执行相关指令提供行为依据 3,用来控制CPU的相关工作方式 ...
- 汇编中的条件转移指令
条件转移指令可以根据某种条件,决定是否修改偏移地址.下面通过一段代码学习一下. 上面程序的功能是:统计data段中数值为8的字节的个数,用ax保存结果.data段定义了8个数,每个数占一个字节. cm ...
- 汇编:JCXZ条件转移指令
jcxz = j:jmp cx:cx寄存器 z:zero(当cx寄存器中的值为0时,进行跳转) jcxz指令与loop指令正好相反. loop指令:当cx寄存器的值不等于0时,才进行跳转. 所有 ...
最新文章
- SQL with NUll处理,Join系列,between,in对比exists以及少量题目
- zabbix自动发现oracle表空间并监控其使用率
- 手把手指导centos7中安装python3
- SpringMVC之context-dispatcher.xml,了解基本的控制器
- ubuntu分屏软件_Ubuntu 17.10安装终端分屏:Terminator终端终结者
- 北京内推 | 京东推荐招聘内容推荐研发工程师(2022届校招)
- php答题评分,Thinkphp 答题 评语
- linux中软件包管理
- Linux下C++的多线程编程---(转载)
- rabbitmq 消息长度_Spring Boot教程(29) – RabbitMQ必备基础
- bdc注意清空bdcdata【否则bdc可能…
- JavaScript 基础一
- asp.net core 系列之并发冲突
- Dev-cpp5.4.0安装及下载
- 计算机视觉教程2-8:你知道图像背景虚化效果的原理吗?(附代码)
- 电驴瘫痪网友纷纷“哀悼” 官网称线路故障10日恢复
- 关于Vuex的基本使用
- 如何禁止搜索引擎收录WordPress站点某个分类的文章?
- C++求最大与最小值
- 基础IO —— Linux
热门文章
- Nginx二级域名代理二级目录
- WordPress中用户头像不显示,如何解决
- java实现excel转pdf_java实现excel转pdf(poi+itext)
- php 统计一个月工作日,php – 使用strtotime在一个月内获得第一个工作日
- 【网络安全】信息收集 CDN绕过方法
- Docker核心技术(一):镜像与容器
- 键值数据库的基本架构
- 290页11万字数字农业农村项目规划建设方案2022
- 逻辑上的“谬误”真的是我们应该所认为的错误吗?
- 物联网linux系统设计,Ostro:面向物联网优化的基于 Linux的开源操作系统