看过检测点13.1直接给答案就是: bx表示多大,最大转移就是多大。根本没有多想。
可是再看检测点13.2时,就犯嘀咕了,检测点13.1模拟loop ,13.2模拟jmp
near ptr s,这时突然想起loop 和jmp near ptr的区别,然后开始思考13.1
。可是一点头绪没有,难道loop 和7ch中断有啥联系?于是去看论坛
可是论坛关于这个检测点的讨论太少了,就是有讨论,也是太苍白无力了,不过给了我很多启发。
然后搜博客,从搜索结果中一个一个看,直到看到wlxjb的博客,从wlxjb博主那里
得到了很多启发,博主考虑的好深入,真是令人敬佩。
,把wlxjb的文章看了三遍,我觉得答案求证过程,不是特别的清楚,也不是特别的严密,但是给了
我很大启发,但是我依然思考的很费劲,我相信很多复杂源于简单,如果一个问题
绕的你头疼,不如考虑简单的情况,找个例子来说明。
于是我回过头看书,书上有这么一句话:‘可以利用iret指令,我们将栈中的偏移地址
加上 bx中的转移位移 ,则栈中的se的偏移地址就变成了s的偏移地址。’这句话在书(第一版)的
第246页第13行,不知道大家如何看这句话,反正我注意到了,这句话说,bx中放的是
转移位移,我们再看13.1问题问的啥,问的是最大转移位移是什么,那么既然转移位移放在bx中,
那么其实这个问题问的就是bx中数值的最大值!看到这里如果大家说我扣字眼,我无话可说。但是我认为
我看书比较细心,哈哈。
接下来继续思考,汇编啊,扣字眼确实没有多大说服力,其实最开始我们王爽老师在书中就
一直强调,内存中存放的都是都是1或0,是代码还是数据完全看程序如何对待。还有就是8086的
地址寻址结构,一个段最大为64K,其实大家想想这个段最大为64k是怎么回事啊,不就是ip表示的范围吗?(针对cs段)
前面的课程又告诉我们,16位的寄存器中存放的是正数还是负数,也看我们(程序)的需要,归根接地存放的就是16位的
bit数值。
现在我们回到检测点13.1 的程序,bx中存放的是s标号和se标号的差值,不管这个差值是正数负数。s标号和se标号代表的是什么呢?
是偏移地址,也就是是16位bit数值。那么这两个数值的差就是bx中的bit数值,那么这个数值就是检测点13.1的答案
我是这么认为的。
那么这个值到底是多少呢?我觉得如果你读到这个地方还非的问我答案,我真是太伤心了,我也不知道怎么告诉你,你能告诉我,
111111111是多少吗?(你说是﹣1,我说是255,反之亦然,别跟我说flag标识寄存器!)
其实,这个检测题给我们带来的思考,是对前面知识的回顾,当然前提是你喜欢思考这个问题,最后给大家举个例子来说明下,
希望列子能起到好的作用:
对于检测点13.1的7ch中断,中的标号s和se之差,我们可以这么想,因为这两个标号在同一个段中,也就是他们的在一个64k范围
内做减法运算,这好比设定一个范围比如【0---9】,让我们从中任意选取两个数字做减法运算,然后问结果是多少?
那么我们应该能求得出一个结果的范围的,其实s和se之差也是这个意思,只不过在计算机中,寄存器中的一个数值同时代表了
两种意义:有符号数和无符号数.
{最后还是公布下标准答案吧,因为我们从小就对标准答案情有独钟,最大转移位移是ffffH。
其实如果有的同学给出65535 或者【-32768 32767】也是对的,只要你知道16bit表示的范围就好了。)
不过呢,最好多思考些。
最后希望没有带给大家误导! |