我想将INTEL x86汇编代码转换为ARM

时间:2019-06-30 16:58:30

标签: assembly x86 arm intel

我想将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方法。

1 个答案:

答案 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代码可以包含常量。这是上面博客中讨论的旧样式。我可能在上面的代码中混合了一些顺序,但是我认为这是正确的。