@TOC)
接口形式
LDC编译器可支持两种书写方式,一种是GCC格式的,另外一种需要调用内置的函数模板进行实现
/*
无返回的定义
*/
void __asm (char[] asmcode, char[] constraints, [ Arguments... ] );
/*
单返回定义
*/
template __asm(T) {
T __asm (char[] asmcode, char[] constraints, [ Arguments... ] );
}
/*
多返回定义
*/
struct __asmtuple_t(T...) {
T v;
}
template __asmtuple(T...) {
__asmtuple_t!(T) __asmtuple (char[] asmcode, char[] constraints, [ Arguments... ] );
}
定义符 | 类型 |
---|---|
=*m | 返回:由内存 |
=r | 返回: 由寄存器 |
*m | 输入:由内存 |
r | 输入:由寄存器 |
i | 输入 |
手动使用寄存器时应该在输入参数上进行禁止 如 __asm(“mov r0,$0”,"~{R0},~{R1}",val);
可接受参数
__asm(<汇编代码>,<输入参数类型>,<输入参数>…)
输入参数由 $0 开始计数
__asm!<返回类型>(<汇编代码>,<输入参数类型>,<输入参数>…)
输出参数为$0,输入参数由 $1开始计数
例子
无 return
import ldc.llvmasm;
uint v1 = 0x33;
enum ev1 = 0x44;
__asm("nop",""); //
__asm("mov r0,#0x55");
__asm("mov r0,$0","i",ev1);
__asm("mov r0,$0","r",v1);
auto rv1 = __asm("mov $0,R0","=r");