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 <puts@plt>  //跳转到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 节


猜你喜欢

转载自blog.csdn.net/EMH1899/article/details/83110724