问问题
1326 次
1 回答
8
的地址mesg
可以根据程序在内存中的布局方式而有所不同。
以下将对特定地址进行硬编码,并且不会可靠地工作(或根本不工作):
mov ecx, mesg
作为参考,第一种方法硬编码以下地址:
mov ecx, 0x804807d
第二种方法确实有效,因为它mesg
在运行时使用call
指令的返回地址计算出地址。
换句话说,第一个版本仅在加载到特定地址时才有效,而第二个版本与位置无关。
值得注意的是,第二版中出现的jmp
和call
指令使用相对寻址,这意味着操作码指定到目标的距离而不是目标的地址。这使得这些指令无论放在内存中的什么位置都可以工作。
如果您检查操作码,您会看到jmp
被编码为
e9 19 00 00 00
(即向前跳转 0x19 或 25 10字节),并且call
编码为
e8 e2 ff ff ff
其中0xffffffe2
是一个小的负数 (-30)。
于 2013-08-08T07:50:05.060 回答