单片机本质——函数参数传递

本文详细探讨了RL78/G13单片机中函数参数传递的过程,从C代码到反汇编,再到分析。在单参数函数中,参数通过通用寄存器AX传递,然后压栈,执行函数体时,相关寄存器HL也会压栈。函数结束后,栈指针恢复,数据出栈。对于多参数函数的情况,未进一步展开说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

● IDE : RENESAS CubeSuiteW+

● MCU : RL78/G13

1 单参数函数

       1.1 C代码

void func(int arg1){
	int m,n;
	m = arg1 + 2;
	n = m - 3;
	NOP();
}
void main(void)
{
	func(0xF1);
    while (1);
}

    1.2 反汇编



    1.3 分析

在func()的主调函数调用func()时:

1)首先将实参0xF1写入通用寄存器AX,利用寄存器传递参数

2)跳转到函数体

3)将参与函数体内部运算相关的通用寄存器HL压栈

4)将用于参数传递的AX压栈(参数入栈区,此栈地址即为形参arg1的分配地址) 

5)将栈指针向下移动两字后的地址写入HL寄存器(形参arg1的分配地址向下依次代表函数本地变量m,n的地址

6)之后便利用通用寄存器AX和HL执行函数体运算,实现函数功能</

### 单片机中函数传入数组的方式 在单片机编程中,C语言提供了多种方式可以通过函数参数传递数组。以下是几种常见的方法及其说明: #### 方法一:通过指针传递数组 当需要将数组作为参数传递到函数时,可以直接传递指向该数组第一个元素的指针。这种方式不会复制整个数组的内容,而是仅传递其内存地址。 ```c void processArray(int *arr, int size) { for (int i = 0; i < size; ++i) { printf("%d ", arr[i]); } } // 调用示例 int main() { int array[] = {1, 2, 3, 4, 5}; int length = sizeof(array)/sizeof(array[0]); processArray(array, length); // 输出数组内容 } ``` 这种方法利用了数组名本质上是一个指向首元素的常量指针这一特性[^1]。 --- #### 方法二:通过数组形式声明形参 虽然语法上看起来像是接收了一个完整的数组,但实际上编译器会将其转换为指针类型处理。因此,这种写法与上述方法效果相同。 ```c void processArray(int arr[], int size) { for (int i = 0; i < size; ++i) { printf("%d ", arr[i]); } } // 调用示例同前一种方法一致。 ``` 此方法更直观地表明了意图——即操作的是一个数组而非单一变量。 --- #### 方法三:使用结构体封装数组 如果除了数据本身外还需要附加其他信息(比如长度),则可以考虑创建包含这些成员的一个小型结构体来一起传输。 ```c typedef struct { int data[10]; int count; } ArrayStruct; void processData(ArrayStruct as) { for (int i = 0; i < as.count && i < 10; ++i){ printf("%d ",as.data[i]); } } // 使用实例 int main(){ ArrayStruct myArr = {{1,2,3},3}; processData(myArr); } ``` 这里需要注意的是,由于是按值拷贝整个结构体对象进入函数内部副本之中,所以对于大型的数据集来说可能效率较低[^2]。 --- #### 注意事项 - **数组越界访问**:无论采用哪种方式进行数组传递,在实际应用过程中都应小心防止发生超出有效索引范围的操作。 - **动态分配管理**:如果是涉及到了堆上的资源申请,则记得适时释放以免造成泄露问题。 以上就是在嵌入式系统环境下运用标准ANSI C实现向自定义功能模块递交多维数值集合的一些技巧总结[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值