1. 目标
*为什么要学习ARM汇编?
没有理由。
无用
目前流行的小软件都不是用汇编语言编写的ndk编译源码,那么你觉得呢?
学学吧,反正闲着就是闲着。 懂一点低级语言,接近计算机操作的本源,还是很爽的。
二、步骤
你好世界!
李老板的父亲李老板年轻时也是做研发的。 退休后,他打算利用业余时间练习钢笔书法。
有一天,天气晴朗,阳光明媚。 李先生喝了三巡,静下心来,泼墨,在李先生孝顺的优质宣纸上写下了Hello World!
<code data-lang="arm" style="box-sizing: border-box;font-family: Menlo, Consolas, "source code pro", Inconsolata, Monaco, "courier new", monospace;font-size: 0.9em;color: rgb(199, 37, 78);line-height: inherit;display: block;padding: 3px 7px;background: rgb(248, 245, 236);border-radius: 4px;">.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 汇编源代码ndk编译源码,有两种选择
1. 在Android手机上安装编译器。
2、使用Android NDK的交叉编译工具在笔记本上进行编译。
这里我们介绍选项2,在笔记本上交叉编译。
我的开发机器是MacOs 10.14,Android NDK安装在
/用户/fenfei/库/Android/sdk/ndk/21.3.6528147
然后在它下面
工具链/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 %r0, $1 // 把数字1 存入到 r0寄存器里面
mov %r2, $message_len // 把字符串的长度值 存入到 r2寄存器
ldr %r1, =message // 把Msg字符串的地址 存入到 r1 寄存器
其实这里我们可以理解为对系统API的调用。
调用系统API write
mov %r7, $4 // syscall 4 (write)
swi $0
而这个写入API的参数需要查看系统指南。 +/master/constants/syscalls.md
三、总结
ARM汇编不需要刻意去记忆很多指令,在分析代码的过程中可以根据需要进行检查。
1:ffshow
IT是一门文科,不是一门理科,与IT行业相似度最高的行业就是建筑房屋。 确实,相似度相当惊人。
提示:
发表评论