APCS ARM 寄存器命名 详细见: ARM汇编指令(中文版).chm
- APCS,ARM 过程调用标准(ARM Procedure Call Standard),提供了紧凑的编写例程的一种机制,定义的例程可以与其他例程交织在一起。最显著的一点是对这些例程来自哪里没有明确的限制。它们可以编译自 C、 Pascal、也可以是用汇编语言写成的。
- APCS 对我们通常称为 R0 到 R14 的寄存器起了不同的名字。使用汇编器预处理器的功能,你可以定义 R0 等名字,但在你修改其他人写的代码的时候,最好还是学习使用 APCS 名字。
- 为了理解文章,你要了解表格中寄存器意义; 想了解更多请下载文档
寄存器名字 ARM汇编指令(中文版).chm
Reg# | APCS | 意义 |
---|---|---|
R0 | a1 | 工作寄存器 |
R1 | a2 | … |
R2 | a3 | … |
R3 | a4 | … |
R4 | v1 | 必须保护 |
R5 | v2 | … |
R6 | v3 | … |
R7 | v4 | … |
R8 | v5 | … |
R9 | v6 | … |
R10 | sl | 栈限制 |
R11 | fp | 桢指针 |
R12 | ip | 内部程序调用寄存器 |
R13 | sp | 栈指针 |
R14 | lr | 连接寄存器 |
R15 | pc | 程序计数器 |
编译C语言代码,反汇编成ARM代码步骤
- 1.编译C语言源码
a.c
int main()
{
int i = 5;
int b = 4;
int ret = i * b;
return ret ;
}
- 2.使用gcc编译器编译 ‘a.c’,同时也可以使用 -S 参数先C源码,抓换成汇编源码
a.s
,再使用gcc编译汇编源码也行
gcc a.c
gcc -S a.c
gcc a.s
- 3.程序编译后文件名是
a.out
,使用objdump
可以把程序反汇编
objdump -d a.out > a.txt
./a.out # 运行程序
echo $? # 使用echo显示运行结果
- 4.VIM 打开多个文件,学习C语言和汇编代码对应语句翻译
vim -O a.txt a.s -c /<main> -c "sp a.c"
# 这行vim命令拆成三行来理解
vim -O a.txt a.s # 打开2个文件左右排列
# 在文件 a.txt 执行搜索 '<main>' 函数命令
# 在当前文件分窗口打开 a.c 文件
# 你也可以改成以下语句会有不同的效果
vim -O a.txt a.s -c "tabedit a.c"
vim -p a.txt a.s a.c
- 5.使用VIM打开多文件,使用
:qa!
命令退出,我们也可以把命令绑定快捷键 <F10>
# vim ~/.vimrc 文件添加快捷键绑定
" Vim不保存退出 按F10
map <F10> :call Exit()<CR>
func! Exit()
exec "qa!"
endfunc
使用脚本完成以上步骤演示
编译C语言,显示汇编代码脚本: vc.sh
name=$1
if [[ -z "${name}" ]]; then
read -p ":: 1.请输入C语言文件名称,不要扩展名: " name
fi
if [[ ! -z "${name}" ]]; then
echo "当前C语言文件名: ${name}.c"
echo ":: 2.自动编译和汇编反汇编..."
gcc ${name}.c
gcc -S ${name}.c
objdump -d a.out > ${name}.txt
echo ":: 3.运行程序,显示返回值"
./a.out
echo $?
echo ":: 4.VIM 显示源码和汇编码"
vim -O $name.txt $name.s -c /<main> -c "sp ${name}.c"
# :sp name.s # 插入汇编文件
# :qa! # F10 退出
fi
感谢大佬提供工具网站: https://gcc.godbolt.org/
长期以来,插件通知一直是 WordPress 中的一个问题。上周我在 Slack 上看到一个对话,一个开发人员说他认为他们已经失控了,然后发布了这个截图: 如此多的通知您甚至看不到仪表板内容。 有一个管理 Notifications 的核心项目,但在一个有希望…
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧
请登录后发表评论
注册