Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
[讨论]函数调用时,参数是怎么传递的
发布于 2013-03-11 19:30:04 浏览:4030
订阅该版
_我的观点是,对于ARM CortexM3器件,B/BL等指令会自动入栈R0,R1,R2,R3,以及R12这5个寄存器,并且,如果是C函数,参数1到参数4会自动放入R0到R3中。所以在汇编程序中可以自由使用R0到R3._ [补:这个观点应该是错误的。参见二楼和三楼的回复] 参见《ARM cortex M3权威指南》(宋岩译本pdf电子版),152页底与153页顶部的介绍。 截图说明,看 rt_console_set_device(CONSOLE_DEVICE);这一句对应的汇编代码为 ```ADR r0,{pc}+2 ; BL.W rt_console_set_device``` 其中第一句是将CONSOLE_DEVICE宏对应的字符串地址值放入r0中,第二句即使用BL调用rt_console_set_device了。   
查看更多
9
个回答
默认排序
按发布时间排序
aozima
2013-03-11
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
>B/BL等指令会自动入栈R0,R1,R2,R3,以及R12这5个寄存器 --- 什么时候自动 POP 呢? [s:175]
prife
2013-03-11
这家伙很懒,什么也没写!
>>B/BL等指令会自动入栈R0,R1,R2,R3,以及R12这5个寄存器 > >--- > > >什么时候自动 POP 呢? [s:175] --- 有道理,看来还是没有自动入栈R0-R3,因为B指令也可以用来返回。ARM跟x86不同,B指令可以用来步入一个函数,也可以用来从一个函数返回。 如果硬件是自动入栈R0到R3的,那硬件怎么判断此时的B指令执行的是呼叫函数还是从函数返回呢。
grissiom
2013-03-12
这家伙很懒,什么也没写!
B 只是单纯的跳转到地址。 至于函数,应该是 C 语言以及同级语言的范畴,在汇编里还没有影子……(个人感觉)
xiao苦
2013-03-13
这家伙很懒,什么也没写!
- -实际上,你可以从CM3的手册上看到一部分说明。 其实大部分芯片,参数都靠通用寄存器来传递参数的,具体是当调用函数的时候,先把重要寄存器压栈,再把要传递的参数压到通用寄存器,返回时把结果压到寄存器的栈,然后再重压寄存器退栈,这时其实在汇编程序上你是能看到的,而用C编程的时候,一般不可见。 有一点需要重点了解的是,在芯片中,大部分C语言的的操做换成汇编,它依旧是现把数据放到通用寄存器在操作(51就是,还有瑞萨的R8C),当然,ARM也支持直接地址读写值,但是大部分情况下还是会是操作通用寄存器。 (个人陋解,欢迎拍砖)
prife
2013-03-13
这家伙很懒,什么也没写!
>B 只是单纯的跳转到地址。 > >至于函数,应该是 C 语言以及同级语言的范畴,在汇编里还没有影子……(个人感觉) --- 正是。是我以前读书读书不精,想当然才有此误解。
grissiom
2013-03-13
这家伙很懒,什么也没写!
没没~ 估计是和 NVIC 看混了吧 ;D
OXape
2013-03-14
这家伙很懒,什么也没写!
函数调用时怎么传递的,这个问题其实ARM公司有一个约定的标准,(ARM 过程调用标准)简称APCS。为什么有个标准,这就是为了让大家写的程序函数可以互相调用,C函数可以调用汇编,汇编可以调用C。 一般来说cortex-m3在编译时会用R0-R3最参数传递,而多余4个的参数需要用到堆栈,返回时返回值放在R0,也就是APCS里约定:每个函数假定R0-R3在函数调用后会改变,而其他的通用寄存器除SP,LR,PC的不会改变,也就是你如果在函数里使用R4,R5等,你要对其进行压栈操作,函数返回时要恢复。因为调用你得函数认为R4,R5它调用完你之后不会改变。 而我们写C时则不会太关心这些,不过你如果看RTOS的汇编部分,你就可以发现,却是是C在调用汇编时把第一个参数传给R0,而汇编部分这把R0当做第一个形参使用。 具体部分你可以去看下APCS 如前面童靴说汇编确实没有函数的概念,但是汇编也要传递参数,靠的也是R0等通用寄存器,所以说ARM过程调用标准规定的是汇编和C编译器汇编后的代码的标准。按照规定汇编是可以调用C函数的,只要你把要传递的参数依次放在R0到R4。一般函数4个参数够用了。 还有一点BL指令只会保存当前PC+4到LR,不会自动压栈其他寄存器 调用 [attach]1783[/attach] 返回 [attach]1782[/attach]
prife
2013-03-14
这家伙很懒,什么也没写!
>函数调用时怎么传递的,这个问题其实ARM公司有一个约定的标准,(ARM 过程调用标准)简称APCS。为什么有个标准,这就是为了让大家写的程序函数可以互相调用,C函数可以调用汇编,汇编可以调用C。 >一般来说cortex-m3在编译时会用R0-R3最参数传递,而多余4个的参数需要用到堆栈,返回时返回值放在R0,也就是APCS里约定:每个函数假定R0-R3在函数调用后会改变,而其他的通用寄存器除SP,LR,PC的不会改变,也就是你如果在函数里使用R4,R5等,你要对其进行压栈操作,函数返回时要恢复。因为调用你得函数认为R4,R5它调用完你之后不会改变。 >而我们写C时则不会太关心这些,不过你如果看RTOS的汇编部分,你就可以发现,却是是C在调用汇编时把第一个参数传给R0,而汇编部分这把R0当做第一个形参使用。 >具体部分你可以去看下APCS >如前面童靴说汇编确实没有函数的概念,但是汇编也要传递参数,靠的也是R0等通用寄存器,所以说ARM过程调用标准规定的是汇编和C编译器汇编后的代码的标准。按照规定汇编是可以调用C函数的,只要你把要传递的参数依次放在R0到R4。一般函数4个参数够用了。 >还有一点BL指令只会保存当前PC+4到LR,不会自动压栈其他寄存器 >调用 >[attach]0[/attach] >返回 >[attachment=-1] --- 这个解释的很清楚,非常感谢
撰写答案
登录
注册新账号
关注者
0
被浏览
4k
关于作者
prife
这家伙很懒,什么也没写!
提问
20
回答
550
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
基于RT-Thread的STM32F4开发第四讲——硬件定时器更新中断(缺失补齐教程)
2
基于RT-Thread的STM32F4开发第三讲——DAC
3
Wireshark抓包EtherCAT报文
4
RISC-V hardfault分析工具,RTTHREAD-RVBACKTRACE 原理讲解
5
基于RT-Thread的STM32G4开发第二讲第二篇——ADC
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
FAL
RTC
rt-smart
I2C_IIC
cubemx
UART
ESP8266
WIZnet_W5500
BSP
ota在线升级
PWM
flash
packages_软件包
freemodbus
潘多拉开发板_Pandora
ADC
GD32
定时器
编译报错
flashDB
keil_MDK
socket
中断
rt_mq_消息队列_msg_queue
Debug
ulog
SFUD
msh
C++_cpp
at_device
本月问答贡献
出出啊
1524
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
818
个答案
179
次被采纳
crystal266
555
个答案
162
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
1
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部