首页
社区
课程
招聘
有个汇编的小问题,谁能帮我解决一下??
发表于: 2006-12-19 23:14 8056

有个汇编的小问题,谁能帮我解决一下??

2006-12-19 23:14
8056
我在学转移地址的寻址方式时jmp指令的段内近转移的范围是-32768~32767可是清华的IBM-PC汇编语言上说“由于位移量为16位,它可以转移到段内的任一个位置”,可是IBM-PC机一个段最大是64K,那么根据段内近转移的范围是-32768~32767,请问如果在代码段(64k的段)的开始转移到这个段的结尾那不是超出范围了吗??(可书上又说可以转移到任一位置,岂不是矛盾)这到底是怎么一回事呀??小弟百思不得其解,拜托各位了。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (32)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
各位大哥,我知道这个问题应该很简单,但从网上查了好久也没有很明确的答案。我已经被这问题折磨很久了,希望哪位好心的高手帮我答疑,小弟不胜感激!!!
2006-12-19 23:36
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
3
具体看你用什么了

如果你想知道INTEL平台的,去下载INTEL的指令参考,那里有详细的解释了
2006-12-19 23:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我看了,不懂呀。
2006-12-20 17:35
0
雪    币: 133
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我觉得你是不是看错了呀
"一个段最大为64K" 我觉得这句话有问题,
段最大为为65536吧,64k好像是内存一个页的大小吧,
不知道是不是这样的呀
2006-12-20 18:24
0
雪    币: 255
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
最初由 wangdongqq 发布
我在学转移地址的寻址方式时jmp指令的段内近转移的范围是-32768~32767可是清华的IBM-PC汇编语言上说“由于位移量为16位,它可以转移到段内的任一个位置”,可是IBM-PC机一个段最大是64K,那么根据段内近转移的范围是-32768~32767,请问如果在代码段(64k的段)的开始转移到这个段的结尾那不是超出范围了吗??(可书上又说可以转移到任一位置,岂不是矛盾)这到底是怎么一回事呀??小弟百思不得其解,拜托各位了。


it will be round up.
2006-12-20 18:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
64k=64*1024=2的16次方=65536是一个意思的。
2006-12-20 20:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我说的是8086/8088IBM-PC汇编语言,不涉及到的内存分页的问题。你说的是X86汇编。
2006-12-20 20:16
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
9
请问如果在代码段(64k的段)的开始转移到这个段的结尾那不是超出范围了吗??
==========
这个时候你可以向上跳转. 一旦超过了段的边界, 那么他会从另一端钻出来. 所以这句话没有问题.
比如你在 0005 上, 你向上跳6个字节,
那么5-6=-1=ffff, 那么其实就是跳到这个段的最后ffff上.

cpu处理跳转的时候完全是根据下一条地址减去跳转值来计算出来的
如果产生正负缢出, 那么会把这个溢出给抛弃.
2006-12-20 23:13
0
雪    币: 133
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
那就是的了呀,
-32768~32767,不就是65536吗,
书上说的是对的呀,
2006-12-21 08:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
那请问段内短转跳的范围是-128~127超出范围后,它是从那里出来,比如现在ip=01h然后转跳-125字节,那它是段的结尾往回跳,还是从256字节的小段往回跳啊????
2006-12-21 09:57
0
雪    币: 133
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
-128~127 与0~255的意思有相同,也有不同

前一个更好一些,因为它表示可以往回跳,而后一个表示只能往后跳
它们都表示能一次最大跳256个
2006-12-21 10:02
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
你的意思我没有太懂,可能我也没有说清楚。我没有发图片的权限,我给大家一个地址好了http://www.lobcom.com/anxinzx/YIWEN.JPG
如图所示在一个64K的段,如果向回跳,见箭头方向。如果超过段的开始那么它会从哪里开始??1.位置;2.位置;还是3.位置??继续向下转跳??
2006-12-21 10:37
0
雪    币: 133
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
jmp short X
这个X的地址肯定在这个段中呀,
所以,它跳的距离肯定小于等于256的,你放心好了,
2006-12-21 10:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
x的地址是在这个段中,可短转跳范围是-128-127字节,如果这个段有64k。好比ip=05h,转跳-9。它应该在哪里??IP=??
2006-12-21 13:15
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
16
都说的这么详细了。
你的是在实模式下, 跟你直接调看到的结果不一样的。
2006-12-21 13:18
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
17
这些东西,都是CPU生产厂商定下的规则。。有什么好讨论的。。直接去你研究的平台的生产厂商主页找相关技术文档
2006-12-21 13:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
最初由 jjnet 发布
请问如果在代码段(64k的段)的开始转移到这个段的结尾那不是超出范围了吗??
==========
这个时候你可以向上跳转. 一旦超过了段的边界, 那么他会从另一端钻出来. 所以这句话没有问题.
比如你在 0005 上, 你向上跳6个字节,
那么5-6=-1=ffff, 那么其实就是跳到这个段的最后ffff上.
........

