Flash 编程关键宏 outportw和inportw
发布时间:2020-12-15 06:57:16 所属栏目:百科 来源:网络整理
导读:?以下为两个关键的宏outportw和inportw,实现方法与解释: MACRO ? ???MOV_PC_LR ? ???[ THUMBCODE ? ?? ? bx lr ? ???| ? ?? ? mov pc,lr ? ???] ? ?MEND EXPORT outportw ? ???outportw strh r0,[r1] ? ???MOV_PC_LR EXPORT inportw ? ???inportw ldrh r0,
?以下为两个关键的宏outportw和inportw,实现方法与解释: MACRO ? ???MOV_PC_LR ? ???[ THUMBCODE ? ?? ? bx lr ? ???| ? ?? ? mov pc,lr ? ???] ? ?MEND EXPORT outportw ? ???outportw strh r0,[r1] ? ???MOV_PC_LR EXPORT inportw ? ???inportw ldrh r0,[r0] ? ???MOV_PC_LR ? ?首先看c与汇编的接口方式。根据nios的二进制接口规则,当编译器把c函数编译到汇编代码时,如果参数不多于4个,那么就由r0 r1 r2 r3来传递参数,函数的返回值将被放到r0中。比如c中调用这样一个函数outportw(dat,addr),那么当编译器将这个函数编译为汇编时,dat的值被赋给r0,addr的值被赋给r1。在于这个c文件在同一个文件夹下的s文件,如果其中有这么一段: ? ?export outportw ? ?outportw str r0,[r1] ? ?MOV_PC_LR ? ?那么调用在c函数中调用outportw()这个函数的实际作用就是将dat的值发送到addr的地址上去。这样就实现了对底层硬件资源的直接访问。 ? ?如果c中有这样一个函数rt = inportw(addr)并且在与这个c文件同一个文件夹下的s文件中有这样一段代码的话: ? ?export inportw ? ?inportw ldr r0,[r0] ? ?MOV_PC_LR ? ?那么这个函数的实际作用就是将addr地址上的值读出并作为函数返回值返回。 ? ?上面两段汇编代码中遇到的MOV_PC_LR就是一个MACRO。 ? ?MACRO ? ?MOV_PC_LR ? ? [THUMBCODE ? ?? ? bx lr ? ? | ? ?? ???mov pc,lr ? ? ] ? ? MEND ? ?其实这种方式实现c与汇编的接口并不是很方便。这样做需要有比较好的汇编基础。其实可以通过相对简单的c宏定义来实现同样的功能。我之前经常使用这样的宏定义来访问固定的地址。#define rDATA (*((volatile unsigned int *)0x********)),这样data = rDATA; rDATA = data;就可以实现对固定内存地址的读写了。其实刚才的汇编代码也是对具体的内存地址进行读写,只是这个地址是作为参数传递的。只要将c函数中的宏定义改成这个样子就可以实现同样的功能。 #define outportw(dat,addr) (*(volatile U16*)(addr) = (dat)) #define inportw(addr) (*(volatile U16 *)(addr))
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- (翻译)React.createClass对比extends React.Comp
- 单个XML架构可以有多个targetNameSpaces吗?
- SQLite Alter 命令
- c – 处理QPluginLoader :: load()抛出的异常
- Oracle数据安全面面观
- 通过fsharp探索Enterprise Library 6 DataBase 1
- ruby – Devise,Omniauth和Twitter
- Cocos2D添加精灵纹理滤镜实现图像复古效果的转换
- ruby-on-rails – 如何处理我的Rails REST API中
- rubygems – 无法使用RubyGem 2.7.1安装Cocoapod
热点阅读