《零基础入门学习汇编语言》第四十五讲(含检测点9.2及9.3)
本帖最后由 shuiyu 于 2017-8-14 12:06 编辑越努力,越幸运。欢迎大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指正,谢谢{:10_254:}
一、jcxz指令
(1)jcxz指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为-128~127。指令格式:jcxz 标号
(2)当(cx)=0时,(IP)=(IP)+8位位移)
8位位移=“标号”处的地址-jcxz指令后的第一个字节的地址;
8位位移的范围为-128~127,用补码表示;
8位位移由编译程序在编译时算出。
(3)当(cx)!=0时,什么也不做(程序向下执行)。
二、loop指令
(1)在前面的学习中我们都有用过了,和上面的jcxz指令可以说是相反{:5_91:}
(2)loop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为-128~127。
指令格式:loop 标号
(3)如果(cx)≠0,(IP)=(IP)+8位位移。
8位位移=“标号”处的地址-loop指令后的第一个字节的地址;
8位位移的范围为-128~127,用补码表示;
8位位移由编译程序在编译时算出。
(4)当(cx)=0,什么也不做(程序向下执行)
检测点9.2
补全编程,利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。
assume cs:code
code segment
start: mov ax,2000h
mov ds,ax
mov bx,0
s: mov ch,0
mov cl,
jcxz ok
inc bx
jmp short s
ok: mov dx,bx
mov ax ,4c00h
int 21h
code ends
end start
解:
(1)因为题目要求查找的是字节,故我们要使用字节类的寄存器,而又因为我们是要用jcxz指令完成跳转的;jcxz指令的跳转是看CX的值得,所以我们用ch、cl{:5_95:}
(2)把每个内存单元依次赋值给CX
(3)如果CX=0时,jcxz跳转到标号OK处,不等于零的话就继续执行下面的指令。
(4)使自加1,这样才能循环赋值,因为下面有一个jmp s,就和循环似的。
检测点9.3
补全编程,利用loop指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。
assume cs:code
code segment
start:mov ax,2000h
mov ds,ax
mov bx,0
s: mov cl,
mov ch,0
inc cx
inc bx
loop s
ok:dec bx
mov dx,bx
mov ax,4c00h
int 21h
code ends
end start
解:因为执行loop s时,首先要将(cx)减1。所以要先让CX加一。
谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指教,谢谢{:10_254:} 求助,9.3中 那个OK标号是干嘛用的 微末非末 发表于 2017-11-19 12:20
求助,9.3中 那个OK标号是干嘛用的
没用{:10_250:}它放个标号OK在那,应该是让我们更好分清LOOP循环到此结束吧(个人脑补{:10_312:}),反正有它没它对程序都没影响 本帖最后由 infinity20 于 2019-6-21 00:22 编辑
shuiyu 发表于 2017-11-19 14:30
没用它放个标号OK在那,应该是让我们更好分清LOOP循环到此结束吧(个人脑补),反正 ...
OK为什么没用呢 妈的我被这个OK搞死了,看了半天看不懂,这个OK不是蛊惑人心吗
学习汇编
页:
[1]