ARM assembly: Lesson 10

今天,我们来看一下基于ARM汇编,如何实现函数的调用。

基础知识

在ARM汇编中,函数的前四个参数存放于 R0~R3寄存器中, 剩余的参数存放于栈中,返回值存放于r0。在栈中存放数值,可以避免在调用过程中,数据的丢失,因为寄存器有限,并且经常被更新。

Function names in C are like labels in assembly.

The PC(program counter register) holds the address of the currently executing instruction.

函数实现

函数原型

首先,通常函数的C代码,我们基本理解我们需要干嘛------实现加法。

复制代码
int add_nums(int num1, int num2)
{
return num1 + num2;
}

int main()
{
    add_nums(1,2};
    return 0;
}

汇编实现

LR (Link Register) 用于存放函数调用后,接下来的指令的地址。

复制代码
.global _start
_start:
	
	mov r0, #1  //arg1
	mov r1,	#2	//arg2
	
	push {r0, r1}
	bl add_nums
	mov r2, r0
	pop {r0,r1}
	
add_nums:
	add r0,r0,r1
	bx lr

将r0, r1 存入栈中。这里可以观察到,sp指向的位置从0变成了一个很大的数字,在内存中查看对应的地址,可以看到,就是1,2!

在此前,我们提到了b可以作为无条件分支的关键词,此外,还有bl(branch with link)。bl除了可以进行分支之外,还可以存储PC的状态,保证在函数调用之后,回到调用之前的状态(PC地址)。

然后,通过step into,我们进入add_nums label,然后,对应的可以看到r0被更新为3. 通过bx指令,我们可以访问lr寄存器中的地址,对应的就是 mov r2, r0.

然后通过pop,我们基于栈中存储的元素更新了r0,r1,r0从3变成了1。可以观察到sp指向的地址变为0,可以理解为栈为空,但是,此前的地址中的数字并没有改变,还是1和2.

Take Away

bx lr指令用于访问存放于**Link Register (LR)**的地址。

push 和pop用于将数字存放于栈中,或者从栈中获取。

复制代码
PUSH {R0, R1}  // Push R0 and R1 onto the stack
相关推荐
切糕师学AI13 小时前
ARM 汇编指令:STM
汇编·arm开发·stm
切糕师学AI20 小时前
ARM 汇编指令:LDM
汇编·arm开发
ShiMetaPi21 小时前
GM-3568JHF丨ARM+FPGA异构开发板系列教程:外设教程 09 CAN
arm开发·fpga开发·fpga·rk3568
未来之窗软件服务21 小时前
幽冥大陆(八十)Win7环境下ARM架构开发—东方仙盟练气期
arm开发·架构·仙盟创梦ide·东方仙盟
未来之窗软件服务2 天前
国产化系统(一)ARM轻量化系统开发与试用全指南—东方仙盟练气期
arm开发·仙盟创梦ide·东方仙盟·阿雪技术观·国产化操作系统
林政硕(Cohen0415)2 天前
ARM Linux Qt Widget 虚拟键盘输入法移植
linux·arm开发·qt·键盘·输入法
100编程朱老师3 天前
Linux 下互联网络编程的基础知识
arm开发
番茄灭世神3 天前
32位ARM单片机视频教程第一篇
arm开发·单片机·嵌入式·gd32·pn学堂
驱动探索者4 天前
[缩略语大全]之[ARM CPU]篇
arm开发
ArrebolJiuZhou4 天前
00 arm开发环境的搭建
linux·arm开发·单片机·嵌入式硬件