当前位置:鱼C工作室 >汇编语言 > 查看文章

标志寄存器05 – 零基础入门学习汇编语言58

第十一章:标志寄存器05

 

让编程改变世界

Change the world by program


 

编程训练

 

编程实现如下功能:如果(ah)=(bh)则(ah)=(ah)+(ah),否则(ah)=(ah)+(bh)。

cmp ah,bh

je s

add ah,bh

jmp short ok

s:      add ah,ah

ok:   ret

 

检测比较结果的条件转移指令

 

虽然 je 的逻辑含义是“相等则转移”,但它进行的操作是,ZF=1时则转移。

“相等则转移”这种逻辑含义,是通过和 cmp 指令配合使用来体现的,因为是cmp 指令为“ZF=1”赋予了“两数相等”的含义。

 

至于究竟在je之前使不使用cmp指令,在于我们的安排。

je检测的是ZF位置,不管je 前面是什么指令,只要CPU执行je指令时,ZF=1,那么就会发生转移。

比如:

mov ax,0

add ax,0

je s

inc ax

s:      inc ax

执行后,(ax)=1。add ax,0 使得ZF=1,所以je指令将进行转移。

 

可在这个时候发生的转移确不带有“相等则转移”的含义。因为此处的je指令检测到的ZF=1 ,不是由cmp等比较指令设置的,而是由add指令设置的,并不具有“两数相等”的含义。

但无论“ZF=1” 的含义如何,是什么指令设置的,只要是ZF=1,就可以使得je指令发生转移。

 

CPU提供了cmp指令,也提供了 je 等条件转移指令,如果将它们配合使用,可以实现根据比较结果进行转移的功能。

但这只是“如果”,只是一种合理的建议,和事实上常用的方法。

但究竟是否配合使用它们,完全是你自己的事情。这就好像,call和ret指令的关系一样。

对于jne、jb、jnb、ja、jna等指令和cmp指令配合使用的思想和je相同,可以自己分析一下。

 

课堂练习

 

我们来看一组程序:

data段中的8个字节如下:

data segment

db 8,11,8,1,8,5,63,38

data ends

 

(一)编程:统计data段中数值为8的字节的个数,用ax保存统计结果。

编程思路:初始设置(ax)=0,然后用循环依次比较每个字节的值,找到一个和8相等的数就将ax的值加1。

 

源码分析:相关代码下载

第二种方案:相关代码下载

 

分页阅读: 1 2 下一页
为您推荐

报歉!评论已关闭.