C166 Interfacing C to Assembler
Interfacing C to Assembler
You can easily interface your C programs to routines written in XC16x/C16x/ST10 assembly language.
The A166 Assembler is a macro assembler that emits object modules in OMF166 format.
By following a few programming rules, you can call assembly routines from C and vice versa.
Public variables declared in the assembly module are available to your C programs.
There are several reasons to call an assembly routine from your C program.
- You have assembly code already written that you wish to use.
- You need to improve the speed of a particular function.
- You want to manipulate SFRs or memory-mapped I/O devices directly from assembly.
This section describes how to write assembly routines that can be directly interfaced to C programs.
For an assembly routine to be called from C, it must be aware of the parameter passing
and return value conventions used in C functions.
For all practical purposes, the assembly routine must appear to be a C function.
Function Parameters
C functions pass up to five parameters in registers (R8-R12).
Bit parameters are passed in R15.
Parameters that do not fit into R8-R12 are passed on the user stack
and are accessed using [R0+#disp] instructions.
The following examples demonstrate the C166 parameter passing conventions:
void func1 (
char a) /* 1st parameter passed in R8 */
The above function has one argument that easily fits into a single 16-bit register (R8).
void func2 (
int b, /* 1st parameter passed in R8 */
int c, /* 2nd parameter passed in R9 */
int near *d, /* 3rd parameter passed in R10 */
char e, /* 4th parameter passed in R11 */
char f) /* 5th parameter passed in R12 */
The above function has five arguments. All fit into R8-R12.
void func3 (
long g, /* 1st parameter passed in R8/R9 */
int far *h, /* 2nd parameter passed in R10/R11 */
int i, /* 3rd parameter passed in R12 */
long j) /* 4th parameter cannot be located in registers */
The above function has four arguments. The first three use all available registers. The fourth argument must be passed on the user stack.
void func4 (
double k, /* 1st parameter passed in R8/R9/R10/R11 */
long j) /* 2nd parameter LSW passed in R12 */
/* MSW passed on the user stack */
The above function has two arguments. The first argument uses four of the five registers.
The LSW of the second argument is passed in R12 and the MSW is passed on the user stack.
void func5 (
bit m, /* 1st parameter passed in R15.0 */
bit n) /* 2nd parameter passed in R15.1 */
The above function has two bit arguments that passed in R15.
void func6 (
char o, /* 1st parameter passed in R8 */
bit p, /* 2nd parameter passed in R15.0 */
char q, /* 3rd parameter passed in R9 */
bit r) /* 4th parameter passed in R15.1 */
The above function has four arguments (two are bits) that are passed in registers and in R15 (for the bits).
Function Return Values
Function return values are always passed using MCU registers.
The following table lists the possible return values and the registers used for each.
Return Type | Register | Description |
---|---|---|
bit | R4.0 | Single bit returned in R4.0. |
char, unsigned char |
RL4 | Single byte type returned in RL4. |
int, unsigned int, near pointer |
R4 | Two byte (16-bit) type returned in R4. |
long, unsigned long, far pointer, huge pointer |
R4 & R5 | LSB in R4, MSB in R5. |
float | R4 & R5 | 32-Bit IEEE format. |
double | R4-R7 | 64-Bit IEEE format. |
Register Usage
Assembler functions may destroy the contents of R1-R12, PSW, MDL, MDH, MDC, and DPP0.
When invoking a C function from assembly, assume that these registers are destroyed.
When using the MAC directive the compiler uses in addition the MAC registers MSW, MAL, MAH, MRW, and IDX0.
When code is generated with the MAC directive, these registers are used by C functions (in addition to the register listed above).
When invoking a C function form assembly you need therefore to assume that these registers are destroyed too.
The following registers have special meaning and must be preserved by the assembler subroutine.
Register | Description |
---|---|
R0 |
R0 is the user stack pointer. |
R13 |
This register may be used but its contents must be saved (on entry) and restored (before returning). |
R14 |
This register may be used but its contents must be saved (on entry) and restored (before returning). |
R15 |
This register may be used but its contents must be saved (on entry) and restored (before returning). |
DPP1 |
This DPP register may not be modified by assembler subroutines. |
DPP2 |
This DPP register may not be modified by assembler subroutines. |
DPP3 |
If DPP3 is modified in the assembler subroutine, it must be reset to 3 (SYSTEM PAGE) before returning. |
Note
- DPP0 is used only when the MOD167 C166 Compiler directive is not specified.
- If your assembler programs alter DPP0, the DPPUSE L166 Linker directive may not be used to assign DPP0 to the near memory area.
- If your assembler programs alter DPP0 or DPP3, the NODPPSAVE C166 Compiler directive may not be used to bypass saving and restoring DPP0 and DPP3 in interrupts.
C166 Interfacing C to Assembler的更多相关文章
- 关于如何在C语言中嵌入汇编命令
转载自:http://www.keil.com/support/docs/2308.htm C51: GETTING INLINE ASSEMBLY TO WORK Information in th ...
- Fixed-point multiplication (C166 A*B/B)
I want to multiply two fixed point numbers. After the multiplication I have to shift the result so t ...
- Assembler : The Basics In Reversing
Assembler : The Basics In Reversing Indeed: the basics!! This is all far from complete but covers ab ...
- Jena TDB 101 Java API without Assembler
Update on 2015/05/12 ongoing tutorials site on https://github.com/zhoujiagen/semanticWebTutorialUsin ...
- Jena TDB assembler syntax
1 introduction Assembler is a DSL of Jena to specify something to build, models and dataset, for exa ...
- Solaris 11 system package 安装与更新(如:assembler)
最近在VirtualBox虚拟机中导入了Solaris 11.3.在里面安装Oracle数据库时,先行条件检查没通过,提示缺少程序包assembler. 在网上看了许多,这方面的信息还比较少.最后在O ...
- More x64 assembler fun-facts–new assembler directives(转载)
原文地址 The Windows x64 ABI (Application Binary Interface) presents some new challenges for assembly pr ...
- x64 assembler fun-facts(转载)
原文地址 While implementing the x64 built-in assembler for Delphi 64bit, I got to “know” the AMD64/EM64T ...
- c166 -div
unsigned short a=10; unsigned short b; unsigned short c;unsigned long d; b = (unsigned short)(d/2400 ...
随机推荐
- html:唤起手机qq开始对话 & 自动拨号
<a href="mqqwpa://im/chat?chat_type=wpa&uin=[qq号]&version=1">XXX</a> 另 ...
- php下的jsonp使用实例
参考资料:http://www.cnblogs.com/chopper/archive/2012/03/24/2403945.html 测试依赖条件: 项目eetopinOfficial 在hosts ...
- 嵌入式 hi3518平台检测网线是否插上
/********************************** (C) COPYRIGHT ******************************* * File Name ...
- CSS使jsp图片旋转90度
<style > img{ margin:100px auto 0; -moz-transform:rotate(-90deg); -webkit-transform:rotate(-90 ...
- 切换PS工具栏里的快捷键
工具箱(多种工具共用一个快捷键的可同时按[Shift]加此快捷键选取,可以在[常规]'快捷键[Ctrl]+[k]'里设置是否使用[Shift]切换) 其它快捷键: 矩形.椭圆选框工具[M] 裁剪工具[ ...
- 页面性能测试&提升方式
性能测试包括:web系统页面测试.web系统后台测试 2种方式来提升你的web 应用程序的速度: ● 减少请求和响应的往返次数 ● 减少请求和响应的往返字节大小. 详细的看此文http://www.5 ...
- Div 自适应屏幕大小
http://blog.csdn.net/wodetiankong516/article/details/7827256 Background 有时, 我们需要将div或者其他的Elemen ...
- 刚刚大学毕业,自己搭网站遇到的问题 一:tomcat中同时部署两个项目的问题
最近直接把两个项目打成war包在tomcat下发布,出现了很多莫名奇妙的问题,就是不能发布成功,只能有一个项目能成功,在网上查了很多方法,以为是两个项目中jar包出现冲突,也按照网上的方法把两个项目中 ...
- openstack-dbs
真正的服务器派生出线程 和子进程处理多个连接当允许客户端加入聊天室,他发送的任何一条文本都将广播给聊天室中的每个用户,除非文本是服务器CLI当广播一条消息,消息前面将加上发送者的昵称 以尖括号括住昵称 ...
- 第二百零二天 how can I 坚持
最近增肥好明显,胃口好没办法,只要肚子起不来就行了.加油. 其实挺幸福,想吃啥吃啥. 鱼会不会被冻死,买了加热棒不想用,该咋办呢. 股市又跌没了一千多,还是不够睿智,不够淡定. 人活这一辈子,到底最想 ...