一、目标

一、目标

  • 为什么要学ARM汇编?

不为什么。

  • 学了ARM汇编有用吗?

没啥用

  • 学完ARM汇编能找到工作吗?

目前流行的大型软件,没有一个是拿汇编写的,所以你觉得呢?

  • 那你还要学ARM汇编吗?

学学吧,反正闲着也是闲着。会点低级语言,接近计算机运行的本源,还是很拉风的。

二、步骤

Hello World!

李老板他爹,老李老板年轻的时候也是做研发的,退休了闲下来,计划练练毛笔字。

某日,风和日丽,老李老板酒过三巡,气定闲神,挥毫泼墨,在小李老板孝敬的上等宣纸上写下了 Hello World!

.text

.globl _start

_start:
    mov     %r0, $1				// fd 1 (stdout)
    ldr     %r1, =message
    mov     %r2, $message_len
    mov     %r7, $4				// syscall 4 (write)
    swi     $0

    mov     %r0, $0				// exit status 0 (ok)
    mov     %r7, $1				// syscall 1 (exit)
    swi     $0

.data

message:
    .ascii      "Hello World!\n"
message_len = . - message

编译

要编译这个ARM汇编源码,有两种方案

1、在Android手机上安装编译器。

2、在电脑上用Android NDK的交叉编译工具来编译。

这里我们介绍方案2,在电脑上来交叉编译。

我的开发机是 MacOs 10.14, Android NDK安装在

/Users/fenfei/Library/Android/sdk/ndk/21.3.6528147

那么在其下

toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/

目录中可以找到

arm-linux-androideabi-as和arm-linux-androideabi-ld

windows的同学应该可以在类似目录找到arm-linux-androideabi-as.exe和arm-linux-androideabi-ld.exe

这就是ARM汇编的编译程序和链接程序

# 将.S ARM汇编源码 编译成 .o 目标文件
arm-linux-androideabi-as -o hello.o hello.S
# 将.o 目标文件 链接成 可执行文件  hello
arm-linux-androideabi-ld -o hello hello.o

adb push hello /data/local/tmp/hello
adb shell chmod +x /data/local/tmp/hello
adb shell /data/local/tmp/hello

完美,人生第一个ARM汇编程序跑起来了,同样是 Hello World! 老李老板应该和我们有不一样的领悟。

敲黑板

每行ARM汇编代码的第一个单词我们称之为 汇编指令。

r0-rX 我们称为寄存器,可以理解成CPU自带的变量,访问速度比内存快的多,但是数量有限。

hello程序里面一共有 mov ldr swi 三个指令

  • MOV 数据操作指令
mov %r0, $1				 // 把数字1 存入到 r0寄存器里面
mov %r2, $message_len    // 把字符串的长度值  存入到 r2寄存器
  • LDR 内存操作指令
ldr %r1, =message		// 把Msg字符串的地址  存入到 r1 寄存器
  • SWI 软中断指令

实际上在这里我们可以把它理解成系统API的调用。

调用系统API write

mov     %r7, $4			// syscall 4 (write)
swi     $0

而这个write API 的参数就需要查系统手册了。 https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md

三、总结

ARM汇编不需要刻意去记一大堆指令,在分析代码的过程中随用随查即可。

ffshow
1:ffshow

IT是工科,不是理科,和IT行业相似度最高的行业是盖楼房。真的,相似度相当惊人。

100

关注微信公众号,最新技术干货实时推送

100