. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->INT指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  此贴结束检测点13.1的讨论  [待解决] 回复[ 5次 ]   点击[ 994次 ]  
hanlsheng
[帖 主]   [ 发表时间:2009-05-11 23:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-12-15 16:17
看过检测点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表示的范围就好了。)
不过呢,最好多思考些。

最后希望没有带给大家误导!
378499835
[第1楼]   [ 回复时间:2009-05-14 15:47 ]   [引用]   [回复]   [ top ] 
荣誉值:11
信誉值:1
注册日期:2008-11-24 20:35
写到博客里岂不是更好些么
378499835
[第2楼]   [ 回复时间:2009-05-14 15:48 ]   [引用]   [回复]   [ top ] 
荣誉值:11
信誉值:1
注册日期:2008-11-24 20:35
刚发现博客里也有,不错,顶啦
zhenglxd
[第3楼]   [ 回复时间:2009-06-03 14:46 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05
这玩意还需要 分析啊。。靠啊郁闷啊
段内近转移 即 cs不变 cs不变 即 ip最大为ffff
转移位移 当然不会超过偏移地址了
zhenglxd
[第4楼]   [ 回复时间:2009-06-03 16:12 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05
关于 loop
loop 是短转移 短转移是 8位 的 当然和near 是有区别的
一个8位  一个16位

loop 和 near
最大区别是 near 因为cs  不变 所以相对 cs的start  , bx可以直接等于他的标号的偏移地址

loop 他是8位的 所以如果loop 处的标号 距离start 超过 ff 就不行了
所以他只能用 一个相对地址 做加法 用bx保存

另外我不认为 书上的那个例子 有范用性 他实现loop 也同时实现了near

比如 三个标志 0  5  10
用near 实现5 则bx直接=5 因为cs不变
用loop实现5 书上的例子是 5-10+10 依然=5

那么好 如果三个标志是0 5 2000
其本质是一样的 但是已经不是loop 因为 数值范围大于ff了!
zhy_zhy
[第5楼]   [ 回复时间:2009-08-02 15:39 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-06-29 14:39
对于检测点13.1的7ch中断,中的标号s和se之差,我们可以这么想,因为这两个标号在同一个段中,也就是他们的在一个64k范围 
内做减法运算,这好比设定一个范围比如【0---9】,让我们从中任意选取两个数字做减法运算,然后问结果是多少? 
那么我们应该能求得出一个结果的范围的,其实s和se之差也是这个意思,只不过在计算机中,寄存器中的一个数值同时代表了 
两种意义:有符号数和无符号数. 
------------------------------------
IP表示的应该是无符号数吧,范围是【0~65535】,如果第一个数是0,那第二个数与第一个数的差值的范围就是【0~65535】,可如果第一个数是65535,那第二个数与第一个数的差值的范围就是【-65535~0】
那么,我们可不可以说它的最大差值范围在【-65535~65535】之间呢?
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved