一、目标
- 为什么要学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汇编不需要刻意去记一大堆指令,在分析代码的过程中随用随查即可。
IT是工科,不是理科,和IT行业相似度最高的行业是盖楼房。真的,相似度相当惊人。
关注微信公众号,最新技术干货实时推送
文章作者 奋飞
上次更新 2021-04-12
许可协议 奋飞安全原创,转载请注明出处。