那么,不好意思。照这么说的话,如果是短转跳的话,比如ip=05,向上跳6个字节那么ip=ffh了??
2006-12-21 14:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
这个板块有秦皇岛的朋友吗??
2006-12-21 19:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
job
20
哈哈哈 ,我终于可以发帖了!!!
就让我这个新人来终结你的疑问吧~~~
你的这个问题应该是出自《汇编语言》-王爽p162上的吧,这本书我刚到手,前两天在马桶上翻到就是这一段,呵呵,当时虽然疑惑,因为没看前面,以为答案在前面有,也就没有深思,既然没有,我就来开动一下脑筋:
  其实我跟你的疑惑应该就是,地址应该是正的,而书中给出的范围出现了负数表示的地址,那么我们就对此问题展开讨论:1.地址可以为负,呵呵,那就没有问题了 2.地址不可以为负。近转移的范围为0000000000000000-1111111111111111(这点你同意吧),数据本身是这样子的,其意义如何理解,由读取它代码来决定,如果是补码,范围就是-32768~32767,如果不把最高位作为符号码理解,也就是原码,那么范围就是0-65535,即0-(64k-1)
呵呵,解决~~

这两天看王的书,觉得他说的几句话实在很有道理,以至于超出了计算机的范畴,而可以达到哲学的高度,下面引用一段话p20
"本节讨论的是8086cpu段地址和偏移地址的本质含义,而不是为了解决具体的问题在本质含义之上引申出来的更高级的逻辑意义。不管以多少种不同的逻辑意义去看待”段地址*16+偏移地址“的寻址模式,一定要清楚地知道它的本质含义,这样才能更灵活的利用它来分析,解决问题。如果只拘泥于某一种引申出的逻辑含义,而模糊本质含义的话,将从意识上限制对这种寻址功能的灵活应用。”
记得,翻过沈美明的《IBM-PC汇编语言》(清华)上,就把内存分成了以16字节为单位的64k个小段,让我以为内存本来就是分段的,到今天终于纠正了过来
谢谢,我的第一帖就到这里,再次感谢
2006-12-21 23:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
那么转跳指令的原理是什么呢?编译器做了什么工作??
2006-12-22 18:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
那你说的意思是段内转跳的转跳的符号地址就是偏移地址了??是吗??
2006-12-22 19:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
job
23
首先回答你第二个问题
什么是汇编语言?
汇编语言由汇编指令,伪指令和一些符号组成,汇编指令是机器指令的一一对应,用汇编语言编程,基本上工作都是要自己完成的,编译器做的事情很少,比如伪指令,符号

第一个问题
要明白转移指令的原理:就要明白cpu是根据什么来执行指令的,上面我已经讲过,存在于内存中的是0和1,它可以是数据,可以是指令。而x86的cpu中,cs:ip指向的数据,cpu就理解为指令并执行之。那么转移指令的原理就是修改cs或ip的值,达到瞬间移动的目的

ps:有谁知道,帖子前面的信封的各种状态的意义
2006-12-22 19:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
job
24
注意,你应该脱离符号这个概念,在汇编中都是用16进制来表示的,你想一下,在16进制表示时还会有符号吗?那么你可能会想怎么保证16进制能够正确表达10进制的数呢? 我只能说:那是巧和,宇宙本身便是一个大数巧和,数学也是巧和,同样计算机也充满了巧和
2006-12-22 19:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
转跳指令的原理不是编译器算出符号地址的有效地址(偏移地址)然后在指令中指出吗??
2006-12-22 20:01
0
游客
登录 | 注册 方可回帖
返回
//