参考资料:

(1) SPRU514 ---- TMS320F28x Optimizing C/C++ Compiler User’s Guide.pdf;

(2) spru430d ---- TMS320C28x DSP CPU and Instruction Set Reference Guide;

(3) spru513c ---- TMS320C28x Assembly Language Tools User's Guide.

一、编写C语言能调用的.asm文件

以delay.asm为例:

1、将文件保存为.asm文件;

2、在文件中编写如下代码:

;*********************************************************************/

;* 鲍正华 */

;* 2010.07.09 */

;*********************************************************************/

;//###########################################################################

; @FunctionName:        Delay_asm

;

; @Brief:    延时1s

;

; @Param:  unsigned long cnt 传给 ACC

;

; @Return: 无

;//###########################################################################

.def _Delay_asm

.global  _Delay_asm

.sect".delayasmpage"

_Delay_asm:

SUB    ACC,#1       ;1 clk

BF     _Delay_asm,GEQ  ;4/4 clk,  Loop if ACC >= 0

LRETR    ;4 clk

;There is a 9/10 cycle overhead and each loop

;takes five cycles. The LoopCount is given by

;the following formula:

;  DELAY_CPU_CYCLES = 9 + 5*LoopCount

; LoopCount = (DELAY_CPU_CYCLES - 9) / 5

; The macro DELAY_US(A) performs this calculation for you

;***********************************************************************/

;        No     more

;***********************************************************************/

3、在步骤2中:

.def _Delay_asm用来定义函数名;

.global  _Delay_asm将函数名全局化,以便在C文件中能够调用;

.sect".delayasmpage"将函数定位到定义的段中,也可以是.text,可以灵活运用;

_Delay_asm:为函数标号,注意一定在前面加上下划线_否则C文件不能调用;

LRETR是函数返回,采用了RPC时必须用该指令。

4、在C文件中对函数原型进行声明:

extern void Delay_asm(unsigned long cnt);

5、在C 文件中以C语言形式调用汇编函数:

//延时1s

Delay_asm(18000000L);

6、上边的参数unsigned long cnt传递给了累加器ACC。

二、C语言调用汇编函数时的参数传递

参考(1) SPRU514 ---- TMS320F28x Optimizing C/C++ Compiler User’s Guide.pdf中的page168~169中的内容。

要点:

1、如果汇编语言中修改了XAR1、XAR2和XAR3的值,必须对它们进行保护:

;保存XAR1、XAR2、XAR3,以防程序修改, 若程序没有修改可以不用压栈保护

PUSH XAR1         ;1 clk

PUSH XAR2         ;1 clk

PUSH XAR3         ;1 clk

.

.

.

;恢复XAR1、XAR2、XAR3

POP XAR3  ;1 clk

POP XAR2  ;1 clk

POP XAR1  ;1 clk

2、16位参数从左至右依次传递给:AL、AH、XAR4、XAR5;

3、指针参数依次传递给:XAR4、XAR5,其它指针参数放到stack中;

4、32位的参数传递给累加器ACC(AH/AL),其它32位参数放到stack中。

例子:

(1)汇编代码:

;//###########################################################################

; @FunctionName:        _Xintf_memcpy_asm

;

; @Brief:    copy指定xintf

;

; @Param:  dest_addr, src_addr, length

;

; @Return: 无

;//###########################################################################

.def _Xintf_memcpy_asm      ;函数定义

.global  _Xintf_memcpy_asm         ;函数全局声明,以便C能够调用

.sect".xintfmemcpyasmpage"         ;以下为代码段

_Xintf_memcpy_asm:   ;标号必须从第1列开始,而汇编语言助记符不能从第1列开始

;保存XAR1、XAR2、XAR3,以防程序修改, 若程序没有修改可以不用压栈保护

;PUSH XAR1        ;1 clk

;PUSH XAR2        ;1 clk

;PUSH XAR3        ;1 clk

;copy指定区域(从XAR4指定区域copy到XAR5指定区域)

$1:

MOV AR6, *XAR5++     ;4 clk

