使用IA32调用绝对地址时出现问题

时间:2015-10-28 19:55:33

标签: assembly x86 call att

我试图使用call指令输入另一个函数 这些是我的尝试:

call 0x08048b98

出于某种原因,这只是调用0x5d6cc555而我不知道从哪里获取该值。

mov eax, 0x08048b98
call eax

这给我一个mov指令的段错误。

我知道我必须遗漏一些东西,但我已经工作了好几个小时而无法解决问题。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

正如评论中所指出的,只需使用call 0xdeadbeef即可。我现在已经验证了这一点,它也适用于我的机器。所以下面的答案是没用的。我仍然会把它留在这里,所以没有人后来发现这个问题而且失望地认为没有答案 我希望代码示例对其他一些初学者仍然有用。

假设ia-32表示GAS语法,应该可以使用*将其指定为绝对地址(而不是相对跳转),并$将其指定为常量而不是让它从这个地址加载值 因此,如果它是

,那将是有意义的
call *$0xdeadbeef

但这不起作用。所以这里有一些看似有用的建议。

对于32位(gcc -m32),我知道以下工作:

movl $0xdeadbeef, %edi
call *%edi

对于64位,您可能需要使用%rdi代替。

另一个选项,如果您不想使用reg ,则使用标签:

.section .text
.globl main
main:
        movl $0x3, %eax        # some other instructions
        call *(THE_ADDR)       # call to your constant absolute address
        ret                    # some other instructions
THE_ADDR:
        .long 0x80483e6        # your constant absolute address
other_func:                    # here is 0x80483e6
        movl $0x4, %eax        # this code is executed

同样,这是32位AT& T GAS语法汇编代码,与gcc -m32汇编。

为了完整起见:

mov eax, 0x08048b98
    call eax
     

这给了我mov命令的seg错误。   这是因为如果您正在使用GAS语法,那么您正试图将eax移动到该地址。它宁愿是mov $0x08048b98, %eax

This Q&A也可以为您提供帮助。