shuiyu 发表于 2017-10-18 22:00:48

《零基础入门学习汇编语言》第五十八讲及检测点11.3

本帖最后由 shuiyu 于 2017-10-18 22:03 编辑

越努力,越幸运。欢迎大家来看我的笔记{:10_297:},不对的请各位大佬指正,谢谢{:10_254:}

一、检测比较结果的条件转移指令
(1)编程训练:对比上一讲中我写的编程训练题,是写对了的,在这里我就不多说了。
(2)课堂练习,对于jne、jb、jnb、ja、jna等指令和cmp指令配合使用的思想和je相同,所以在这我就写:编程:统计data段中数值小于8的                         字节的个数,用ax保存统计结果。因为其它的都是换汤不换药{:10_312:}
解:解释我就不说了吧,小甲鱼已经说得很清楚了{:10_312:}


(3)这之前的我们说的都是无符号数的判断检测,而对于有符号数的呢?
根据有符号数的比较结果进行转移的条件转移指令的工作原理和无符号的相同,只是检测了不同的标志位。我们在这里主要探讨的是cmp、标志寄存器的相关位、条件转移指令三者配合应用的原理,这个原理具有普遍性,而不是逐条讲解条件转移指令。


检测点11.3
刚开始看到题目的时候懵逼了,觉得和(32,127)有什么区别?还以为课本出错了{:10_250:} 后来仔细想了想才记起来中括号[]是包括32和128,小括号()不包括32和128。
(1)补全下面的程序,统计F000:0处32个字节中,大小在的数据个数。

s:   mov al,
   cmp al,32   ;和32进行比较
   jb s0         ;如果低于al转到s0,继续循环
   cmp al,128    ;和128进行比较
   ja s0         ;如果高于al转到s0,继续循环
   inc dx

s0:inc bx
   loop s

解答:
1.我们这里为什么要用到jb和ja呢?首先我们要记得这道题目是包含32和128的。jb是依靠CF=1判断的,有进位或者借位时CF=1。故当数值al低于32时会产生借位从而CF=1发生跳转继续循环。那al=32时呢,结果等于0,没有产生借位或者进位,故没有发生跳转而是往下执行,从而做到了大于等于的效果。

2.说完jb我们开始说ja,ja是依靠CF=0,ZF=0判断的。有进位或者借位时CF=1,结果若为0,ZF=1,若不为0,则ZF=0。当数值al大于128时不管al是多少都不会产生借位进位且结果不会为0,故会跳转到s0处继续循环。而当al=128时,结果等于0,没有产生借位或者进位;但是结果为0,即ZF=1了,那么久不会跳转而是继续往下执行了,从而做到了小于等于的效果。



(2)补全下面的程序,统计F000:0处32个字节中,大小在(32,128)的数据个数。

s:   mov al,
   cmp al,32      ;和32进行比较
   jna s0      ;如果不高于al转到s0,继续循环
   cmp al,128    ;和128进行比较
   jnb s0      ;如果不低于al转到s0,继续循环
   inc dx

s0:inc bx
   loop s

解答:这题是不包括32和128的,但是原理还是和上面一题相似的,注意看指令的判断条件就好了。如果看懂了我上一题的解释,这题肯定也就会了。所以我就不多说了{:10_312:}





二、DF标志和串传送指令
(1)flag的第10位是DF,方向标志位。在串处理指令中,控制每次操作后si,di的增减。
DF = 0:每次操作后si,di递增;
DF = 1:每次操作后si,di递减。
(2)
movsb (以字节为单位传送):将 ds:si 指向的内存单元中的字节送入 es:di中,然后根据标志寄存器DF位的值,将 si和di递增或递减
movsw(以字为单位传送):将 ds:si指向的内存字单元中word送入es:di中,然后根据标志寄存器DF位的值,将si和di递增2或递减2。
(3)rep movsb
rep的作用是根据cx的值,重复执行后面的串传送指令。由于每执行一次movsb指令si和di都会递增或递减指向后一个单元或前个单元,则rep movsb就可以循环实现(cx)个字符的传送。
(4)8086CPU提供下而两条指令对DF位进行设置:
cld指令:将标志寄存器的DF位置0
std指令:将标志寄存器的DF位置1





谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}

本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记{:10_297:},不对的请各位大佬指教,谢谢{:10_254:}
页: [1]
查看完整版本: 《零基础入门学习汇编语言》第五十八讲及检测点11.3