3
4

1 回答 1

8

的地址mesg可以根据程序在内存中的布局方式而有所不同。

以下将对特定地址进行硬编码,并且不会可靠地工作(或根本不工作):

    mov ecx, mesg

作为参考,第一种方法硬编码以下地址:

    mov ecx, 0x804807d

第二种方法确实有效,因为它mesg在运行时使用call指令的返回地址计算出地址。

换句话说,第一个版本仅在加载到特定地址时才有效,而第二个版本与位置无关

值得注意的是,第二版中出现的jmpcall指令使用相对寻址,这意味着操作码指定到目标的距离而不是目标的地址。这使得这些指令无论放在内存中的什么位置都可以工作。

如果您检查操作码,您会看到jmp被编码为

e9 19 00 00 00

(即向前跳转 0x19 或 25 10字节),并且call编码为

e8 e2 ff ff ff

其中0xffffffe2是一个小的负数 (-30)。

于 2013-08-08T07:50:05.060 回答