为学习ARM汇编写了个逼格很高的脚本

73次阅读
没有评论

arm.webp

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

111.png

  • 5.使用VIM打开多文件,使用 :qa! 命令退出,我们也可以把命令绑定快捷键 <F10>
# vim  ~/.vimrc 文件添加快捷键绑定
" Vim不保存退出 按F10
map <F10> :call Exit()<CR>
func! Exit()
    exec "qa!"
endfunc

使用脚本完成以上步骤演示

vc_sh.gif

编译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/

gcc.webp

相关推荐: 控制 WordPress 插件和主题通知

长期以来,插件通知一直是 WordPress 中的一个问题。上周我在 Slack 上看到一个对话,一个开发人员说他认为他们已经失控了,然后发布了这个截图: 如此多的通知您甚至看不到仪表板内容。 有一个管理 Notifications 的核心项目,但在一个有希望…

正文完
 0
评论(没有评论)