L9-D10伪操作与混合编程

本文介绍了ARM体系结构中的伪操作,如声明符号、宏定义、条件编译等,并探讨了C和汇编的混合编程方法,包括如何在两者间进行函数调用。此外,详细阐述了ATPCS协议,它是ARM-THUMB平台上的一种函数调用标准,规定了寄存器使用、参数传递、栈管理和返回值处理的规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

10.1伪操作

10.2C和汇编的混合编程

10.3ATPCS协议

10.4ARM体系结构总结

作业


10.1伪操作

C语言中,带;的称为语句,一般可以编译。带#的称为预处理指令,预处理时处理,不参与编译。

伪操作类似于带#

@ 3.伪操作:不会生成代码,只是在编译之前告诉编译器怎么编译
		
		@ GNU的伪操作一般都以‘.’开头
		
		@ .global symbol
		@ 将symbol声明成全局符号
		
		@ .local symbol
		@ 将symbol声明成局部符号
		
		@ .equ DATA, 0xFF 
        @ 类似于宏定义DATA代表0xFF  
        @ MOV R1, #DATA
		
		@ .macro FUNC        @封装开头
		@	MOV R1, #1
		@	MOV R2, #2
		@ .endm              @封装结尾
		@ FUNC               @封装结尾
		
		@ .if 0              @if开头
		@	MOV R1, #1
		@	MOV R2, #2
		@ .endif             @if结尾
	
		@.rept 3             @重复编译x遍
		@ 	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				 @ 定义一个数据段
		
		@ .space N, VALUE    @ 在当前地址申请N个字节的空间并将其初始化为VALUE
		@ MOV R1, #1
		@ .space 12, 0x12    @ 在当前地址申请12个字节的空间并将其初始化为0x12
		@ MOV R2, #2
		
		@ 不同的编译器伪操作的语法不同

10.2C和汇编的混合编程

@ C和汇编的混合编程

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

		@ 1. 方式一:汇编语言调用(跳转)C语言
			@ MOV R1, #1
			@ MOV R2, #2
			@ BL  func_c
			@ MOV R3, #3
		
		@ 2. 方式二:C语言调用(跳转)汇编语言
@ .global FUNC_ASM
@ FUNC_ASM:
			@ MOV R4, #4
			@ MOV R5, #5
			
		@ 3. C内联(内嵌)汇编

10.3ATPCS协议

ATPCS协议(ARM-THUMB Procedure Call Standard)

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

10.4ARM体系结构总结

作业

1.简述ATPCS(ARM-THUMB Procedure Call Standard)协议的主要内容是什么

主要内容包括以下几个方面:

1. 寄存器使用规范:ATPCS规定了在函数调用过程中哪些寄存器需要被保存,哪些可以被修改,哪些需要被恢复。具体来说,ATPCS规定了R0-R3、R12、lr、pc寄存器需要被保存,其他寄存器可以被修改。

2. 参数传递规范:ATPCS规定了函数参数的传递方式,即前四个参数通过R0-R3寄存器传递,其他参数通过栈传递。

3. 栈使用规范:ATPCS规定了栈的使用方式,包括栈的增长方向、栈帧的组成、栈帧的大小等。 4. 返回值规范:ATPCS规定了函数返回值的传递方式,即通过R0寄存器传递。

ATPCS是ARM-THUMB平台上的一种标准,它的主要目的是为了确保不同的编译器和库之间能够正确地进行函数调用和参数传递,从而实现代码的可移植性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值