public

c++ hello world反汇编

linux/aarch64/hello_world.md

   0x000000555555c5d8 <+0>:     sub     sp, sp, #0x30
   0x000000555555c5dc <+4>:     stp     x29, x30, [sp, #32]
   0x000000555555c5e0 <+8>:     add     x29, sp, #0x20
   0x000000555555c5e4 <+12>:    mov     w8, wzr
   0x000000555555c5e8 <+16>:    str     w8, [sp, #12]
   0x000000555555c5ec <+20>:    stur    wzr, [x29, #-4]
   0x000000555555c5f0 <+24>:    stur    w0, [x29, #-8]
   0x000000555555c5f4 <+28>:    str     x1, [sp, #16]
=> 0x000000555555c5f8 <+32>:    adrp    x0, 0x5555565000
   0x000000555555c5fc <+36>:    ldr     x0, [x0, #3136]
   0x000000555555c600 <+40>:    nop
   0x000000555555c604 <+44>:    adr     x1, 0x555555640b
   0x000000555555c608 <+48>:    bl      0x555555c628 <_ZNSt6__ndk1lsB8ne180000INS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc>
   0x000000555555c60c <+52>:    nop
   0x000000555555c610 <+56>:    adr     x1, 0x555555c69c <_ZNSt6__ndk14endlB8ne180000IcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_>
   0x000000555555c614 <+60>:    bl      0x555555c670 <_ZNSt6__ndk113basic_ostreamIcNS_11char_traitsIcEEElsB8ne180000EPFRS3_S4_E>
   0x000000555555c618 <+64>:    ldr     w0, [sp, #12]
   0x000000555555c61c <+68>:    ldp     x29, x30, [sp, #32]
   0x000000555555c620 <+72>:    add     sp, sp, #0x30
   0x000000555555c624 <+76>:    ret

这是一段ARM64架构上的函数汇编代码。以下是逐行解释:


函数的主要功能

从汇编来看,这段代码涉及栈操作、寄存器保存/恢复以及函数调用。它可能是一个简单的 C++ 程序的函数实现,包含输出操作和结束返回值的设置。


逐行解释

函数的开头:栈帧初始化

0x000000555555c5d8 <+0>:     sub     sp, sp, #0x30
0x000000555555c5dc <+4>:     stp     x29, x30, [sp, #32]
0x000000555555c5e0 <+8>:     add     x29, sp, #0x20

局部变量初始化

0x000000555555c5e4 <+12>:    mov     w8, wzr
0x000000555555c5e8 <+16>:    str     w8, [sp, #12]
0x000000555555c5ec <+20>:    stur    wzr, [x29, #-4]
0x000000555555c5f0 <+24>:    stur    w0, [x29, #-8]
0x000000555555c5f4 <+28>:    str     x1, [sp, #16]

代码段的主要逻辑

0x000000555555c5f8 <+32>:    adrp    x0, 0x5555565000
0x000000555555c5fc <+36>:    ldr     x0, [x0, #3136]

函数调用:C++ 输出

0x000000555555c604 <+44>:    adr     x1, 0x555555640b
0x000000555555c608 <+48>:    bl      0x555555c628

栈帧清理与返回

0x000000555555c61c <+68>:    ldp     x29, x30, [sp, #32]
0x000000555555c620 <+72>:    add     sp, sp, #0x30
0x000000555555c624 <+76>:    ret

总结

这段代码主要完成以下任务:

  1. 初始化栈帧,保存上下文。
  2. 初始化局部变量和参数。
  3. 调用某个输出函数(可能是 C++ 的 std::cout)。
  4. 清理栈帧,返回调用者。

如果这段代码是反汇编的 C++ 函数,可能对应的逻辑是:

void example(int arg1) {
    int x = 0;
    std::cout << "Some string" << std::endl;
    return x;
}

从汇编代码的特点可以判断出这是 ARM64 指令集架构。以下是具体的依据:


1. 寄存器命名规则


2. 指令格式

ARM64 的指令通常固定为 32 位长,并且遵循特定格式:


3. 栈操作习惯


4. ADR 和 ADRP 指令


5. 链接和调用约定


6. 代码风格


总结

根据上述特点,这段代码显然是基于 ARM64(AArch64)架构 的汇编代码,而非其他架构(如 x86-64 或 ARM32)。