cnkizy 发表于 2018-1-26 21:41:54

问下各位大佬 jmp short 和 jmp near 的用处

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

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

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

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

人造人 发表于 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   ,AL
0BA8:0004 0000          ADD   ,AL
0BA8:0006 0000          ADD   ,AL
0BA8:0008 0000          ADD   ,AL
0BA8:000A 0000          ADD   ,AL
0BA8:000C 0000          ADD   ,AL
0BA8:000E 0000          ADD   ,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   ,AL
0BA8:0005 0000          ADD   ,AL
0BA8:0007 0000          ADD   ,AL
0BA8:0009 0000          ADD   ,AL
0BA8:000B 0000          ADD   ,AL
...

0BA8:0000 E9FF7F      JMP   8002

cnkizy 发表于 2018-1-27 10:48:25

人造人 发表于 2018-1-27 02:07
"jmp short 和 jmp near 的用处(重要性)又体现在哪"
没用,只做了解即可



醍醐灌顶 谢谢{:10_254:}

兰陵月 发表于 2018-1-27 19:02:07

本帖最后由 兰陵月 于 2018-1-27 19:09 编辑

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

INTEL CPU的本质还是分段的,只是现在很多高级语言编程都是基于FLAT模式,所以很多人以为没有段,其实还是有段的,只不过整个4GB(32位CPU)内存都被弄成了一个整段。反正大家都是在这个大段里做事,当然就没必要再引用段了。但是处理器最终执行的时候都是要检查段的。

兰陵月 发表于 2018-1-27 19:05:01

本帖最后由 兰陵月 于 2018-1-27 19:06 编辑

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

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

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

short、near、far是我们这些传播知识的人为了让其他人看懂看明白搞出来的符号代码而已。

cnkizy 发表于 2018-1-28 11:35:56

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

原来还有这些底层的知识嵌套,谢谢大神耐心解答{:10_254:}

兰陵月 发表于 2018-1-28 13:37:46

cnkizy 发表于 2018-1-28 11:35
原来还有这些底层的知识嵌套,谢谢大神耐心解答

我也是一知半解,大家互相学习。
页: [1]
查看完整版本: 问下各位大佬 jmp short 和 jmp near 的用处