还是王爽的书,只是针对这个指令没有实际的例子,没理解
能不能帮忙写个小例子理解一下,多谢啦
原文如下:
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位的操作数,该操作数是相对于目标位置处的偏移量,所以称为“相对”近转移。
你的理解倒是没有错。至于为什么处理器要搞得这么麻烦,我也不知道。有人说是为了方便程序在内存中重定位,个人表示这很荒谬。程序执行时,段已经重定位过了。
------解决方案--------------------------------------------------------