逆向-beginners之三个参数

#include

int main()
{
    printf("a=%d, b=%d, c=%d\n", 1, 2, 3);
    return 0;
}


#if 0

/*
 * x86 传递3个参数
 */
    32bit:eax, ebx, ecx, edx
    64bit:rdi, rsi ...

/* 
 */
    arm 在传递参数时,通常会进行拆分:把前4个参数传递给R0~R3,然后利用栈传递其余参数。


/*
 * arm64 传递3个参数
 */
    .LC1:
        .stirng "a=%d; b=%d, c=%d"

    stp x29, x30, [sp, #-16]!    # 把FP(X29)和LR(X30)的值推送入栈
    add x29, sp, 0                # 构成栈帧
    addrp x0, .LC1
    add x0, x0, :lo12:.LC1        # 这两条对构建了字符串的指针


#endif


#if 0
/*
 * intel
 */
0000000000001149

:
    1149:    f3 0f 1e fa              endbr64 
    114d:    55                       push   %rbp
    114e:    48 89 e5                 mov    %rsp,%rbp
    1151:    b9 03 00 00 00           mov    $0x3,%ecx
    1156:    ba 02 00 00 00           mov    $0x2,%edx
    115b:    be 01 00 00 00           mov    $0x1,%esi
    1160:    48 8d 3d 9d 0e 00 00     lea    0xe9d(%rip),%rdi        # 2004 <_IO_stdin_used+0x4>
    1167:    b8 00 00 00 00           mov    $0x0,%eax
    116c:    e8 df fe ff ff           callq  1050     // printf(rdi, esi, edx, ecx)
    1171:    b8 00 00 00 00           mov    $0x0,%eax
    1176:    5d                       pop    %rbp
    1177:    c3                       retq   
    1178:    0f 1f 84 00 00 00 00     nopl   0x0(%rax,%rax,1)
    117f:    00 


/*
 * arm
 */
000000000040055c

:
  40055c:    a9bf7bfd     stp    x29, x30, [sp, #-16]!
  400560:    910003fd     mov    x29, sp
  400564:    90000000     adrp    x0, 400000 <_init-0x3e8>
  400568:    9118e000     add    x0, x0, #0x638
  40056c:    52800063     mov    w3, #0x3                       // #3
  400570:    52800042     mov    w2, #0x2                       // #2
  400574:    52800021     mov    w1, #0x1                       // #1
  400578:    97ffffb6     bl    400450
  40057c:    52800000     mov    w0, #0x0                       // #0
  400580:    a8c17bfd     ldp    x29, x30, [sp], #16        // printf(w0, w1, w2, w3)
  400584:    d65f03c0     ret

#endif
 

你可能感兴趣的:(汇编)