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 ...
随机推荐
- 如何在MySql中记录SQL日志
SQL server有一个sql profiler可以实时跟踪服务器执行的SQL语句,这在很多时候调试错误非常有用.例如:别人写的复杂代码.生产系统.无调试环境.无原代码... ... 查了一下资 ...
- xampp 提示 This setting can be configured in the file "httpd-xampp.conf".
错误提示如下: New XAMPP security concept: Access to the requested object is only available from the local ...
- POJ 2241 Mondriaan's Dream
题意:给一块n×m的空地,用1×2的砖铺,有多少种方案. 解法:状压dp.考虑dp[i][j]表示前i - 1行都铺满时第i行的状态为j时的方案数.对于第i行,每个格子上是否有砖用0和1表示,0表示不 ...
- poj 2923(状态压缩dp)
题意:就是给了你一些货物的重量,然后给了两辆车一次的载重,让你求出最少的运输次数. 分析:首先要从一辆车入手,搜出所有的一次能够运的所有状态,然后把两辆车的状态进行合并,最后就是解决了,有两种方法: ...
- Yii表单验证
我之前在朋友的公司拿到他们oa的代码,发现是用Yii写的,oa系统比较简单,但是程序员对Yii的运用比较好,我拿来学习一下.如果有需要,我可以私下分享这个程序,因为是人家的功劳,不在网上公布代码了,只 ...
- Android圆形图片--ImageView
[ RoundImageView.java ] package com.dxd.roundimageview; import android.content.Context; import andro ...
- Delphi 调用串口例子
procedure TfrmClientMain.SayAddr;var sbuf:array[1..7] of byte;begin sbuf[1]:=byte($35); sbuf[2]:=byt ...
- Redis 对String数据类型的操作
Redis的 Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字.使用Strings类型,你可以完全实现目前 Memcached 的功能,并且效率更 ...
- Loadrunner中与事务相关的概念及函数
一.事务 事务是指用户在客户端做一种或多种业务所需要的操作集,通过事务函数可以标记完成该业务所需要的操作内容:另一方面可以用来统计用户操作的相应时间.事务响应时间是指通过记录用户请求的开始时间和服务器 ...
- PHP 优化详解
笔者收集的这些技巧来源较广,完整性不能保证. 由于数量较多,这些优化技巧没有经过测试.请各位看官在使用之前自行测试,毕竟这些技巧是否能派上用场,还是需要由PHP所在的独特环境所决定的. 目录索引 找到 ...