lv11 嵌入式开发 ARM指令集中(伪操作与混合编程) 7

目录

[1 伪指令](#1 伪指令)

[2 伪操作](#2 伪操作)

[3 C和汇编的混合编程](#3 C和汇编的混合编程)

[4 ATPCS协议](#4 ATPCS协议)


1 伪指令

本身不是指令,编译器可以将其替换成若干条等效指令

复制代码
		@ 空指令
		NOP
		
		@ 指令
		LDR R1, [R2]
		@ 将R2指向的内存空间中的数据读取到R1寄存器
		
		@ 伪指令
		LDR R1, =0x12345678
		@ R1 = 0x12345678	
		@ LDR伪指令可以将任意一个32位的数据放到一个寄存器
		
		LDR R1, =STOP
		@ 将STOP表示的地址写入R1寄存器
		
		@ LDR R1, STOP
		@ 将STOP地址中的内容写入R1寄存器

2 伪操作

不会生成代码,只是在编译之前告诉编译器怎么编译

复制代码
@ GNU的伪操作一般都以'.'开头
		
		@ .global symbol
		@ 将symbol声明成全局符号
		
		@ .local symbol
		@ 将symbol声明成局部符号
		
		@ .equ DATA, 0xFF
		@ MOV R1, #DATA
        @ 相当于define
		
		@ .macro FUNC
		@	MOV R1, #1
		@	MOV R2, #2
		@ .endm
		@ FUNC
        @ .macro 相当于函数封装
		
		@ .if 0
		@	MOV R1, #1
		@	MOV R2, #2
		@ .endif
	
		@.rept 3
		@ 	MOV R1, #1
		@ 	MOV R2, #2
		@.endr
		
		@ .weak symbol
		@ 弱化一个符号,即告诉编译器即便没有这个符号也不要报错
		@ .weak func
		@ B func
		
		@ .word VALUE
		@ 在当前地址申请一个字的空间并将其初始化为VALUE
		@ MOV R1, #1
		@ .word 0xFFFFFFFF
		@ MOV R2, #2
		
		@ .byte VALUE	
		@ 在当前地址申请一个字节的空间并将其初始化为VALUE
		@ MOV R1, #1
		@ .byte 0xFF
		
		@ .align N
		@ 告诉编译器后续的代码2的N次方对其
		@ .align 4
		@ MOV R2, #2
		
		@ .arm
		@ 告诉编译器后续的代码是ARM指令
		
		@ .thumb
		@ 告诉编译器后续的代码是Thumb指令
		
		@ .text				
		@ 定义一个代码段
		
		@ .data				
		@ 定义一个数据段

        @ .end 之前的代码都是汇编代码
		
		@ .space N, VALUE
		@ 在当前地址申请N个字节的空间并将其初始化为VALUE
		@ MOV R1, #1
		@ .space 12, 0x12
		@ MOV R2, #2
		
		@ 不同的编译器伪操作的语法不同

rept示例

.word示例

.byte示例

.align 2代表对齐,2代表2的2次方对齐,即4的整数倍。如果3代表8的整数倍。

3 C和汇编的混合编程

通用寄存器指令

  • 1、数据处理指令
  • 2、跳转指令
  • 3、内存读写指令load

Arm专用指令,不会有C语言与之对应

  • 4、CPSR
  • 5、SWI
  • 6、协处理器指令

上电的第一段代码都是用汇编写的。

复制代码
	@ C和汇编的混合编程原则:在哪种语言环境下符合哪种语言的语法规则
		@ 1. 在汇编中将C中的函数当做标号处理
		@ 2. 在C中将汇编中的标号当做函数处理
		@ 3. 在C中内联的汇编当做C的语句来处理

		@ 1. 方式一:汇编语言调用(跳转)C语言
			@ MOV R1, #1
			@ MOV R2, #2
			@ BL  func_c  @func_c用c写,最后会通过LR跳转回来,不写括号
			@ MOV R3, #3
		
		@ 2. 方式二:C语言调用(跳转)汇编语言
            @ .global FUNC_ASM  @必须加.global否则c文件中不认识
@ FUNC_ASM:
			@ MOV R4, #4
			@ MOV R5, #5
			
    void func_c(void)
    {
	    int a;
	    a ++;
	    //C语言调用(跳转)汇编语言
	    FUNC_ASM();   //需要括号
	    a --;
    }


		@ 3. C内联(内嵌)汇编

/*
void func_c(void)
{
	int a;
	a ++;
	//C内联(内嵌)汇编
	asm
	(
		"MOV R6, #6\n"
		"MOV R7, #7\n"
	);
	//C语言调用(跳转)汇编语言
	FUNC_ASM();
	a --;
}
*/

4 ATPCS协议

复制代码
@ ATPCS协议主要内容 
	
		@ 1.栈的种类
		@ 	1.1 使用满减栈
	
		@ 2.寄存器的使用
		@	2.1 R15用作程序计数器,不能作其他用途	
		@ 	2.2 R14用作链接寄存器,不能作其他用途
		@	2.3 R13用作栈指针,不能作其他用途
		@	2.4 当函数的参数不多于4个时使用R0-R3传递,当函数的参数多于4个时,多出的部分用栈传递
		@	2.5	函数的返回值使用R0传递
		@ 	2.6 其它寄存器主要用于存储局部变量

总结,参数尽量小于3,放在寄存器中效率高一点。

相关推荐
CinzWS11 小时前
A53多核协同(上):核间通信与缓存一致性协议——ARM多核的“心灵感应“
arm开发·嵌入式·芯片验证·原型验证·a53
CinzWS17 小时前
A53多核协同(下):一致性内存模型与内存屏障——ARM多核的“时间魔法“
arm开发·嵌入式·原型验证·a53
EnglishJun18 小时前
ARM嵌入式学习(二十四)--- 库移植(移植到开发板)
arm开发·学习
AI服务老曹1 天前
异构计算时代的安防底座:基于 Docker 的 X86/ARM 双模部署与 NPU 资源池化实战
arm开发·docker·容器
EnglishJun1 天前
ARM嵌入式学习(二十三)--- I2C总线和SPI总线
arm开发·学习
wwwlyj1233212 天前
arm dap
arm开发
想放学的刺客3 天前
单片机嵌入式试题(第34期)嵌入式开发的利器:逻辑分析仪与示波器深度解析
arm开发·stm32·单片机·嵌入式硬件·物联网
CinzWS3 天前
A53电源管理(下):DVFS与热管理的硬件实现——ARM芯片的“冷静艺术“
arm开发·嵌入式·芯片验证·原型验证·a53
誰能久伴不乏4 天前
剥开协议的伪装:用 Wireshark 显微镜级拆解 TCP 握手与挥手
arm开发·tcp/ip·wireshark
somi74 天前
ARM-驱动-10自定义通信协议
linux·arm开发·自用