LD:tricore 读取A11方法,CSA机制 ,ld中切分内存

#define __GETA11(tin) \
{ \
__asm__ ("mov.d \t%0,%%a11":"=d" (tin)); \
}

顺便列举几个学到的汇编指令

mov.d  用于从通用地址寄存器拷贝到通用数据寄存器  a->d

mov.a  反过来

函数体最后都会有个RET指令,会从A11中取出要返回的地址。

若进入trap中,返回指令是RFE (return from excption)也是从A11中获取地址,A11即RA

在此之前尝试了很多种方法,系统提供的mfcr指令无法读出A11,如果用指针读A11地址会进入trap,非法访问(一定要用汇编指令去取)

仿照mfcr接口制作的接口编译不过,

(__extension__({ \
unsigned __res; \
__asm__ volatile ("mfcr %0, LO:" __STRINGIFY (regaddr) \
: "=d" (__res) :: "memory"); \
__res; \
}))  

 

貌似这个叫做老式的汇编语法   :::这种固定格式

__asm__ volatile ("svlcx" ::: "memory"); //用于 加载上下文

__asm__ volatile ("nop" ::: "memory"); //用于 等待几个指令的时间

 

上下文CSA的构成 如图

其中D15被称为隐式寄存器,或内部寄存器,一种用法是局部变量

 

posted @ 2021-03-05 20:05  无头之蝇  阅读(751)  评论(0)    收藏  举报