我想将Intel x86汇编代码转换为ARM。 我不知道如何使用堆栈。
我使用Intel的syscall编写了对execve的调用。 但是,ARM使用svc或swi。
但是我不知道如何使用这样的东西。 按下0x0068732f并按下0x6e69622f
.globl main
main:
push 0x0068732f
push 0x6e69622f
mov edx, 0
mov ecx, 0
mov ebx, esp
mov eax, 11
int 0x80
mov ebx, 0
mov eax, 1
int 0x80
arm上的syscall希望使用swi如下所示:
.global _start
_start:
?????
mov r7, #11
swi #0
_exit:
mov r7, #1
swi #0
我想使用堆栈推送方法而不是.ascii方法。
答案 0 :(得分:3)
man syscall
arch/ABI instruction syscall # retval error Notes
────────────────────────────────────────────────────────────────────
arm/EABI swi 0x0 r7 r0 -
x32 syscall rax rax - [5]
arch/ABI arg1 arg2 arg3 arg4 arg5 arg6 arg7 Notes
──────────────────────────────────────────────────────────────
arm/EABI r0 r1 r2 r3 r4 r5 r6
请参阅:ARM constants
.global _start
.equ label1, 0x0068732f
.equ label2, 0x6e69622f
_start:
movw r3, #:lower16:label1
movt r3, #:upper16:label1
movw r2, #:lower16:label2
movt r2, #:upper16:label2
push {r2,r3}
mov R3, #0
mov R2, #0
mov R1, #0
mov r0, sp
mov r7, #11
swi #0
_exit:
mov r0, #0
mov r7, #1
swi #0
大多数现代ARM CPU将支持movw
/ movt
。还有其他方法可以做到这一点。但是它们就像'.ascii',因为ARM代码可以包含常量。这是上面博客中讨论的旧样式。我可能在上面的代码中混合了一些顺序,但是我认为这是正确的。