点亮一个LED之参数传递规则
1 说明
实验平台: JZ2440
CPU: S3C2440
2 ARM-THUMB Procedure Call Standard(ATPCS: ARM-Thumb过程调用标准)
图1 ATPCS中各寄存器的使用规则和名称
2.1 数据栈结构
我们使用的栈结构为FD(Full Descending)类型。注意:栈基址所指向的内存单元,不存放数据。
图2 栈结构
2.2 参数传递规则
根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的的子程序。
2.2.1 参数个数可变的子程序传递规则
参数传递时,可以将所有参数看作是存放在连续的存储字单元中的字数据。
当参数个数不超过4个时,使用寄存器R0-R3来传递参数,依次将各个字数据分别传送到寄存器R0-R3中去。
当参数个数超过4个时,还需使用数据栈来传递参数,把前4个字数据分别传送到寄存器R0-R3中去,剩余的字数据传送到数据栈中,需要注意的是,入栈顺序与参数顺序相反,即最后一个字数据先入栈。
2.2.2 参数个数固定的子程序传递规则
第一个整数参数通过寄存器R0-R3来传递,其他参数通过数据栈传递。
2.2.3 子程序结果返回规则
结果为一个32位的整数时,可以通过寄存器R0来返回。
结果为一个64位的整数时,可以通过寄存器R0和R1来返回,以此类推。
对于位数更多的结果,需要通过内存来反回。
3 反汇编代码分析
附录1:源码
Start.S
main.c
附录2:参考文献
《嵌入式Linux应用开发》
《ARM体系结构与编程》
《S3C2440A_UserManual_Rev13》
点亮一个LED之参数传递规则的更多相关文章
- 点亮一个led灯
/********************************* 代码功能:点亮一个led灯 使用函数: pinMode(引脚号,模式); digitalWrite(引脚号,电平状态); //默认 ...
- 点亮一个led
1:RS232电平:计算机串口 高电平为-12v,低电平为+12v,所以计算机与单片机进行通信的时候需要加电平转换芯片max232(高电平为-9到-12,低电平为+3到+12之间的. max232通常 ...
- 从点亮一个LED开始,Cortex-A9裸机程序设计
电路原理图: 如何点亮一个LED? 通过对原理图进行分析,我们能够发现给三极管的基极加上一个高点平时,三级管be结导通构成通路,此时二极管就点亮了.若要将LED熄灭只需取消高电平输出. 如何使三级管基 ...
- 进阶之路(基础篇) - 001 亮一个led灯
/********************************* 代码功能:点亮一个led灯 使用函数: pinMode(引脚号,模式); digitalWrite(引脚号,电平状态); //默认 ...
- 单片机基础——使用GPIO输出点亮一个LED灯
1. 准备工作 硬件准备 开发板首先需要准备一个小熊派IoT开发板,并通过USB线与电脑连接. 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码,可参考MDK安装教程 ...
- STM32学习笔记(一)——点亮一个LED
引言 最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到 ...
- 第一个程序点亮一个LED灯
#include <reg52.h> // 引用52包文件 可以理解为命名空间 sbit P1_0 = P1^0; // 定义P1管脚0 void main() ...
- linux IMX6 汇编点亮一个LED灯
驱动Linux引脚与驱动STM32其实是一样的,都是在操作寄存器,在相应的寄存器上附上相应的值即可驱动. IMX6U手册上有各个管脚的命名,跟STM32不同,IOMUXC_SW_MUC_CTL_PAD ...
- 《STM32CubeMX配置STM32H743XI工程》第一讲《初始化UART,重定义printf函数,点亮一个LED灯》
1.打开STM32CubeMX软件->新建一个工程(软件自行到ST官网下载安装) 2.输入对应的芯片型号(本次基于野火STM32H743XI Pro 开发板)点击Start Project生成项 ...
随机推荐
- 树莓派4B踩坑指南 - (4)输入法和字体
输入法和字体 fcitx 安装谷歌输入法和sunpinyin,哪个不用可以装完卸载: sudo apt-get install fcitx fcitx-googlepinyin fcitx-modul ...
- mybatis利用generator自动生成的代码
/** * 排序规则 */ protected String orderByClause; /** * 去重规则 */ protected boolean distinct; /** * where条 ...
- 为kubernetes-dashboard页面增加过期时间,减少登录次数.
方法很多,最简单的就是登录后,找到Deployments 服务, 右侧界面会出现kubernetes-dashboard的项目,如果没出现,那么在namespace那里选择全部名称空间. ports: ...
- Codeforces1301C. Ayoub's function
本题的收获是,要学会反向思维,正向找包含1的太多,我们就反向找,全排列-只有0的不满足题意的就是答案,一共有n-m个0,m个1,插空法,一共有m+1个地方可以插入0序列,总排列数为(n+1)*n/2, ...
- 测试人员如何使用Git
测试人员如何使用Git? 首先Git的安装,这里不多做阐述,直接去Git官方网站下载后并傻瓜式安装即可. 如何判定已安装好Git呢? ------------- 随便打开一个目录,鼠标右键点击可看到 ...
- JAVA版StarDict星际译王简单实现
由胡正开发的星际译王是Linux平台上很强大的一个开源的翻译软件(也有Windows版本的)支持多种词库.多种语言版本.尤其词库设计比较合理.之前看到一篇博文<星际译王词库应用-自制英汉词典&g ...
- .NET List<T>Conat vs AddRange
最大的不同在于AddRange改变了它所调用的列表,而Concat创建了一个新的List.因此它们有不同的用途. Concat也是一种适用于任何IEnumerable的扩展方法,并返回一个IEnume ...
- 【快学springboot】9.使用 @Transactional 注解配置事务管理
介绍 springboot对数据库事务的使用非常的方便,只需要在方法上添加@Transactional注解即可.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编程式和声明式的 ...
- C++ 类构造函数 & 析构函数
前言: 析构函数和构造函数是一对.构造函数用于创建对象,而析构函数是用来撤销对象.简单的说:一个对象出生的时候,使用构造函数,死掉的时候,使用析构函数.构造函数 和 析构函数 各有各的用途,在构造函数 ...
- pytorch梯度下降法讲解(非常详细)
pytorch随机梯度下降法1.梯度.偏微分以及梯度的区别和联系(1)导数是指一元函数对于自变量求导得到的数值,它是一个标量,反映了函数的变化趋势:(2)偏微分是多元函数对各个自变量求导得到的,它反映 ...