| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2394 人关注过本帖
标题:短转移与近转移之间的问题
只看楼主 加入收藏
wisji8
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:53
专家分:198
注 册:2010-9-19
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
短转移与近转移之间的问题
我现在学习十六位汇编,看到call指令不能实现短转移,突然有一问题,短转移实现的范围是-128 ~ 127,近转移实现的范围是-32768 ~ 32767,那近转移不是包含短转移吗?为什么还要短转移这一概念。或者,难道就像C语言long型与int型变量那样是为了以后机器的位数。
搜索更多相关主题的帖子: C语言 
2010-09-21 19:17
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
那近转移不是包含短转移吗?

我的理解 是包括的

为什么还要短转移这一概念。或者,难道就像C语言long型与int型变量那样是为了以后机器的位数。

那 我举个不恰当的例子

有16位CPU 32位CPU 现在用的大都是64位CPU

可是 比如32位CPU罢 向下兼容16位 那 你能说 这里 16位就没意义了 就不用这个概念了么

没关系罢 就是有这个概念 而且 你不能钻牛角尖 非硬套概念 是罢
2010-09-22 01:16
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:20 
到底什么是短转移 什么是近转移 有什么含义呢?


JMP指令是从程序当前执行的地方无条件转移到另一个地方执行。这种转移可以是一个短(short)转移(偏移量在[-128, 127]范围内),近(near)转移(偏移量在[-32K, 32K]范围内)或远(far)转移(在不同的代码段之间转移)。

短和近转移是段内转移,JMP指令只把目标指令位置的偏移量赋值指令指针寄存器IP,从而实现转移功能。但远转移是段间转移,JMP指令不仅会改变指令指针寄存器IP的值,而且还会改变代码段寄存器CS的值。

该转移指令的执行不影响任何标志位。

例如:
 
 
next1: …
JMP next1 ;向前转移,偏移量之差为负数

JMP next2 ;向后转移,偏移量之差为正数

next2: …

在目前流行的汇编系统中,当段内转移时,有些软件把该转移指令默认为近转移,从而使指令的偏移量用一个字来表示,于是生成3个字节的指令代码,但如果程序员自己清楚转移的幅度在一个短转移的范围之内,那么,可用前置short的办法来告诉汇编程序,让它产生2个字节的指令代码。

比如:如果程序员知道在上例中的标号next2离“JMP next2”指令的偏移量不会超过127,那么,可用下面的转移方式来省掉一个字节的指令代码。

next2: …
JMP short next2 ;生成2个字节的转移指令,从而节省一个字节


书上这么写的 也就是说 短转移可以用近转移来代替 按理说 这算是"包含"罢 只不过 这个包含是以浪费为代价的 也就是 本来可以用1字节解决的问题 非用两字节来实现 浪费

看到这你应该想到了这样一点 反正我想到了 也就是 两者的区别 或 实质 其实是用多大的空间来存放地址

假设 jmp进行偏移量跳转时的机器码是eb 那 这两者的样子大概是 eb XX  和 eb XX XX (都是16进制数 下同) XX就是偏移量 这也是为什么 两者跳转的范围不同的缘故 呵呵

看出来了么 你应该明白了、、、
2010-09-22 01:33
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
我用了机器码来解释 其实也是这样 别忘了 汇编是 助记符 只不过是辅助记忆机器码的

这决定了

1 以硬件为准 硬件能干什么我们才能干什么

2 以机器码为准 机器码要求什么我们才能写什么

事实上 这两种跳转的机器码不同的

JMP—Jump



 Opcode      Instruction    64-Bit Mode    Compat/        Description

                                           Leg Mode



 EB cb       JMP rel8       Valid          Valid          Jump short, RIP = RIP + 8-bit displacement

                                                          sign extended to 64-bits



 E9 cw       JMP rel16      N.S.           Valid          Jump near, relative, displacement relative

                                                          to next instruction. Not supported in 64-bit

                                                          mode.


英文没问题就能看懂的 看不懂去学英语罢 也就是 两者的机器码不同 只不过 助记符是相同的(貌似at&t里不同诶) 最终的表现形式不同的 呵呵

更深入的 请参阅 Intel(R) 64 and IA-32 Architectures Software Developer’s Manual 也就是我们俗称的 指令手册 一切以此为准 教材也是根据这个来的 当然 是英文的啦、、、
2010-09-22 01:40
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
启示

1 两者不同 或者 应认为是不同的 不必深究 概念问题 绕来绕去没意思

2 汇编指令的问题 从机器码和硬件上找原因 同样的问题 比如 mov 内存,内存 这样的形式 CPU不允许 不行 就是不行 没有为什么 或者 从汇编语言的层面 说不出为什么 就是 “没有为什么”

3 这个指令的重点是 在合适的时候正确是哟个近/短跳转 合理使用指令 是个学问 也是16位汇编的重点罢 呵呵 毕竟 仅从16位的角度讲 硬件还是很宝贵的 而且 学这个也就是培养个意识呗

4 有兴趣 可以深究下 比如 机器码的构成一类的 别忘了上面说的 指令手册 呵呵


2010-09-22 01:46
wisji8
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:53
专家分:198
注 册:2010-9-19
收藏
得分:0 
谢谢版主,说的真详细。谢谢。
2010-09-22 01:50
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
觉得好就加分 呵呵

有思想 很好 貌似我就没想到这个

不要太执着 好读书 不求甚解 有些时候需要的 我说的是有些时候 毕竟罢 编程最终是写程序 概念转过来 绕过去 也没啥用 是罢 我感觉是
2010-09-22 01:56
wisji8
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:53
专家分:198
注 册:2010-9-19
收藏
得分:0 
回复 7楼 zklhp
谢谢版主给的忠告。
2010-09-22 02:02
wqh963577494
Rank: 1
等 级:新手上路
帖 子:2
专家分:4
注 册:2012-12-1
收藏
得分:0 
版主厉害啊!!!!!
2012-12-10 12:20
快速回复:短转移与近转移之间的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017353 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved