ARM汇编之APCS规则

2023-11-18

APCS规则简述

  1. 寄存器使用规则
    寄存器r0-r3用于函数调用过程中传递函数形参,各有一个别名 a1—a4,使用前后可以不用恢复原来的值
    R4-r11用于保存函数内部局部变量的值,每个函数使用前,必须要保存被调用函数的值,使用完毕,必须恢复原值。各有一个别名叫v1-v8.
//特殊寄存器说明
R10	sl	栈限制
R11	fp	桢指针
R12	ip	内部过程调用寄存器
R13	sp	栈指针
R14	lr	连接寄存器
R15	pc	程序计数器
  1. 栈的使用规则
//APCS规则规定,AMR的栈采用满减使用指令
Stmfd sp!,{}
Ldmfd sp!{}
Push{}
Pop{}

  1. 调用函数时参数的传递规则
    被调用的函数形参,如果小于等于四个,那么从左向右依次由r0-r3来传递参数
    如果被调用函数的形参大于四个,那么从左向右前四个依然由r0-r3传递,其余通过堆栈传递。
    函数的返回值被存入r0
汇编调用汇编函数
loop:
	mov r0,r1 //将r1的值放入r0
	add r1,r2;#32
	bl loop //调用后返回现场

汇编调用C语言函数

我们通过反汇编

arm-linux-gcc –g –mapsc arg.c 
arm-linux-gcc-objdump –Ds  arg

发现在处理函数的时候都都会有这些话,前三行和后两行,他就是对现场的布置,就是函数的跳转和返回

mov     ip, sp                  //IP=SP;保存SP
stmdb   sp!, {fp, ip, lr, pc}   //先对SP减4,再对fp,ip,lr,pc压栈。
sub     fp, ip, #4      ; 0x4   //fp=ip-4;此时fp指向栈里面的“fp”
bl       main 					//跳转到main函数

sub     sp, fp, #12     ; 0xc   //sp=fp-12;此时sp指向栈里面的lr
ldmia   sp, {fp, sp, pc}        //弹栈pc=lr,sp=ip,fp=fp。然后地址加4

纯汇编代码的编写

.text 关键字,用于声明代码段
.align 2 定义半字对齐,对齐代码
.global _start  声明全局变量.这个是程序入口声明,与链接脚本有关,链接脚本中将制定程序入口。
_start: 标号,定义程序入口。下面必须保存现场,所以需要使用5条指令

mov     ip, sp                  //IP=SP;保存SP
stmdb   sp!, {fp, ip, lr, pc}   //先对SP减4,再对fp,ip,lr,pc压栈。
sub     fp, ip, #4      ; 0x4   //fp=ip-4;此时fp指向栈里面的“fp”
bl       main 					//跳转到main函数

sub     sp, fp, #12     ; 0xc   //sp=fp-12;此时sp指向栈里面的lr
ldmia   sp, {fp, sp, pc}        //弹栈pc=lr,sp=ip,fp=fp。然后地址加4

纯汇编的编译

获取过程 arm-linux-gcc –c demo.S 编译为 .o 目标文件
Arm-linux-ld demo.o –Ttext=0x50000000 –o arm
然后用nm工具看看arm 发现入口地址被指定为50000000
但是此时生成的文件具有头信息,
File arm 查看文件信息。发现很多ASCII码,机器无法识别,需要去头。
Arm-linux-objcopy –O binary arm arm.bin  使用objcopy工具,去头。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM汇编之APCS规则 的相关文章

