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 ...
随机推荐
- 查一下 excel中某一列是否有重复
另一列中写入 =IF(COUNTIF(C:C,C1)>1,"有重复","") 其余往下拖拉公式 我在想如果可以有不往下拖的呢? 不过好像筛选中也有类似的选 ...
- 十六进制字符串转化成字符串输出HexToStr(Delphi版、C#版)
//注意:Delphi2010以下版本默认的字符编码是ANSI,VS2010的默认编码是UTF-8,delphi版得到的字符串须经过Utf8ToAnsi()转码才能跟C#版得到的字符串显示结果一致. ...
- go 应用程序性能测试
runtime/pprof 我们要加入对pprof包里的方法调用,程序才能将运行时候程序的堆内存分配状态记录到文件(也可以是写到其他地方,例如网络等)中,以便进一步的分析. 如果你的go程序只是一个应 ...
- javascript防止SQL注入
<SCRIPT language="javascript">function Check(theform){ if (theform.UserName.value== ...
- 文件的压缩与解压XZip,XUnzip
参考http://www.codeproject.com/KB/cpp/xzipunzip.aspx CreateZip() –创建一个空的 zip 文件 HZIP CreateZip(void *z ...
- call Kernelized Correlation Filters Tracker(Matab) in Qt(c++)
recently, i need call the KCF tracker in my graduation project. the KCF tracker is fast and best per ...
- 企业高并发的成熟解决方案(一)video(笔记&知识点)
知识点 答案 什么是高可用(HA) 高并发发生在哪两处 app服务器会出现什么问题,有哪些解决方案? 数据库并发有什么要求? hadoop集群的作用 负载均衡的功能有哪些 负载均衡的分类 哪种负载均衡 ...
- netbeans中wicket插件对应的jQuery-ui版本
在netbean里使用wicket,我们经常习惯使用netbeans自带的wicket插件直接安装wicket,但是因为netbean上的 wicket插件版本比较老,使得我们很多新的第三方wicke ...
- 用ASP.Net写一个发送ICQ信息的程序
用ASP.Net写一个发送ICQ信息的程序 这里我给大家提供一个很实用的例子,就是在线发送ICQ信息.想一想我们在网页上直接给朋友发送ICQ信息,那是多么美妙的事情啊.呵呵,在吹牛啊,其实ICQ本来就 ...
- Sunday算法(字符串查找、匹配)
字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简单的 ...