利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。
assume cs:code
code segment
start:
mov ax, 2000H
mov ds, ax
mov bx, 0H
s: ________
________
________
________
jmp short s
ok:
mov dx, bx
mov ax, 4C00H
int 21H
code ends
end start
答案:
第一条指令:mov cl,[bx]
第二条指令:mov ch,0
第三条指令:jcxz ok
第四条指令:inc bx
---------------
分析:此题颇费了一番脑筋。刚刚拿到题目的时候完全不知道该如何下手,尤其想不通该如何实现题目中的“查找”二字,只是觉得要使用jcxz指令,就要利用它的cx=0的特性,可是还是不知该如何着手。
后来在论坛的相关版面搜索了一些贴子,仔细的看完方才恍然大悟!
一开使我认为答案的前3条指令是利用了jcxz指令,当cx=0时才执行的特性,使得jcxz指令得以执行、程序得以实现,是十足的欺骗,根本没有实现题目要求中的“查找”的要求!而inc bx则根本可有可无,完全看不出把它填在这里有什么作用,是一条十足的废指令!
然后,我想,如果inc bx是废指令,为什么大家都在最后填它?如果它是废指令,而答案的前3条又利用了jcxz指令的特性,那这道题目根本就没有实现题目要求的“循环查找”功能,但这可能么?那此题还有什么意义?
然后我又接着往下想,到底怎样才能“循环查找”呢?以前我们一直用loop指令来实现,可是此题目里只有两个标号,无论如何也不可能循环回去啊?!这时我突然有看到了jmp short s这条指令,你又什么感觉?反正我真想大嘴巴子抽自己!
找到了循环的办法,但是我还是觉得答案在欺骗我们,直接都令cx=0了,哪里还需要循环?不循环有怎么实现“查找”?!
OK,写到这先换个行,随便问个问题,看书求速度,抓进度的朋友们,你们看到这里是不是也有我上面的疑问——既然CX已经等于零了,那还需要查找吗?这根本就是在骗人嘛!
好了,回魂儿了,如果你有上面的问题,那我给你个建议,放下你的速度,回去翻翻书吧,你走的太快了,快要摔倒了!
bx是什么?[bx]又是什么?bx=0,则[bx]也等于零吗?搞清楚这一点,你就知道mov cl,[bx]和inc bx的作用了!那么可以祝贺你了!
上面的废话是我在做检测点9.2时的一点感想,遗憾的是答案不是自己想出来的。
- [游客] 111111111111111113 04/09 01:55
- [tomato] 发现了一个错误。大家在看的时候不妨注意一下。 “2.5堆和栈中的存储内容 栈: 在函数调用时, 04/15 18:03
- [musicvs] 第一题我用一个笨方法算的: 第三条指令就是 10H+90H=A0H ,这里的16进制是补码,然 09/15 12:47
- [fontomas] 第二题已了。 如果寄存器不能保存cmp指令的逻辑结果(超范围),所以实际结果用补码表示。 是这样 08/27 17:03
- [fontomas] SF=1 ? 上面显示的不是 SF=PL吗? 原来“ NV UP EI PL NZ NA P 08/26 16:00
- [mouse] 11.12有debug的标志位显示和标志位的对应关系,可以体验查看一下^_^ 08/26 08:33
- [mouse] mul al zf=0 pf=1 sf=1 这章的答案都 08/26 08:32
- [starrynight] 我顶! 08/25 20:14
- [wuerlang] 嗯,要顶. 08/25 18:03
- [fontomas] 是啊,我本来也想用栈的,可是看到用push/pop那么多次,我就感到快要疯了,所以自作主张改了一下S 08/24 03:10
- [fontomas] 实验一下,Blog突然不能发表文章了! 08/11 21:07
[ 游客 发表于 2008-08-11 09:45 ]
汇编之美妙 可见一斑。