鱼C论坛

 找回密码
 立即注册
查看: 4122|回复: 9

jmp 问题

[复制链接]
发表于 2012-1-18 21:57:29 | 显示全部楼层 |阅读模式
1鱼币
用 “ jmp s” 或 “ jmp far ptr s” 不就把所有这类的跳转问题都解决了吗?就算是段内短转移和段内近转移也一样可以搞掂,为什么还要搞出 “jmp short s” 和 “jmp near ptr s” 这两个来, “ jmp s” 和 “ jmp far ptr s” 在这类转移中有没有会报错的情况,这两者之间在应用上又有什么区别??我新鸟一个,望高手指点!

最佳答案

查看完整内容

jmp short 标号 和jmp near ptr 标号 可以写成jmp 标号 jmp short和jmp near ptr只是在范围上区别,jmp short跳转范围为-128~127(8位),jmp near ptr的范围则是-32769~32767(16位)。 这些jmp指令,只是修改相对于当前IP的转移位移为IP。相当于jmp 寄存器. jmp far ptr 标号 则是CS也修改,即段间转移。CS为标号所在段的段地址,IP为标号相对于所在段中的偏移。相当于jmp 段地址:偏移地址(debug专用) jmp还可以使用内存 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-1-18 21:57:30 | 显示全部楼层
本帖最后由 jakes 于 2012-1-20 00:24 编辑

jmp short 标号 和jmp near ptr 标号 可以写成jmp 标号
jmp short和jmp near ptr只是在范围上区别,jmp short跳转范围为-128~127(8位),jmp near ptr的范围则是-32769~32767(16位)。
这些jmp指令,只是修改相对于当前IP的转移位移为IP。相当于jmp 寄存器.
jmp far ptr 标号 则是CS也修改,即段间转移。CS为标号所在段的段地址,IP为标号相对于所在段中的偏移。相当于jmp 段地址:偏移地址(debug专用)
jmp还可以使用内存中的内容当作CS,IP值实现跳转(像指针一样,内存单元存放地址)。
jmp word ptr [si] 或 jmp dword ptr [si]

也可以使用SJMP,AJMP或LJMP指令。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-1-18 23:07:31 | 显示全部楼层
:L 位移?可移植性问题? 效率?
没深入学习,解释不清。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-1-19 16:16:04 | 显示全部楼层
这些指令的机器码不一样,寻址方式也不一样,比如: jmp far ptr s是把S的段地址和拍内衣地址直接给CS和IP,而jmp near ptr s则表示“向前跳转XX字节或向后跳转XX字节”这样的语义。单单从使用方便的角度看, jmp far ptr s显然几乎是通用的。但但你像教材里一样复制该指令的机器码,粘帖到其它位置的时候,就会有明显不同的含义。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-1-19 17:41:10 | 显示全部楼层
这我也是带着疑惑学的,希望小甲鱼老师出来申张正义,讲讲他们之间的区别,再细致一些,这个问题,可以发到投斥建议处的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-1-19 21:15:06 | 显示全部楼层
还希望专家来访谈一下,默默等待小甲鱼老师的出现。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-1-19 21:54:49 | 显示全部楼层
这样设计一定有原因,我一直遵循小甲鱼的话:用到了再去学= =
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-1-19 21:58:37 | 显示全部楼层
结果一样 但效率不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-1-22 04:19:03 | 显示全部楼层
jmp这个章节,尤其是最后个测试,虽然前面2个好写,第3个,他自己都说了感觉不是很好啊,在不出个讲解的话,我实在是只能理解,不能明白原因了,
答案如下,谁给分析分析。书本第184面

3)用Debug查看内存,结果如下:

2000:1000 BE 00 06 00 00 00 ......



则此时,CPU执行指令:



mov ax,2000H

mov es,ax

jmp dword ptr es:[1000H]



后,(CS)=? , (IP)=?



提示:为了使本机环境[2000:1000至2000:1005]中的数据与题目中所给出的数据一致,可以通过编写程序来完成,完整程序如下:

assume cs:code

code segment

start:

    mov ax,2000h

    mov ds,ax

    mov bx,1000h

    mov word ptr [bx].0,0BEH

    mov word ptr [bx].2,6h

    mov word ptr [bx].4,0

    ;运行完上6句则使2000:1000--2000:1005中的数据依次为:BE,00,06,00,00,00

    ;以上6句则按题目中的数据进行初始化,以便使运行环境符合题目要求



    ;mov ax,2000h

    mov es,ax

    jmp dword ptr es:[1000h]



code ends

end start



经上机调试得出:CS=0006H,IP=00BEH

IP我自己写的时候测的是00BEH,但是为什么CS是0020H呢。。。求解脱啊,,困扰啊~~:dizzy:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-17 10:52:19 | 显示全部楼层
占个座听听大家的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 10:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表