汇编书讲CALL指令时说CALL不能实现短转移,随后的检测点10.2中又给了那样的程序
汇编书讲CALL指令时说CALL不能实现短转移,随后的检测点10.2中又给了那样的程序,那个程序不是短转移吗?求大神普及 检测点程序如图,答案是6 这块理解 他所说的 CALL不能实现短转移 具体该怎么去理解呢? 快来大神帮忙解答下啊 有人知道吗 大神快来啊 对呀,这是近转移,不是短转移看书175页
人造人 发表于 2017-2-16 11:57
对呀,这是近转移,不是短转移
看书175页
短转移和近转移的区别不是ip偏移范围-128到127或-32768到32767吗? 图中IP变化应该没超过-128到127之间吧,所以应该属于短转移啊。然而又为什么说call不能实现短转移呢? guohuo888meng@1 发表于 2017-2-16 14:15
短转移和近转移的区别不是ip偏移范围-128到127或-32768到32767吗? 图中IP变化应该没超过-128到127之间吧 ...
短转移,偏移使用1个字节
近转移,偏移使用2个字节
这也正是 -128~127 和 -32768~32767 的来源
近转移中包含了短转移
不是说转移的远,就是远转移
你说段间转移,远不远?
可以转移到任何一个位置(包括当前指令的下一个指令)
感谢版主这么耐心教导,看了你图中的例子更不理解了,颠覆了我以前的思维。jmp far ptr既然是段间转移,不得跨段地址吗,图中转移到的段地址和jmp指令所在的段地址属于同一段地址啊,并没有跨越。
另外 短转移和近转移的区分不是看CS:ip中的ip经过跳转之后偏移了多少吗? 偏移在-128-127之间叫短转移,偏移在-32768-32767之间就叫近转移。我一直是这样理解的,是不是从这里就错了? guohuo888meng@1 发表于 2017-2-17 10:03
感谢版主这么耐心教导,看了你图中的例子更不理解了,颠覆了我以前的思维。jmp far ptr既然是段间转移,不 ...
嗯,你的确理解错了
短转移可以做到,近转移、段间转移同样可以
近转移可以做到,短转移就不一定可以(-128-127之间,短转移可以做到,超出这个范围但在-32768-32767之间近转移可以,超出-32768-32767 近转移也不行了)
段间转移可以做到短转移可以做到的近转移可以做到 还有他们做不到的 话说回来,你理解转移指令的工作原理吗? 人造人 发表于 2017-2-17 10:12
嗯,你的确理解错了
短转移可以做到,近转移、段间转移同样可以
近转移可以做到,短转移就不一定可以( ...
奥,那就对了,问题又回到帖子主题了。帖子主题图片中的程序代码的call s的跳转使得ip的变化超出了-128-127的范围了吗?cs:ip只是从1000:6偏移到了1000:7出,偏移了1个字节而已,应该是在-128-127范围内啊,所以也就属于短转移概念之内了。
我这样的理解是错在哪里了? 人造人 发表于 2017-2-17 10:13
话说回来,你理解转移指令的工作原理吗?
这个我自认为还是理解的,书上我都是一字不落的看的 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 就永远是短转移,我完全可以使用段间转移,转移到当前指令的下一条指令(如上图),请问这还叫短转移吗?
奥,我似乎明白了,最后一句点睛很好。短转移、近转移、段间转移 指的是用1个字节(叫短转移)或2个字节(叫近转移)表达偏移量 或是用段地址加偏移量的方式表达偏移量来区分定义的。并不是我以前认为的偏移量在-128-127之间就叫短转移,在-32768-32767之间就叫近转移。问题解决了,在此多谢版主的耐心指导! 本帖最后由 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
讲的好详细啊 认真看看大有收获
是的 call指令只能是短转移 不能是段转移
call指令执行的时候 push ip
ret的时候 pop ip
页:
[1]
2