当前位置: 代码迷 >> 汇编语言 >> 能帮忙解释一下jmp near ptr标号 这个格式吗?解决方法
  详细解决方案

能帮忙解释一下jmp near ptr标号 这个格式吗?解决方法

热度:3950   发布时间:2013-02-26 00:00:00.0
能帮忙解释一下jmp near ptr标号 这个格式吗?
还是王爽的书,只是针对这个指令没有实际的例子,没理解
能不能帮忙写个小例子理解一下,多谢啦

原文如下:
jmp near ptr 标号,它实现的是段内近转移。

其功能是:(ip)=(ip)+16位位移 //关键这个16位位移没能理解
1)16位位移=指令“标记”处的地址 - jmp指令后的第一个字节的地址;

我的理解是不是这样:
比如,
jmp near ptr s
mov ax,[0]
s:...
...
...

那么指令“标记”处的地址是指的s:...这句话的地址吧?
jmp指令后的第一个字节的地址,是说的mov ax,[0]这句话的第一个字节吧?
我这样理解对吗?

如果对的话,那么这个指令是什么作用啊?还是没明白。。。




------解决方案--------------------------------------------------------
是标号S的地址,例子:
code segment 
assume cs:code
start:
jmp near ptr s
mov ah,11h
s:mov dl,48h
mov ah,2
int 21h
mov ax,4c00h
int 21h
code ends
end start
------解决方案--------------------------------------------------------
反正就是跳转指令, 加上NEAR PTR 就是限制了它的跳转距离
------解决方案--------------------------------------------------------
段内转移指的是源地址和目的地址都在同一段内,变化的只是偏移地址


18CF:0000 B83412 MOV AX,1234
18CF:0003 E90300 JMP 0009
18CF:0006 BB3412 MOV BX,1234
18CF:0009 8BC3 MOV AX,BX
18CF:000B B44C MOV AH,4C
18CF:000D CD21 INT 21

16位位移=指令“标记”处的地址 - jmp指令后的第一个字节的地址;
这里标记地址为0009H,jmp地址为0003H,那么jmp指令的位移字节是0006H(此处地址的指令未执行)
这个位移,是编译器计算出来的。 我们无法估算。


Assembly code
源程序:assume  cs:codecode    segmentstart:        mov ax,1234h        jmp near ptr s        mov bx,1234hs:        mov ax,bx        mov ah,4ch        int 21hcode    endsend     start
------解决方案--------------------------------------------------------
段内近转移,这种说法是不确切的。
你说的这种情况,确切地说,是16位相对近转移,其机器指令操作码为E9,后面跟着一个16位的操作数,该操作数是相对于目标位置处的偏移量,所以称为“相对”近转移。
你的理解倒是没有错。至于为什么处理器要搞得这么麻烦,我也不知道。有人说是为了方便程序在内存中重定位,个人表示这很荒谬。程序执行时,段已经重定位过了。
------解决方案--------------------------------------------------------
探讨
啊,谢谢各位这么详细的解答

我可不可以这么理解
就是jmp s 和jmp near ptr s
其内容除了范围上有些限制外,跳转的目标是一样的?
  相关解决方案