guohuo888meng@1 发表于 2017-2-13 14:27:26

汇编书讲CALL指令时说CALL不能实现短转移,随后的检测点10.2中又给了那样的程序

汇编书讲CALL指令时说CALL不能实现短转移,随后的检测点10.2中又给了那样的程序,那个程序不是短转移吗?求大神普及

guohuo888meng@1 发表于 2017-2-13 14:28:24

检测点程序如图,答案是6 这块理解

guohuo888meng@1 发表于 2017-2-13 14:33:16

他所说的 CALL不能实现短转移 具体该怎么去理解呢?

guohuo888meng@1 发表于 2017-2-15 09:41:27

快来大神帮忙解答下啊

guohuo888meng@1 发表于 2017-2-15 15:25:56

有人知道吗

guohuo888meng@1 发表于 2017-2-16 10:16:56

大神快来啊

人造人 发表于 2017-2-16 11:57:09

对呀,这是近转移,不是短转移
看书175页

guohuo888meng@1 发表于 2017-2-16 14:15:14

人造人 发表于 2017-2-16 11:57
对呀,这是近转移,不是短转移
看书175页

短转移和近转移的区别不是ip偏移范围-128到127或-32768到32767吗? 图中IP变化应该没超过-128到127之间吧,所以应该属于短转移啊。然而又为什么说call不能实现短转移呢?

人造人 发表于 2017-2-16 17:38:09

guohuo888meng@1 发表于 2017-2-16 14:15
短转移和近转移的区别不是ip偏移范围-128到127或-32768到32767吗? 图中IP变化应该没超过-128到127之间吧 ...

短转移,偏移使用1个字节
近转移,偏移使用2个字节

这也正是 -128~127 和 -32768~32767 的来源
近转移中包含了短转移

不是说转移的远,就是远转移
你说段间转移,远不远?
可以转移到任何一个位置(包括当前指令的下一个指令)

guohuo888meng@1 发表于 2017-2-17 10:03:22

感谢版主这么耐心教导,看了你图中的例子更不理解了,颠覆了我以前的思维。jmp far ptr既然是段间转移,不得跨段地址吗,图中转移到的段地址和jmp指令所在的段地址属于同一段地址啊,并没有跨越。
另外 短转移和近转移的区分不是看CS:ip中的ip经过跳转之后偏移了多少吗? 偏移在-128-127之间叫短转移,偏移在-32768-32767之间就叫近转移。我一直是这样理解的,是不是从这里就错了?

人造人 发表于 2017-2-17 10:12:46

guohuo888meng@1 发表于 2017-2-17 10:03
感谢版主这么耐心教导,看了你图中的例子更不理解了,颠覆了我以前的思维。jmp far ptr既然是段间转移,不 ...

嗯,你的确理解错了
短转移可以做到,近转移、段间转移同样可以
近转移可以做到,短转移就不一定可以(-128-127之间,短转移可以做到,超出这个范围但在-32768-32767之间近转移可以,超出-32768-32767 近转移也不行了)
段间转移可以做到短转移可以做到的近转移可以做到 还有他们做不到的

人造人 发表于 2017-2-17 10:13:22

话说回来,你理解转移指令的工作原理吗?

guohuo888meng@1 发表于 2017-2-17 11:37:37

人造人 发表于 2017-2-17 10:12
嗯,你的确理解错了
短转移可以做到,近转移、段间转移同样可以
近转移可以做到,短转移就不一定可以( ...

奥,那就对了,问题又回到帖子主题了。帖子主题图片中的程序代码的call s的跳转使得ip的变化超出了-128-127的范围了吗?cs:ip只是从1000:6偏移到了1000:7出,偏移了1个字节而已,应该是在-128-127范围内啊,所以也就属于短转移概念之内了。
我这样的理解是错在哪里了?

guohuo888meng@1 发表于 2017-2-17 11:38:25

人造人 发表于 2017-2-17 10:13
话说回来,你理解转移指令的工作原理吗?

这个我自认为还是理解的,书上我都是一字不落的看的

人造人 发表于 2017-2-17 16:07:34

guohuo888meng@1 发表于 2017-2-17 11:38
这个我自认为还是理解的,书上我都是一字不落的看的



看图
jmp short s在debug中是   jmp 000a
jmp near ptr s 在debug中也是 jmp 000a,但是机器指令不一样

eb08               jmp 000a            ;eb 表示短转移,偏移使用一个字节,也就是现在的 08
e90500         jmp 000a            ;e9 表示近转移,偏移使用两个字节,也就是现在的 0005(你应该可以明白为什么是0005,不是0500^_^)
ea0a00530b   jmp 0b53:000a   ;ea 表示段间转移,这里就不是偏移了^_^

ea 表示段间转移,ea后面的是ip和cs,ip 是 000a,cs 是0b53(注意nop指令的地址,是不是0b53:000a)

短转移、近转移、段间转移 指的是这个,不是看偏移量的,不是说偏移没有超过 -128-127 就永远是短转移,我完全可以使用段间转移,转移到当前指令的下一条指令(如上图),请问这还叫短转移吗?

guohuo888meng@1 发表于 2017-2-17 17:05:30

奥,我似乎明白了,最后一句点睛很好。短转移、近转移、段间转移 指的是用1个字节(叫短转移)或2个字节(叫近转移)表达偏移量 或是用段地址加偏移量的方式表达偏移量来区分定义的。并不是我以前认为的偏移量在-128-127之间就叫短转移,在-32768-32767之间就叫近转移。问题解决了,在此多谢版主的耐心指导!

guohuo888meng@1 发表于 2017-2-17 17:07:23

本帖最后由 guohuo888meng@1 于 2017-2-17 17:08 编辑

人造人 发表于 2017-2-17 16:07
看图
jmp short s在debug中是   jmp 000a
jmp near ptr s 在debug中也是 jmp 000a,但是机器指令 ...

奥,我似乎明白了,最后一句点睛很好。短转移、近转移、段间转移 指的是用1个字节(叫短转移)或2个字节(叫近转移)表达偏移量 或是用段地址加偏移量的方式表达来区分定义的。并不是我以前认为的偏移量在-128-127之间就叫短转移,在-32768-32767之间就叫近转移。问题解决了,在此多谢版主的耐心指导!

helloTOM 发表于 2017-3-31 03:03:48

讲的好详细啊   认真看看大有收获

guohuo888meng@1 发表于 2017-3-31 16:32:36

helloTOM 发表于 2017-3-31 03:03
讲的好详细啊   认真看看大有收获

是的

最终的执念 发表于 2017-4-2 10:56:38

call指令只能是短转移   不能是段转移
call指令执行的时候   push ip
ret的时候    pop ip
页: [1] 2
查看完整版本: 汇编书讲CALL指令时说CALL不能实现短转移,随后的检测点10.2中又给了那样的程序