杨季文主编的《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等指令实现如下程序片段的功能相关推荐

  1. 018-JL,JNGE JLE,JNG JG,JNLE JGE,JNL带符号条件转移指令小结

    l  条件转移指令JG(>  时转移) l  条件转移指令JNLE(<=时不转移)   l  标志寄存器PSW 标志寄存器PSW(程序状态字寄存器PSW)    标志寄存器PSW是一个16 ...

  2. 【汇编语言与计算机系统结构笔记07】条件码,比较、测试、条件跳转与条件转移指令,结合微体系结构与流水的说明

    本次笔记内容: 08.控制流-1 文章目录 条件码 基于add的CF, ZF, SF, OF 比较(Compare)指令 测试(Test)指令 读取条件码(SetX)指令 例子 拓展:流水设计与微体系 ...

  3. 汇编语言——条件转移指令

    标志寄存器PSW 标志寄存器PSW(程序状态字寄存器PSW)    标志寄存器PSW是一个16为的寄存器.它反映了CPU运算的状态特征并且存放某些控制标志.8086使用了16位中的9位,包括6个状态标 ...

  4. 条件转移指令(Transfer Conditionally)

    功能 根据标志寄存器中一个(或多个)标志位来决定是否需要转移. 分类 基于无符号数的条件转移指令 基于有符号数的条件转移指令 基于特殊算术标志位的条件转移指令 基于无符号数的条件转移指令 指令助忆符 ...

  5. 【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:// ...

  6. 标志寄存器PSW和汇编条件转移指令解释

    标志寄存器PSW 标志寄存器PSW(程序状态字寄存器PSW)    标志寄存器PSW是一个16为的寄存器.它反映了CPU运算的状态特征并且存放某些控制标志.8086使用了16位中的9位,包括6个状态标 ...

  7. 汇编语言随笔(9)-实验11(用条件转移指令来编写子程序)

    编写一个子程序,将包含任意字符.以0结尾的字符串中的小写字母转变为大写字母 子程序名称:letterc      参数:ds:si指向字符串首地址. 因为字符串中包含有任意字符,所以不能采用and操作 ...

  8. 汇编语言随笔(3)-条件转移指令和标志寄存器

    标志寄存器 标志寄存器通常具有以下三种作用:       1,用来存储相关指令的某些执行效果       2,用来为CPU执行相关指令提供行为依据       3,用来控制CPU的相关工作方式     ...

  9. 汇编中的条件转移指令

    条件转移指令可以根据某种条件,决定是否修改偏移地址.下面通过一段代码学习一下. 上面程序的功能是:统计data段中数值为8的字节的个数,用ax保存结果.data段定义了8个数,每个数占一个字节. cm ...

  10. 汇编:JCXZ条件转移指令

    jcxz =  j:jmp  cx:cx寄存器  z:zero(当cx寄存器中的值为0时,进行跳转) jcxz指令与loop指令正好相反. loop指令:当cx寄存器的值不等于0时,才进行跳转. 所有 ...

最新文章

  1. SQL with NUll处理,Join系列,between,in对比exists以及少量题目
  2. zabbix自动发现oracle表空间并监控其使用率
  3. 手把手指导centos7中安装python3
  4. SpringMVC之context-dispatcher.xml,了解基本的控制器
  5. ubuntu分屏软件_Ubuntu 17.10安装终端分屏:Terminator终端终结者
  6. 北京内推 | 京东推荐招聘内容推荐研发工程师(2022届校招)
  7. php答题评分,Thinkphp 答题 评语
  8. linux中软件包管理
  9. Linux下C++的多线程编程---(转载)
  10. rabbitmq 消息长度_Spring Boot教程(29) – RabbitMQ必备基础
  11. bdc注意清空bdcdata【否则bdc可能…
  12. JavaScript 基础一
  13. asp.net core 系列之并发冲突
  14. Dev-cpp5.4.0安装及下载
  15. 计算机视觉教程2-8:你知道图像背景虚化效果的原理吗?(附代码)
  16. 电驴瘫痪网友纷纷“哀悼” 官网称线路故障10日恢复
  17. 关于Vuex的基本使用
  18. 如何禁止搜索引擎收录WordPress站点某个分类的文章?
  19. C++求最大与最小值
  20. 基础IO —— Linux

热门文章

  1. Nginx二级域名代理二级目录
  2. WordPress中用户头像不显示,如何解决
  3. java实现excel转pdf_java实现excel转pdf(poi+itext)
  4. php 统计一个月工作日,php – 使用strtotime在一个月内获得第一个工作日
  5. 【网络安全】信息收集 CDN绕过方法
  6. Docker核心技术(一):镜像与容器
  7. 键值数据库的基本架构
  8. 290页11万字数字农业农村项目规划建设方案2022
  9. 逻辑上的“谬误”真的是我们应该所认为的错误吗?
  10. 物联网linux系统设计,Ostro:面向物联网优化的基于 Linux的开源操作系统