|
发表于 2013-2-4 02:38:27
|
显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-2-4 11:57 编辑
- s: inc ax
- jmp s0
- mov bx,3
- s0: inc bx
- jmp s
- nop
复制代码 就以图上的来举例好了
由于各个指令的地址无法确定
我们地址都是假设的
首先我们推出各个指令的地址
假设标号s的指令inc ax所在的地址为0000 由于inc ax机器码为40占一个字节
所以下一个指令 jmp s0所在的地址向下推1,也就是0001
jmp s0的机器码EB03,占2个字节
所以下一个指令 mov bx,3所在的地址向下推1,也就是0003
mov bx,3占3个字节
所以下一个标号为s0的指令 inc bx所在的地址向下推6,也就是0006
以此类推出所有指令的地址
跟图一样
于是我们得出这样的
- 0000:s: inc ax
- 0001: jmp s0
- 0003: mov bx,3
- 0006: s0: inc bx
- 0007 jmp s
- 0009 nop
复制代码
接下来是你要看的重点,
位移,这个东西简单讲就是我们要跳过去的那个地方的地址
距离我们现在这个指令的地址有多远
举个例子:
jmp s0这个指令的所在地址是0001
它要跳去的指令时inc bx所在的地址是0006
它们的距离就是从jmp s0这个指令的尾部(屁股后面)到inc bx的头部
jmp s0这个指令的尾部是这个指令的结束(只占2个字节,所以结束是下2个字节),也就是0003
inc bx的头部也就是这个指令刚要开始,还没开始的地址,也就是mov bx,3的尾部,mov bx,3占3个字节
占0003 0004 0005 ,尾部就是0005
那么距离可以算出来了
0003 0004 0005
那么位移就是3
简单不用多想就是
JMP指令所在位置的地址 同 要跳转地址 两个指令之间 的指令 所占的字节数 就是 距离
也就是位移
jmp s0
mov bx,3
s0: inc bx
这两个指令中间夹着的mov bx,3
那么mov bx,3的指令所占字节数就是位移
上面绿色字体实在理解不了可以看白色字体
其实也无碍
不然也可以在问一些语言表达能力强的吧
我说的不太好。。 +_+
感谢楼下的补充:
那么我在补充一句好了
我们想上跳转位移量是负的
负数都是用补码表示的
就如图一样-9的补码是F7
其他以此类推
|
|