什么是gcc ARM等效于此x64程序集

时间:2013-10-23 12:53:02

标签: c gcc assembly arm

这是X64代码(我不太了解程序集,这个代码可以由visual studio编译,不知道它是哪种格式):

.code
extern mProcs:QWORD

myfunc proc
jmp mProcs[1*8]   
myfunc endp

mProcs是一个用C代码定义的数组,函数myfunc只是jmp到数组中的第二个元素。如果从C查看,则跳转到*(mProcs + 1)(1 * 8,因为在x64中指针是8个字节)。

在GCC ARM版本中,我尝试这样做:

.extern mProcs
.global myfunc
myfunc:
    b mProcs+4

(这里mProcs + 4因为指针是4个字节)

但是这段代码似乎没有用。在C中它是否意味着跳转到*(mProcs + 1)或跳转到mProcs + 1? 我该怎么做*(mProcs + 1)?

=============================================== =============================

在与Michael的评论中讨论后,我明白我需要对寄存器进行计算,然后使用bx指令跳转到目标函数。

然而,问题来了。 因为我正在实现一个thunk(我正在拦截函数调用并在中间执行某些操作),所以我不知道目标例程如何使用寄存器。

1。我需要在jmp到目标之前保留被调用者保存寄存器,否则目标函数将保留错误的值。

2. 我需要在执行跳转之前保持参数寄存器的完整性,以便目标函数具有正确的参数。 3.以上2点意味着我只能使用调用者保存但非参数寄存器。

r0-r3是参数寄存器,r4-r12是被调用保存寄存器,r13以后是特殊寄存器。

这意味着如果不恢复该值,则不能使用任何寄存器。

如果bx指令只能在寄存器上操作,那么即使该寄存器暂时保存在堆栈中,也无法恢复该寄存器。

任何解决方案?或者只是手臂二进制文件无法挂钩。

0 个答案:

没有答案