MOV *XAR4++, AR6     ;1 clk

SUB ACC, #1       ;1 clk

BF $1, GT   ;4/4 clk, 大于则跳转

;恢复XAR1、XAR2、XAR3

;POP XAR3 ;1 clk

;POP XAR2 ;1 clk

;POP XAR1 ;1 clk

LRETR       ;4 clk, 程序返回

(2)C文件中对函数原型的声明:

extern void Xintf_memcpy_asm(unsigned int* dest_addr, unsigned int* src_addr, unsigned long length);

(3)C文件中以函数原型形式对汇编函数进行调用:

Xintf_memcpy_asm((unsigned int*)ZONE6ADDRESS, (unsigned int*)ZONE2ADDRESS, 102400L);

(4)这里参数传递过程是:ZONE6ADDRESS 传递给XAR4, ZONE2ADDRESS 传递给XAR5, 102400L 传递给ACC

三、C语言与汇编语言之间的变量引用

1、C语言引用汇编语言中定义的变量:

(1)访问在.bss段中定义的变量

汇编语言:

;变量定义,需要在变量前加下划线:_

.bss _var, 1

.global _var

C语言:

//变量声明,不要在变量前加下划线:_

extern unsigned int var;

//变量使用

var = 0x0006;

注意:在变量窗口中var表示变量地址0x 000080A3,要看变量的值,可以将该地址值0x000080A3输入到view memory中观看,其值为0x0006。

2、汇编语言引用C语言中定义的变量:

C语言:

//变量定义,不要在变量前加下划线:_

unsigned int asmdata;

//给变量赋值

asmdata = 0x0023;

汇编语言:

;变量引用,需要在变量前加下划线:_

.global _asmdata

;调用C中定义的变量

MOVL XAR6, #_asmdata       ;将asmdata变量地址存于XAR6中

MOV AL, *XAR6  ;将变量asmdata值存于AL中

;重新给asmdata赋值

MOV *XAR6, #0x2222

MOV AL, *XAR6

注意:这里在变量窗口中可以直接观察变量asmdata的值0x2222。

3、汇编语言引用C语言中定义的数组:

C语言:

//数组定义并初始化,不要在变量前加下划线:_

unsigned int asm_var1[4] = {1,2,3,4};

汇编语言:

;变量引用,需要在变量前加下划线:_

.global _asm_var1

;调用C中定义的数组,将其首地址存到XAR7中

MOVL XAR7, #_asm_var1

;zone2

MOVL XAR4, #0x080000 ;将zone2起始地址存入XAR4

;4 words

MOV @AR0, #0x0000      ;zone2写长度计数存入AR0

;写zone2

LOOP1:

;写1

MOV AL, *XAR7++       ;1 clk

MOV *XAR4++, AL

;写2

MOV AL, *XAR7++       ;1 clk

MOV *XAR4++, AL

;写3

MOV AL, *XAR7++       ;1 clk

MOV *XAR4++, AL

;写4

MOV AL, *XAR7++       ;1 clk

MOV *XAR4++, AL

BANZ LOOP1, AR0--    ;4/2 clk

注意:运行结果如下,可见zone2依次写入了数据:1、2、3、4。

