C 如何在x86汇编中使用“调用”将字符串地址推入堆栈?

C 如何在x86汇编中使用“调用”将字符串地址推入堆栈?,c,assembly,x86,instructions,C,Assembly,X86,Instructions,我想在x86汇编代码中使用call指令将字符串推入堆栈,但我找不到如何做。 详情如下: start: 80484a0: jmp 80484bc 80484a5: POP %esi ... 80484bc: call 80484a5 80484c1: .string "hello" end: AFAIK call指令将下一个指令地址放入堆栈,以便在调用后返回到该地址。因此,我希望esi应该包含字符串hello的地址,即80484c1,但它没有 gcc-c

我想在x86汇编代码中使用call指令将字符串推入堆栈,但我找不到如何做。 详情如下:

start:
    80484a0: jmp 80484bc
    80484a5: POP %esi
    ...
    80484bc: call 80484a5
    80484c1: .string "hello" 
end:
AFAIK call指令将下一个指令地址放入堆栈,以便在调用后返回到该地址。因此,我希望esi应该包含字符串hello的地址,即80484c1,但它没有

gcc-c-o代码code.s,然后 objdump-D代码打印:

使用gdb进行调试表明esi等于0x80484c1,它等于调用旁边das指令的addr,但我认为它不是我编写的字符串地址。好像那个汇编程序把我的代码转换成了


如何避免推送字符串地址?esi如何获得字符串的地址?我甚至无法理解转换后的指令。

如果要在堆栈上推送某些内容,必须显式执行。据我所知,您的代码正在按预期工作。请注意,反汇编程序无法区分数据和代码之间的差异,并且已经反汇编了字符串,就好像它的指令可能会让您感到困惑一样,而且在该调用返回后,CPU也会进行同样的操作,并且会感到困惑。首先,您说,我希望esi应该包含。。。80484c1,然后,gdb显示esi等于0x80484c1。所以你的问题应该是,为什么我希望字符串出现在垃圾汇编代码中?。正如Brendan所说,当你反汇编一个字符串时,你会得到垃圾汇编代码。请注意,这种技术会弄乱CPU的返回地址预测器,所以这很有趣,但并不实用。@Brendan对你的评论投了赞成票,我在调用后显式地推送该字符串,而不是编写.string xxx,以了解我的其他代码是否正常工作。显式地推字符串可以使我的其他代码正常工作。。。POP和call之间的部分,但写入.string xxx而不是直接推送该字符串会导致分段错误。因此,我认为我的代码没有按预期工作。
...
80484a5: POP %esi
....
80484bc: call 80484a5
80484c1: das
80484c6: jae 8048530 <end+0x66>
80484c8: js  80484ca <end>
....