萌辉 发表于 2013-11-18 20:46:17

jmp short 标号的计算

以实验8中jmp short s指令为例,jmp short s 指令的功能:ip=ip+8位位移。8位位移等=标号处的地址(8)-jmp指令后的第一个字节(18)然后加上ip的值(16),可是我算的值不等于0008啊?哪的问题

1236 发表于 2013-11-18 20:46:18

萌辉 发表于 2013-11-19 22:46 static/image/common/back.gif
实验8中jmp short s1这条指令是要cpu跳转到s1处执行,实际上这个指令不含跳转地址而是根据8位位移来改变i ...

我怎么感觉这么简单的问题,被你复杂化了呢,刚刚看了你u命令反汇编后的机器码是E8F6,也就代表向上跳转了8个字节,那么这句指令写到s处,也是E8F6,那么仍然是向上跳转了8个字节,而mov ax,4c00h int 21h正好是8个字节,那么不就跳转到那里了么

Mr. 发表于 2013-11-18 22:31:43

快快快看看,清冽支持、

my_angel 发表于 2013-11-19 08:20:10

本帖最后由 my_angel 于 2013-11-19 08:28 编辑

是jmp指令的下一条指令地址0022减去目的地址0018,结果为F6(补码表示),。刚好为8。。王爽的那本书说得很清楚的

vitamin 发表于 2013-11-19 10:21:49

以JMP short s为例
目标标号便宜地址0008, JMP下一条指令便宜地址0018。注意,0008 0018都是十六进制数,差为-10H表示成补码为F0H.    所以机器码EBF0

bigshan 发表于 2013-11-19 13:38:49

加油,顶你哦。

friendan 发表于 2013-11-19 14:15:05

s标号所在的偏移地址是0008

当前jmpshort s 的偏移地址是0016

16-8=8

1236 发表于 2013-11-19 21:02:21

当初我也被这个问题难住了,不得不说,这个程序好卑鄙,你看那个其实是往上跳转的偏移,机器码是E8 xx然后把 E8 XX这个机器码写入s处,这样执行到s后,会短跳转 跳转到mov ax,4c00h int21h然后程序结束

萌辉 发表于 2013-11-19 21:21:22

vitamin 发表于 2013-11-19 10:21 static/image/common/back.gif
以JMP short s为例
目标标号便宜地址0008, JMP下一条指令便宜地址0018。注意,0008 0018都是十六进制 ...

jmp short标号的功能:(ip)=(ip)加8位位移,8位位移我们求出来了是F0H,在加上ip的值18H(cpu执行指令的过程1从cs:ip指向内存单元读取指令,读取的指令进入指令缓冲器;2ip=ip加所读取指令的长度,从而指向下一条指令;3执行指令,转到1,重复这个过程。)最后偏移地址是8,对吧?

萌辉 发表于 2013-11-19 22:32:18

1236 发表于 2013-11-19 21:02 static/image/common/back.gif
当初我也被这个问题难住了,不得不说,这个程序好卑鄙,你看那个其实是往上跳转的偏移,机器码是E8 xx然后把 ...

我还是不理解,也就是说jmp short s1 把他的位置改变的话,它还是继续向上跳转?

1236 发表于 2013-11-19 22:42:29

萌辉 发表于 2013-11-19 22:32 static/image/common/back.gif
我还是不理解,也就是说jmp short s1 把他的位置改变的话,它还是继续向上跳转?

你要知道,短跳转(-128-127)这个范围内都是跳转的偏移,可以往上跳转,也可以往下跳转, 比如 你刚刚的jmp short s1就是往上跳转的,那么他的机器码就是E8 -2(打个比方往上跳转的偏移是两个字节 其实应该是补码),那么把E8 -2写入到s地址处,当执行s处的内容时,就是往上跳转两个字节 也就是跳转到了 mov ax,4c00h int 21h那里 这下懂了吧

萌辉 发表于 2013-11-19 22:46:24

1236 发表于 2013-11-19 22:42 static/image/common/back.gif
你要知道,短跳转(-128-127)这个范围内都是跳转的偏移,可以往上跳转,也可以往下跳转, 比如 你刚刚 ...

实验8中jmp short s1这条指令是要cpu跳转到s1处执行,实际上这个指令不含跳转地址而是根据8位位移来改变ip的,改变的距离是s2减s1就是F6就是-10,负数向上跳转。我的问题是把这条指令位置改变它还是向上跳转,跳转的距离还是F6?

vitamin 发表于 2013-11-20 10:40:46

萌辉 发表于 2013-11-19 21:21 static/image/common/back.gif
jmp short标号的功能:(ip)=(ip)加8位位移,8位位移我们求出来了是F0H,在加上ip的值18H(cpu执行指令 ...

8位位移是编译器算出来的。读取指令的同时,IP自增,然后cpu根据当前IP值和位移共同算出目标地址。

7ghost 发表于 2013-11-20 13:05:50

师兄 或者师姐 接你的平台用一下谢谢di =8 ,si=20他们是怎么来的呢 :lol:

萌辉 发表于 2013-11-20 19:10:48

1236 发表于 2013-11-20 11:02 static/image/common/back.gif
我怎么感觉这么简单的问题,被你复杂化了呢,刚刚看了你u命令反汇编后的机器码是E8F6,也就代表向上跳转了 ...

谢谢,明白了

萌辉 发表于 2013-11-20 19:11:53

7ghost 发表于 2013-11-20 13:05 static/image/common/back.gif
师兄 或者师姐 接你的平台用一下谢谢di =8 ,si=20他们是怎么来的呢

分别是标号s和s2的偏移地址

萌辉 发表于 2013-11-20 19:21:45

vitamin 发表于 2013-11-20 10:40 static/image/common/back.gif
8位位移是编译器算出来的。读取指令的同时,IP自增,然后cpu根据当前IP值和位移共同算出目标地址。

可明白了,谢谢帮我回答

7ghost 发表于 2013-11-20 21:00:33

thanks !! :lol:

1236 发表于 2013-11-20 21:27:39

萌辉 发表于 2013-11-20 19:10 static/image/common/back.gif
谢谢,明白了

恩,加油,32位汇编后,直接进军反汇编,相信你会成功的

萌辉 发表于 2013-11-20 22:42:33

1236 发表于 2013-11-20 21:27 static/image/common/back.gif
恩,加油,32位汇编后,直接进军反汇编,相信你会成功的

其实我学习汇编是为了玩单片机的:big
页: [1]
查看完整版本: jmp short 标号的计算