f2812的语言与标准c不同,F2812中C语言调用汇编函数(续)相关推荐

  1. f2812的c语言与标准c语言,F2812中C语言调用汇编函数

    F2812中C语言调用汇编函数 参考资料: (1) SPRU514 ---- TMS320F28x Optimizing C/C++ Compiler User's Guide.pdf; (2) sp ...

  2. 欧洲统一语言参考标准C1,浅述欧洲统一语言参考标准.doc

    浅述欧洲统一语言参考标准 浅述欧洲统一语言参考标准 摘 要:随着2001年欧洲统一语言参考标准的问世,它已经成为了整个欧洲在外语教学上的指导性文件,并逐步被世界其他国家引入到自己国家的外语教学中.中国 ...

  3. R语言笔记6:在R中写一些简单的函数、functions基础和作用域

    R语言基础系列: 1数据类型(向量.数组.矩阵. 列表和数据框) 2读写数据所需的主要函数.与外部环境交互 3数据筛选--提取对象的子集 4向量.矩阵的数学运算 5控制结构 Your first R ...

  4. c语言 extern_Visual C++ 6.0环境中C语言extern 变量使用过程报错

    extern 变量称为外部存储变量.extern声明了程序中将要用到但尚未定义的外部变量.本次错误的解决方法同样适用于外部函数.外部函数就是可以被其他源文件调用的函数,定义外部函数时使用extern进 ...

  5. 单片机r6/r7c语言怎么用,关于单片机C51中c语言函数(-nop-())?

    实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时:另一种是软件延时,这种方法主要采用循环体进行. 1  使用定时器/计数器实现精确延时 ...

  6. 单片机C语言数据存储原理,介绍单片机中C语言的数据存储与程序编写

    一.五大内存分区: 内存分成5个区,它们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 1.栈区(stack):FIFO就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区 ...

  7. c语言c11标准用得多吗,C语言的C11 标准有哪些改进的地方?C11 为何不如 C++11 流行?...

    1.   C语言的C11 标准有哪些改进的地方?会对各类C项目起到哪些帮助? 1. 对齐处理操作符 alignof,函数 aligned_alloc(),以及 头文件 . 2. _Noreturn 函 ...

  8. c语言异或运算符_计算机中C语言的-运算符

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C 语言内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 本章将逐一介绍算术运 ...

  9. R语言笔记6:在R中写一些简单的函数

    Your first R function 命令一个函数时,一般不写在交互式命令行里,而是写在一个空白的文本文件中,即把函数放在一个R包中,这里面包含着文档(documentation),是一个更加结 ...

最新文章

  1. KRIA SOM,赛灵思自适应计算最近一发“王炸”!
  2. 测试无线节能信标与主控器之间的控制功能
  3. rpc框架都有哪些_这六种微服务RPC框架,你知道几个?
  4. offsetLeft和style.left的区别
  5. matlab恢复默认界面布局
  6. 【转】采购提前期概述
  7. php获取跳转前的地址,PHP获取短链接跳转后的真实地址和响应头信息的方法
  8. mysql数据存储到指定位置_Mysql数据库表分区存储到指定磁盘路径
  9. 倍频程分析函数matlab,瞬时声压时域数据怎么用matlab进行1/3倍频程声压级分析
  10. java jdk安装 win10,Win10安装多个jdk,共存环境配置,自由切换
  11. Atitit mybatis topic file list Total 300ge (9+条消息)MyBatis框架核心之(五)注解使用resultMap及多表查询 - 弱弱的猿 - CSD
  12. 手把手教你自学单片机,三个步骤请做好笔记
  13. 什么样学生适合学计算机动漫,动画专业的学生,如何选购电脑?
  14. 使用linux提交pbs任务:运行matlab或perl程序
  15. linux下打开.mpp文件(微软project)
  16. 一网打尽“小黄图”!手把手教你造一只AI鉴黄神器(内附代码及数据集)
  17. 转载 测试开发岗--高频知识整理
  18. linux可变剪切分析,可变剪切的意义和重要性
  19. linux操作系统 第11章 linux系统管理
  20. 纳斯达克Linq利用区块链改造私有股权交易平台

热门文章

  1. 还在为不熟悉快捷键的用法而苦恼吗?大神总结出来的方法都在这了
  2. 计算机工程与应用 【两次外审,另请专家再审也可以录】
  3. 5月这四本期刊已被剔除SCI目录
  4. 电子会员卡绑卡提示未找到可以绑卡会员卡处理方案?
  5. Central Limit Theorem - 中心极限定理
  6. Abb工业机器人,用函数测出两点间的距离
  7. 双向全桥LLC/CLLC拓扑双闭环控制,详细的设计步骤
  8. 关于IPv6的发展史!IPv6的秘密史!
  9. ImageJ分割中央凹无血管区操作、创建宏--记录操作、图像批处理并保存
  10. PHP 算出字符串中中文个数