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! 命令退出,我们也可以把命令绑定快捷键

    # 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


0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注