历史上的今天
今天是:2024年11月18日(星期一)
2019年11月18日 | 2440裸机编程之二 C语言调用汇编语言编程
2019-11-18 来源:51hei
和C调用汇编一致,前四个参数用R0-R3传递,后面的用堆栈传递
测试这个程序:
//******************************************************
//main.C
extern int test(int, int, int);
int n;
int main(void)
{
n = test(2,4,6);
while(1);
}
int add(int a, int b, int c)
{
return a+b+c;
}
//******************************************************
;****************************************************
;test.S
IMPORT add ;引进add
EXPORT test ;供出test
AREA test,CODE,READONLY
CODE32
STR LR,[SP],#-4 ;保存LR:入栈
BL add ;调用C程序
LDR LR,[SP,#4]! ;LR出栈
MOV PC,LR ;返回main
END
;***************************************************
过程说明:main调用n = test(2,4,6),使2、4、6分别通过R0、R1、R2传递给汇编函数test,然后test调用C程序add,R0、R1、R2分别传给a、b、c,然后求和结果用R0返回test,test又将R0返回main函数,所以最后 n = 12;
如图:
注意汇编程序中IMPORT和EXPORT的用法:
IMPORT add:进口,指add在外部文件中,当前文件要调用EXPORT test:出口,指test在当前文件中,可以给外部文件调用同样在C文件中,如果要调用外部文件,使用extern关键字申明函数,如:extern int test(int, int, int);
这些关键字是必须的,如果在没有使用这些关键字的情况下,调用外部函数,编译器要报错的。
上一篇:malloc函数及用法
史海拾趣
|
一、概述 在编写单片机程序的过程中,键盘作为一种人机接口的实现方式,是很常用的。 而一般的实现方法大概有: 1、外接键盘扫描芯片(例如8279,7279等等),然后由该芯片来完成去抖、键值读取、中断请求等功能。然后单片机响应中断并读取键值,有 ...… 查看全部问答> |
|
DSP 新手FAQ汇总 1、TI DSP的选型主要考虑处理速度、功耗、程序存储器和数据存储器的容量、片内的资源,如定时器的数量、I/O口数量、中断数量、DMA通道数等。DSP的主要供应商有TI,ADI,Motorola,Lucent和Zilog等,其中TI占有最大的市场份额。 TI公 ...… 查看全部问答> |
|
1. 引言 随着FPGA的设计速度和容量的明显增长,当前流行的FPGA芯片都提供高速总线,例如DDR内存总线,PCI-X总线、SPI总线;针对超高速的数据传输,FPGA通过集成SerDes提供高速串行IO,支持各种诸如PCI-E、GBE、XAUI等高 ...… 查看全部问答> |
|
现在的以太网芯片有支持IEEE802.1Q的吗? 我的意思就是有没有芯片硬件就能够自动识别VLAN的? 如果都不支持的话,那么是不是应该通过交换机来实现? 例如我的设备发送带有IEEE802.1Q标记的帧给交换机,然后交换机会选择匹配的VLAN端口,将数据 ...… 查看全部问答> |
|
在数字信号处理(DSP)中,乘加是最基本的运算,以至于很多FPGA厂商以MAC的多少及运算速度做为器件的一个重要指标。下面就乘法实现进行讨论。在DSP中,大多是有符合数的操作,这里给出有符号数乘法的VHDL和Verilog程序。LIBRARY ieee;USE ieee.std_ ...… 查看全部问答> |
|
我有个设备是直接和PC机通过串口连接的,我现在想做一个东西,串在这个串口线上,把PC机发给设备的数据给处理一下! 具体问题是:这个设备在通过与PC机串口通信的时候,需要手工按开关和拨换档位,我现在想用一个单片机加一些电路把这个手 ...… 查看全部问答> |
|
公司开发了一个新产品之前生产过几次基本没有发现ST芯片不良,上个月生产时发现200pcs芯片不良(这个月生产又发现12pcs不良),送给ST公司分析,分析原因为生产制程造成。我们公司生产工艺是采用红胶波峰焊,过锡炉后ST芯片pin16-32位置基本上 ...… 查看全部问答> |




