1. 程式人生 > >C IN ARM64 彙編基礎-例項helloworld-基於The C Programming Language - Second Edition

C IN ARM64 彙編基礎-例項helloworld-基於The C Programming Language - Second Edition

可以在原始碼某個目錄下新建一個資料夾,比如frameworks/testing目錄下:

寫一個Android.mk檔案:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_SRC_FILES:= var_extern.c
LOCAL_MODULE:= var_extern
LOCAL_64_BIT_ONLY := true   //只編譯64位的庫
LOCAL_CFLAGS += -O0          //關閉優化

include $(BUILD_SHARED_LIBRARY)

 

 

1、定位Native bug的時候需要對分析彙編,所以記錄一下相關基礎

2、程式碼是在Android O版本上編譯的,64位,編譯出so庫,使用objdump工具反彙編即可

3、相關原始碼即彙編程式碼

1)原始碼:

#include <stdio.h>

#include <stdio.h>

int main()
{
    printf("Hello,world!\n");
    return 0;
}

2)彙編程式碼

00000000000005a8 <main>:
 5a8:   a9bf7bfd    stp x29, x30, [sp,#-16]! //從棧申請16個byte空間,儲存x29、x30
 5ac:   910003fd    mov x29, sp    //sp放到x29,fp此時的位置就是sp
 5b0:   90000000    adrp    x0, 0 <abitag-0x200>
 5b4:   91172000    add x0, x0, #0x5c8  //x0=x0+0x5c8,x0會作為printf函式的第一個引數
 5b8:   97ffffcc    bl  4e8 <
[email protected]
> //跳轉到4e8,輸出字串 5bc: 2a1f03e0 mov w0, wzr //w0暫存器儲存返回值0 5c0: a8c17bfd ldp x29, x30, [sp],#16 //取回fp、lr的值,彈棧 5c4: d65f03c0 ret //返回

上面是main函式對應的彙編程式碼,後面有對應的註釋

下面看一下0x5c8處的彙編:

00000000000005c8 <.rodata>:
 5c8:   6c6c6548    .word   0x6c6c6548  //可以用gdb看看十六進位制字元對應的字串,就是Hello,world!\n
 5cc:   6f772c6f    .word   0x6f772c6f
 5d0:   21646c72    .word   0x21646c72 


字串常量都是放在elf檔案的.rodata 節