C/C++与汇编交互总结

1.汇编当中可以调用C函数,只需要"IMPORT"一下即可,如:

cpp 复制代码
change_vari_c	PROC
				PUSH {R0,R1,LR}
				IMPORT core_res_c
				IMPORT temp_func_ret
				EXPORT change_vari_c
				BL temp_func_ret
				LDR R1,=core_res_c
				STR R0,[R1]
				POP {R0,R1,PC}
				ENDP

如果该C函数有传递参数的,则在调用前把参数赋值到R0-R4即可;若有返回值的,则调用后从R0或者R0-R1(返回值为64位)读取即可;

2.汇编当中可以引用C全局变量,也是"IMPORT"一下即可,如上例;值得注意的是,引用进来的是该变量的地址,不是变量的值。这是C和汇编之间数据交互的一种重要方式。

3.C当中可以调用汇编函数,需要在汇编中EXPORT一下,然后在C中extern,如:

cpp 复制代码
set_coreres		PROC
				EXPORT set_coreres
				PUSH {R0,LR}
				MOV SP,R0
				POP {R0,PC}
				ENDP
 
set_specialres	PROC
				EXPORT set_specialres
				PUSH {R0,LR}
				MSR CONTROL,R0
				POP {R0,PC}
				ENDP
					
read_coreres	PROC
				EXPORT read_coreres
				PUSH {R0,LR}
				STR SP,[R0]
				POP {R0,PC}
				ENDP
					
read_specialres	PROC
				EXPORT read_specialres
				PUSH {R0,R1,LR}
				MRS R1,PSR
				STR R1,[R0]
				POP {R0,R1,PC}
				ENDP
cpp 复制代码
extern void set_coreres(int resvl);
extern void set_specialres(int resvl);
extern void read_coreres(int *resvl);
extern void read_specialres(int *resvl);

并且在C中调用汇编函数时可以传入参数,需要传入哪些参数和参数类型只要在extern时声明下就可;也可以有返回值,存在R0或R0-R1中,但是当有返回值时,汇编函数中在退出前需要将返回值赋值给R0或R0-R1。这是C和汇编之间数据交互的一种更为简便有效的方式。

4.C当中也可以使用汇编的标号,用法还是先EXPORT,再在C中extern

5.也可以直接在C中嵌入汇编,具体方式跟编译器有关,如:

cpp 复制代码
uint32_t read_special_res(void)
{
	__ASM("ldr r0,=core_res_c");
	__ASM("mrs r1,control");
	__ASM("str r1,[r0]");
	
	return core_res_c;
}

uint32_t get_r5()
{
    uint32_t stackPointer;
    
    __asm volatile (
        "mov %0, R5\n"
        : "=r"(stackPointer)
    );
    
    return stackPointer;
}
相关推荐
大江东去浪淘尽千古风流人物2 小时前
【cuVSLAM】GPU 加速、多相机、实时视觉/视觉惯性 SLAM设计优势
c++·人工智能·数码相机·ubuntu·计算机视觉·augmented reality
CPUOS20108 小时前
嵌入式C语言高级编程之MVC设计模式
c语言·设计模式·mvc
jolimark8 小时前
C语言存在的问题及Zig语言如何改进,差异对比全在这
c语言·内存管理·系统编程·类型系统·zig语言
自信150413057598 小时前
重生之从0开始学习c++之模板初级
c++·学习
青梅橘子皮8 小时前
C语言---指针的应用以及一些面试题
c语言·开发语言·算法
历程里程碑9 小时前
2. Git版本回退全攻略:轻松掌握代码时光机
大数据·c++·git·elasticsearch·搜索引擎·github·全文检索
极客智造9 小时前
深度解析 C++ 类继承与多态:面向对象编程的核心
c++
零号全栈寒江独钓12 小时前
基于c/c++实现linux/windows跨平台获取ntp网络时间戳
linux·c语言·c++·windows
CSCN新手听安12 小时前
【linux】高级IO,以ET模式运行的epoll版本的TCP服务器实现reactor反应堆
linux·运维·服务器·c++·高级io·epoll·reactor反应堆
松☆13 小时前
C++ 算法竞赛题解:P13569 [CCPC 2024 重庆站] osu!mania —— 浮点数精度陷阱与 `eps` 的深度解析
开发语言·c++·算法