首页
社区
课程
招聘
[旧帖] 为什么近转移可以从另一端出来,而短转移报错?? 0.00雪花
发表于: 2007-2-16 01:43 4740

[旧帖] 为什么近转移可以从另一端出来,而短转移报错?? 0.00雪花

2007-2-16 01:43
4740
看代码:
-------------------
code segment
        assume cs:code
start:
x1:  mov ax,01h
     org 40000
     jmp near ptr x1
code ends
end start
---------------
这是一个近转移的例子,反汇编后
13d9:0000 b80100 mov ax,0001
.......
.......
.......
13d9:9c40 e9bd63 jmp 0000
-----------------
本例从汇编代码上看是向后转跳的,但是
注意看jmp 0000这一行的机器码是转跳到63bd是向前转跳的,刚好超过64k的段,接下来从段的开始位置继续。(结果相当于向后转跳)
也就是说当向后转跳的位移超过32768个字节时,它会改为向前转跳,超过段尾后从段的开始继续向前转跳。因此近转移可以转跳到所在段的任意位置。它不会有像段转移那样有-32768~32767的范围限制。
可为什么短转移会有-128~127的范围限制呢??

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
2
因为near jmp后面只有1byte的操作数
2007-2-16 01:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你到底懂不懂啊,真好笑,最基本的问题你都搞错了!!
2007-2-16 02:23
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
4
最初由 wangdongqq 发布
看代码:
-------------------
code segment
assume cs:code
start:
........


不知所云
什么是近跳转, 什么是短跳转? 有什么区别
麻烦lz多看书
2007-2-16 03:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我倒,段内直接短转移和段内直接近转移都不知道吗??
1.段内直接短转移
格式 JMP SHORT OPR
2.段内直接近转移
格式 JMP NEAR PTR OPR
懂了吗???我都觉的我很菜了,没想到有人比我还菜!!
2007-2-16 10:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
没人理我????
2007-2-16 12:46
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
7
确实说错了,是short jmp只有1byte的操作数。near是2byte.昨天头晕搞错了。表示歉意.
2007-2-17 03:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
怎么解释我的发现呢??
2007-2-17 13:09
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
code segment
        assume cs:code
start:
x1:  mov ax,01h
     org 40000
     jmp near ptr x1
code ends
end start

jmp short 的操作数为1Byte,最大范围为-128-127。jmp near ptr的 操作数为2Byte,因为段的大小为64k(偏移为0000-FFFF),当作无符号时,2Byte可以表示,所以不会出错,可以看成偏移地址。在汇编时,机器码中的操作数为地址差(jmp下一条指令的地址-标号地址),(IP)=(IP)+地址差,其实就是(IP)=(IP-标号+IP)。
  不知道LZ明白码??
2007-2-17 16:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
按照我说的那种情况(IP)=(IP)+地址差,IP已经溢出了,为什么近转移不报错,能正常执行,而短转移却报错
2007-2-17 23:40
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
IP 如果溢出,就对65536取模。段转移报错,是因为地址差超出了表示范围(SHORT后的操作数类型为1Byte),lz 看看下面的程序:
code SEGMENT
        ASSUME CS:code
start:
x1:  MOV AX,01h
     ORG 127
     JMP SHORT x1
code ENDS
END start

把 127 改成126 或着把SHORT改成NEAR PTR时时 。。。

段内转移,根据地址差的大小来区分,如果程序员能肯定地址差不超出一个字节的范围,可以加上SHORT,否则加上near ptr,溢出就取65536的模。其实,在段内,不需要区分这些,只要是在一个段内,就用jmp 标号就对。段间用jmp far
ptr 标号。
不知道LZ明白了码????
2007-2-18 00:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
那是不是这样的:短转移的这个地址差实际上也是用2字节计算的??一旦溢出得的结果是4位16进制数xxxxH,由于溢出前两位数不为0因此没法用1字节表示就报错了??
2007-2-20 15:26
0
游客
登录 | 注册 方可回帖
返回
//