Keil C51 8051汇编函数参数和返回值放在哪里,C语言调用汇编函数时汇编函数如何处理参数?

Keil C51 8051汇编函数参数和返回值放在哪里,C语言调用汇编函数时汇编函数如何处理参数?

作者 将狼才鲸
创建日期 2024-07-21

  • 参考网址:

  • Keil C51 C语言中调用汇编函数时,最多使用三个参数,默认第一个参数从R7开始放,第二个参数从R5开始放,第三个参数从R3开始放,如果是2字节的int,那么遵循8051的大端模式,高字节放在R2、R4、R6,低字节放在R3、R5、R7;如果是指针参数,无论是第一第二第三个参数,都放在R1~R3,存储类型是R3,指针值是0xR2R1(注意此时是小端模式存储);超过三个的参数请用外部RAM来实现;

  • 汇编函数将返回值返回给C语言时,返回值需要放在R7开始的位置,char就放在R7,int是0xR6R7,long和float是0xR4R5R6R7,指针是类型在R3,指针值0xR2R1;

  • 汇编里的函数如果要给C语言用,那么函数名(标号)前要叫下划线,例如 _LOOP: NOP; RET;,C语言调用时去掉下划线,如:LOOP();

    • 其实加下划线是代表有参数调用,但是无参数的汇编函数你也这么加并没有问题;
  • 想找原文的,在Keil安装目录的C:\Keil_v5\C51\Hlp\c51.chm,在里面搜索Parameter Passing或者Passing in Registers,原文摘抄如下:

Passing in Registers

C functions may pass parameters in registers and fixed memory locations. A maximum of 3 parameters may be passed in registers. All other parameters are passed using fixed memory locations. The following tables define which registers are used for passing parameters.

Arg Number char, 1-byte ptr int, 2-byte ptr long, float generic ptr
1 R7 R6 & R7 (MSB in R6,LSB in R7) R4---R7 R1---R3 (Mem type in R3, MSB in R2, LSB in R1)
2 R5 R4 & R5 (MSB in R4,LSB in R5) R4---R7 R1---R3 (Mem type in R3, MSB in R2, LSB in R1)
3 R3 R2 & R3 (MSB in R2,LSB in R3) R1---R3 (Mem type in R3, MSB in R2, LSB in R1)

The following examples clarify how registers are selected for parameter passing.

Declaration Description
func1 ( int a) The first and only argument, a, is passed in registers R6 and R7.
func2 ( int b, int c, int *d) The first argument, b , is passed in registers R6 and R7. The second argument, c , is passed in registers R4 and R5. The third argument, d, is passed in registers R1, R2, and R3.
func3 ( long e, long f) The first argument, e , is passed in registers R4, R5, R6, and R7. The second argument, f, cannot be located in registers since those available for a second parameter with a type of long are already used by the first argument. This parameter is passed using fixed memory locations.
func4 ( float g, char h) The first argument, g , passed in registers R4, R5, R6, and R7. The second parameter, h, cannot be passed in registers and is passed in fixed memory locations.

Copyright © Keil, An ARM Company. All rights reserved.

相关推荐
Dev_XH8 分钟前
【成品设计】基于CH32H417的CH32H417AIOT家庭微电网
单片机·嵌入式硬件·物联网·ai
心仪久了会沦陷2 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
Severus_black5 小时前
【C++初阶】list使用及相关实现,思路顺滑流畅!
c语言·数据结构·c++·stl·list
en.en..6 小时前
STM32入门最佳学习顺序(寄存器→标准库→HAL库)
单片机·嵌入式硬件
二本咕咕-机械转码7 小时前
FreeRTOS深入解析(八)IPC机制之FromISR详解
数据结构·单片机·链表
小李不想当小白7 小时前
HAL库之UART(STM32 HAL库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
Dev_XH8 小时前
【成品设计】基于物联网的旅游生态农业互动系统
stm32·单片机·嵌入式硬件·物联网·旅游
希和20279 小时前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
Zwawa1 天前
屏幕不止一种:OLED、LCD1602字符屏、TFT/IPS图形屏和串口屏怎么用,这与TTY和PTY又有什么关系
c语言·单片机·嵌入式
Fruiticecake1 天前
C 程序员速通现代 C++(一):lambda、std::function、移动语义与智能指针
c语言·c++