鱼C论坛

 找回密码
 立即注册
查看: 4099|回复: 6

[争议讨论] 问下各位大佬 jmp short 和 jmp near 的用处

[复制链接]
发表于 2018-1-26 21:41:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
首先我知道 jmp short 标号 是段内短转移 (-128-127)
我也知道 jmp near 标号 是段内近转移(-32768-32767)

大佬写程序的时候有必要这么写嘛,jmp far ptr 标号、jmp 16位寄存器、jmp word ptr 内存单元 、jmp dword ptr 内存单元  不是更加方便嘛?王爽老师的意思是让我们明白有这些东西大致知晓就行了吧。

大神们写程序都是怎么使用jmp的呢?jmp short 和 jmp near 的用处(重要性)又体现在哪?

@兰陵月 @人造人 @小甲鱼

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
比特阿尔法 + 5 + 5 + 3 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-27 02:07:43 | 显示全部楼层
"jmp short 和 jmp near 的用处(重要性)又体现在哪"
没用,只做了解即可

在写程序的时候,我根本就不关心是用short的偏移还是near的偏移
我直接写 jmp label 然后让编译器自己去计算应该使用short的偏移还是near的偏移

assume cs:code

code segment
start:
        jmp l
        db 100 dup (0)
l:
        mov ax, 4c00h
        int 21h
code ends
end start

D:\Masm615>debug test.exe
-u
0BA8:0000 EB64          JMP     0066
0BA8:0002 0000          ADD     [BX+SI],AL
0BA8:0004 0000          ADD     [BX+SI],AL
0BA8:0006 0000          ADD     [BX+SI],AL
0BA8:0008 0000          ADD     [BX+SI],AL
0BA8:000A 0000          ADD     [BX+SI],AL
0BA8:000C 0000          ADD     [BX+SI],AL
0BA8:000E 0000          ADD     [BX+SI],AL
...

0BA8:0000 EB64          JMP     0066
assume cs:code

code segment
start:
        jmp l
        db 32767 dup (0)
l:
        mov ax, 4c00h
        int 21h
code ends
end start

D:\Masm615>debug test.exe
-u
0BA8:0000 E9FF7F        JMP     8002
0BA8:0003 0000          ADD     [BX+SI],AL
0BA8:0005 0000          ADD     [BX+SI],AL
0BA8:0007 0000          ADD     [BX+SI],AL
0BA8:0009 0000          ADD     [BX+SI],AL
0BA8:000B 0000          ADD     [BX+SI],AL
...

0BA8:0000 E9FF7F        JMP     8002
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-1-27 10:48:25 | 显示全部楼层
人造人 发表于 2018-1-27 02:07
"jmp short 和 jmp near 的用处(重要性)又体现在哪"
没用,只做了解即可

醍醐灌顶 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-27 19:02:07 | 显示全部楼层
本帖最后由 兰陵月 于 2018-1-27 19:09 编辑

远有用,近基本没用。
远调用的时候是需要压入段寄存器的,近和段内只是压入IP。
如果是要进行进程切换或者任务切换,这个时候就需要远调用了。
特别是当你将经常用到的一个功能封装成一个过程或者函数,供别的任务调用的时候,这个时候调用者就必须采用远调用的模式。返回的时候也是远返回。
高级语言里对近、远调用的表现形式可能不一样,但是最终在机器执行的时候本质还是一样的。
即段内调用可以采用短、近、远。但是段间调用就只能远了。

INTEL CPU的本质还是分段的,只是现在很多高级语言编程都是基于FLAT模式,所以很多人以为没有段,其实还是有段的,只不过整个4GB(32位CPU)内存都被弄成了一个整段。反正大家都是在这个大段里做事,当然就没必要再引用段了。但是处理器最终执行的时候都是要检查段的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-1-27 19:05:01 | 显示全部楼层
本帖最后由 兰陵月 于 2018-1-27 19:06 编辑

人造人的解释其实是在讲本质。

那就是,机器根本不知道你是short、near、far还是什么鬼。

机器只知道距离,你要我调用那个离执行指令处很远很远的指令,那你就别限制我压入CS。如果限制我压入CS,那我就回不来了。

short、near、far是我们这些传播知识的人为了让其他人看懂看明白搞出来的符号代码而已。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-1-28 11:35:56 | 显示全部楼层
兰陵月 发表于 2018-1-27 19:02
远有用,近基本没用。
远调用的时候是需要压入段寄存器的,近和段内只是压入IP。
如果是要进行进程切换或 ...

原来还有这些底层的知识嵌套,谢谢大神耐心解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-28 13:37:46 | 显示全部楼层
cnkizy 发表于 2018-1-28 11:35
原来还有这些底层的知识嵌套,谢谢大神耐心解答

我也是一知半解,大家互相学习。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-6 07:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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