随机推荐

  • wordpress搭建网站

    域名 主机申请 宝塔面板使用流程 看以下这两个就够了 https blog csdn net weixin 45106434 article details 108894407 https blog csdn net qq 44721831
  • SimpleFOC无刷电机平衡小车

    前言 本科毕业于自动化 期间学习了各种电机运动控制原理 自动控制原理 但是只会考试而未究其理 最近接触到simplefoc这个基于arduino的开源无刷电机驱动库 想正好借此机会将本科学到的内容用于实际 于是就有了这个小项目 基于无刷电机
  • Ubuntu——统计目录下文件数量的方法

    统计当前目录下文件的个数 不包括目录 ls l grep wc l 参考文章 Linux 统计目录下文件数量的方法
  • scrapy保存、中断、继续执行爬虫程序

    在scrapy文件中的custom settings写入JOBDIR即可 比如 JOBDIR jobs baidu news baidu news这个位置就是当程序停止爬虫的时候当前的运行状态就会记录在这个文件中 当再次爬取时会接着保存的状
  • 已知a.txt文件中的内容为"AAbcdea22dferwplkCC321ou1", 请编写程序读取该文件内容,要求去掉重复字母(区分大小写), 并按照自然排序顺序后输出到b.txt文件中。

    package copy1 import java io BufferedReader import java io BufferedWriter import java io FileInputStream import java io
  • 2020美赛F奖论文(四):模拟退火算法驱动的结构策略设计

    上接 2020美赛F奖论文 三 足球团队指标和基于机器学习的球队表现预测 全文 2020美赛F奖论文 一 摘要 绪论和模型准备 2020美赛F奖论文 二 传球网络模型 PNM 的建立和影响因子分析 2020美赛F奖论文 三 足球团队指标和基
  • 计算机网络(1)——概念、组成、功能和分类

    文章目录 0 总揽全局 1 计算机网络的概念 2 计算机网络的功能 3 计算机网络的组成 4 计算机网络的分类 视频来源 https www bilibili com video BV19E411D78Q p 1 0 总揽全局 1 计算机网
  • 强烈推荐Linux深入学习必读的几本书

    2012 10 01 21 00 40 成为一名精通 Linux程序设计的高级程序员一直是不少朋友孜孜以求的目标 根据中华英才网统计数据 北京地区 Linux 程序员月薪平均为 Windows程序员的 1 8 倍 Java 程序员的 2 6
  • sql语句中关于1 and 1=2详解

    在通关sqli labs的时候 我经常会遇到这么一个问题 那就是 id 1 和 id 1 and 1 2 的查询结果是一致的 我一直以来都很疑惑 然后寻求了很多文章 终于解决了我的问题 我们将其放在sqlyog里面去讲解 我先给你们展示一下
  • Shell监控jvm发短信

    Shell脚本 jstat crontab curl 监控JVM发送短信 bin bash 定时监控本机器下所有java应用的 JVM信息 定时任务配置 crontab e 写入如下 5分钟执行一次检测 5 home admin monit
  • 【H5】 svg动画 旋转属性与虚线属性

    svg 动画 旋转 transform rotate angle x y 不要写在style里面 angle 旋转角度 x y旋转中心 绘制虚线 stroke dasharray a b a b c d 旋转属性 transform rot
  • 立陶宛央行抢跑数字货币背后:前瞻的区块链战略 中国已有企业布局

    7月2日 据路透社报道 立陶宛将在下周开始预售2 4万枚由央行发行的数字货币 该名为LBCoin的数字货币基于区块链技术生产 立陶宛成为是欧盟国家中第一家正式发行央行数字货币的地区 不是2015年就开始研究央行数字货币的英国 不是今年2月试
  • 人工智能芯片未来发展前景如何?

    随着深度学习技术的快速发展 以及互联网和云计算时代海量数据和高效计算能力的支撑 计算机视觉技术 语音技术 自然语言理解技术等人工智能技术取得了突破性进展 并解锁多个行业的人工智能场景 产生了巨大的商业价值 驱动了人工智能行业的发展 同时 伴
  • TEA系列加解密算法详解

    文章目录 TEA系列概述 TEA算法介绍 TEA加密过程 C语言实现 XTEA算法介绍 XTEA加密过程 C语言实现 XTEA算法介绍 XXTEA加密过程 C语言实现 参考 TEA系列概述 TEA算法是由剑桥大学计算机实验室的David W
  • python 序列化_python怎么序列化

    pickle模块 json模块 1 把变量从内存中变成可存储或传输的过程 称之为序列化 Python中叫pickling 其他语言中也被称为serialization marshalling flattening等 都是相同的意思 2 序列
  • XSS安全漏洞的防范

    XSS安全漏洞 通过URL带入的 这种带入主要是前端解析url中的参数 并对数参数执行了innerHTML 或者 html 或者 append 操作 在将参数html 或者append 到html文件中时 会执行其中的js代码 被错误用户获
  • HBase Split 过程

    看了下hbase split的代码 记录一下学习心得 Java代码 private void split final HRegion parent final byte midKey throws IOException final lon
  • chat gpt 常见角色及对应的提示词汇总

    提示词的存在让ChatGPT能够扮演特定的角色 对用户的回答更加专业对口 以下是一些常见的ChatGPT角色及对应的提示词 目录 ChatGPT 市场推广提示 ChatGPT 业务提示 ChatGPT 内容提示 Web 开发的 ChatGP
  • Ubuntu系统中防火墙的使用和开放端口

    Ubuntu系统中防火墙的使用和开放端口 目录 1 Ubuntu查看防火墙的状态 2 2 Ubuntu开启防火墙 2 3 Ubuntu添加开放SSH端口 3 4 Ubuntu防火墙常用命令 5 4 1 查看ufw防火墙的状态 5 4 2 启
  • ARM汇编之APCS规则

    APCS规则简述 寄存器使用规则 寄存器r0 r3用于函数调用过程中传递函数形参 各有一个别名 a1 a4 使用前后可以不用恢复原来的值 R4 r11用于保存函数内部局部变量的值 每个函数使用前 必须要保存被调用函数的值 使用完毕 必须恢复