共2条
1/1 1 跳转至页
Aq430,wrappers,for,assembly,coded,functions Aq430 —— C wrappers for assembly cod
问
If you want to write a C callable function in assembly code, it is often most convenient to code it as a C function whose body is a block of in-line code. The benefit is that, if you declare all variables to be used in C, then the compiler will look after saving/restoring register on entry/exit and will look after assigning register numbers. Such a function would have a structure like this:
int
f( register int x, register int y )
{
register int a, b, c;
/$
....assembly code using x, y, a, b, c
$/
return c;
}
In this case, only the declarations and return statement are in C; everything else is in assembler. Note that the code uses the register keyword in declarations in order to force the compiler to put them into registers, so that they CAN be used as registers in the in-line code.
If, in inline assembly code, you refer to a register directly (by using the name of the register), then you must save/restore it on entry/exit to/from the inline assembly code. The best way to avoid such concerns is to always declare your registers as C variables and then refer to them using name in the inline assembly code. If you want to use a scratch register (r12-r15) which is not being used to hold an incoming function argument, then you should bind the C variable to the scratch register directly. For instance, to bind a variable q to register R15, you would write
register int q R[15];
In general, if the wrapper function does not contain any function calls, then arguments passed in registers will be used as is. Otherwise, they will be copied to other, non-scratch registers. When in doubt, look at the assembly code output file generated by the compiler, as it will contain compiler generated comments indicating which register it is using for each register variable.
int
f( register int x, register int y )
{
register int a, b, c;
/$
....assembly code using x, y, a, b, c
$/
return c;
}
In this case, only the declarations and return statement are in C; everything else is in assembler. Note that the code uses the register keyword in declarations in order to force the compiler to put them into registers, so that they CAN be used as registers in the in-line code.
If, in inline assembly code, you refer to a register directly (by using the name of the register), then you must save/restore it on entry/exit to/from the inline assembly code. The best way to avoid such concerns is to always declare your registers as C variables and then refer to them using name in the inline assembly code. If you want to use a scratch register (r12-r15) which is not being used to hold an incoming function argument, then you should bind the C variable to the scratch register directly. For instance, to bind a variable q to register R15, you would write
register int q R[15];
In general, if the wrapper function does not contain any function calls, then arguments passed in registers will be used as is. Otherwise, they will be copied to other, non-scratch registers. When in doubt, look at the assembly code output file generated by the compiler, as it will contain compiler generated comments indicating which register it is using for each register variable.
共2条
1/1 1 跳转至页
回复
| 有奖活动 | |
|---|---|
| 这个春节你犒赏自己什么了?分享你的故事,有奖征集 | |
| 2026年“我要开发板活动”第三季,开始了! | |
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
我要赚赏金打赏帖 |
|
|---|---|
| 【S32K3XX】SWT 模块使用被打赏¥22元 | |
| 【分享开发笔记,赚取280元手持便携数字示波器】32位linux内核内存映射896的理解被打赏¥14元 | |
| AG32VH407开发板例程体系的构成与使用方法被打赏¥20元 | |
| 【S32K3XX】SEMA42 模块使用被打赏¥26元 | |
| 【S32K3XX】XRDC 功能使用被打赏¥22元 | |
| 【分享开发笔记,赚取280元手持便携数字示波器】8051使用keil编译的程序移动心得被打赏¥21元 | |
| 【S32K3XX】HSE 密钥管理被打赏¥17元 | |
| 【S32K3XX】Standby RAM的初始化流程被打赏¥18元 | |
| Gravity:中英文语音合成模块V2.0及其串口控制被打赏¥24元 | |
| 全彩色度变化图的绘制被打赏¥27元 | |
我要赚赏金
