嵌入式汇编实验三

嵌入式汇编实验三

环境:ADS
软件:Metrowerks CodeWarrior for ARM Developer Suite v1.2
注意:汇编文件.s的名称不能和c文件.c的名称相同,因为他们需要生成各自的.o文件。

一、交换字符串

要求:用C语言和汇编语言混合编程实现:在C语言程序中调用汇编语言代码,完成字符串STR1与STR2内容的互换(假设STR1和STR2长度一致)。

C语言:

# include <stdio.h>
extern void swap(char *d,char *s);

int main() {
	char *str1 = "AAAAA";
	char *str2 = "BBBBB";
	printf("Before swaping:\n");
	printf("%s\n%s\n", str1, str2);
	swap(str1, str2);
	printf("After swaping:\n");
	printf("%s\n%s\n", str1, str2);
	return(0);
}

汇编语言:

	AREA Swap,CODE,READONLY
	EXPORT swap

swap
	LDRB R2,[R0]
	LDRB R3,[R1]
	STRB R2,[R1]
	STRB R3,[R0]
	ADD R0,R0,#1
	ADD R1,R1,#1
	CMP R2,#0
	BNE swap
	MOV PC,LR
	END

二、排序

要求:用C语言和汇编语言混合编程实现:在C语言程序中调用汇编语言代码,将输入的20个字节数据,从大到小加以排序,大数在前,小数在后。

C语言:

# include <stdio.h>
extern void rank(char *s);

int main() {
	char *str = "ABCDEFGHIJKLMNOPQRST";
	printf("Before ranking:\n");
	printf("%s\n", str);
	rank(str);
	printf("After ranking:\n");
	printf("%s\n", str);
	return(0);
}

汇编语言:

	AREA Rank,CODE,READONLY
	EXPORT rank

rank				; 冒泡排序

	MOV R1,#19		; R1:外层循环次数
	
loop1				; 外循环
	
	MOV R0,R4
	MOV R2,#19		; R2:内层循环次数
		
loop2				; 内循环
		
	LDRB R3,[R0],#1
	LDRB R5,[R0]
	MOV R6,PC		; 保存PC地址
	ADD R6,R6,#8
	CMP R3,R5
	BLO swap
	SUB R2,R2,#1
	CMP R2,#0
	BNE loop2
			
	SUB R1,R1,#1
	CMP R1,#0
	BNE loop1
	
	MOV PC,LR
	
swap

	MOV R7,R3
	MOV R3,R5
	MOV R5,R7
	STRB R3,[R0,#-1]
	STRB R5,[R0]
	MOV PC,R6

	END

假设 MOV R6,PC 这条指令的地址是0x00008000,执行此条语句后 R6 的值会变为 0x00008008 ,因为对于3级流水线,PC总是指向下两条指令的地址,因此PC保存的值是当前指令地址值加8;对于5级流水线,PC保存的是当前指令地址加12

C程序在调用汇编程序时,选用 R0~R3 进行传参,R4~R7 用作记录 R0~R3 的初始地址,以保证 R0~R3 的值改变后能正常返回,所以此题中用了 R0 传递字符串,R4 记录的 R0 的一开始的地址,不能去修改它,所以不用 R4。

三、访问全局变量

要求:用C语言和汇编语言混合编程实现:用汇编语言完成对C语言全局变量的访问。假设CVAR1和CVAR2是C语言中定义的全局变量,请用一段汇编语言访问它们,完成两者的相加运算,结果存放在CVAR1中。

C语言:

# include <stdio.h>
extern void test3();
unsigned int CVAR1 = 1;
unsigned int CVAR2 = 5;

int main() {
	printf("Before adding:\n");
	printf("%d\n", CVAR1);
	test3();
	printf("After adding:\n");
	printf("%d\n", CVAR1);
	return(0);
}

汇编语言:

	AREA Test3,CODE,READONLY
	EXPORT test3
	IMPORT CVAR1
	IMPORT CVAR2

test3

	LDR R0,=CVAR1
	LDR R1,=CVAR2
	LDR R2,[R0]
	LDR R3,[R1]
	ADD R2,R2,R3
	STR R2,[R0]
	MOV PC,LR
	END

四、函数调用

要求:用C语言和汇编语言混合编程实现:利用汇编语言程序调用C语言子程序的方式来求 i+ 2i + 3i +4i + 5i +6*i的和(设i为一个整型常数)。

C语言:

# include <stdio.h>
extern int g(int a, int b, int c, int d, int e, int f) {
	return a+b+c+d+e+f;
}

汇编语言:

	AREA f,CODE,READONLY
	EXPORT f
	IMPORT g
	ENTRY
	
start

	MOV R0,#1		;i的值
	ADD R1,R0,R0	;计算i*2
	ADD R2,R1,R0	;计算i*3
	ADD R3,R1,R2	;计算i*5
	STR R3,[SP,#-4]!
	ADD R3,R2,R2	;计算i*6
	STR R3,[SP,#-4]!
	ADD R3,R1,R1	;计算i*4
	BL g
	END

本题中需要传递 6 个参数,R0~R3 不够用,于是将多出来的 i * 5 和 i * 6 压入堆栈中,假设 SP 堆栈指针的初始值为 0x00000000,压入 i * 5 后,地址 0xFFFFFFFC 的值为 i * 5,SP 的值为 0xFFFFFFFC,接着压入 i * 6,SP 的值变为 0xFFFFFFF8,地址中的值为 i * 6

在调用函数的时候,R0~R3 分别传入 a~d 变量中,堆栈的传参是从小地址开始,先把地址为0xFFFFFFF8中的 i * 6 传入变量 d ,然后把地址 0xFFFFFFFC 中的 i * 5 传入变量 e

嵌入式开发工具 ARM Developer Suite v1.2 ARM Developer Suite? ADS 是全套的实时开发软件工具包编译器生成的代码密度和执行速度优异可快速低价地创建ARM 结构应用ADS包括三种调试器ARM eXtended Debugger AXD 向下兼容的ARMDebugger for Windows/ARM Debugger for UNIX 和ARM 符号调试器其中AXD 不仅拥有低版本ARM 调试器的所有功能还新添了图形用户界麵更方便的视窗管理数据显示格式化和编辑以及全套的命令行界麵该產品还包括RealMonitor? 可以在前台调试的同时断点续存并且在不中断应用的情况下读写内存跟踪调试工具 ARM 的Real-Time Trace? 和RealMonitor 均為重要的实时调试解决方案能够缩短开发周期提供特殊软件调试功能可运行於带深度嵌入处理器内核的高集成系统芯片SoC ARM 的Real-Time Trace 產品包括跟踪调试工具MultiTrace 嵌入式跟踪宏单元和Multi-ICE ARM 的RealMonitor包括RMTarget? RMHost? 是ARM Developer Suite (ADS) 的补充硬件 Integrator? Integrator 系列是灵活高效的系统芯片开发平台集成ARM PrimeCell?外设和相关驱动器等软件和硬件能够缩短產品开发周期降低生產总成本固件 ARM Firmware Suite? ARM 固件组是跟底层硬件相关的应用封装能在ARM 开发平台上迅速建立基於Integrator 或其它ARM内核的应用和操作系统模型工具 ModelGen ModelGen 是在模拟器上开发和支持复杂半导体器件保留模块的先进建模工具為ARM 独家拥有ARM 的合作伙伴采用ModelGen 在各种仿真器和计算平台上实现信号传输质量和时序模拟 操作可看http://blog.163.com/haoshida_nanjing/blog/static/213358122009622111013200/
### 回答1: Metrowerks CodeWarrior for ARM是一款针对ARM架构的软件开发工具,主要用于嵌入式系统的开发。它提供了一套完整的开发环境,包括编译器、调试器、IDE等,能够帮助开发者快速、高效地开发ARM架构的应用程序。 ### 回答2: Metrowerks CodeWarrior for ARM是一款大型集成开发环境(IDE),用于ARM架构的嵌入式系统开发。它提供了一个强大的编译器、源代码编辑器和调试器,可以帮助程序员编写和调试高效、稳定的嵌入式软件。 CodeWarriorARM编译器使用了高效、优化的ARM指令集,可生成高效的代码,从而提高了软件的执行速度和效率。此外,集成的源代码编辑器具有许多高级功能,例如语法高亮、代码补全、代码折叠、跳转等,能够极大地提高编码效率。 CodeWarrior还包括一个全特性的调试器,可以帮助程序员分析和调试代码中的错误。同时,它还支持各种强大的调试工具,例如源代码调试、内存调试、寄存器调试、硬件调试等。这些功能都有助于开发人员快速、准确地发现并修复系统中的故障。 总之,Metrowerks CodeWarrior for ARM是一款非常强大的嵌入式系统开发工具套件,包括编译器、源代码编辑器和调试器,可帮助程序员在ARM架构上编写高效、稳定的嵌入式软件,快速定位和修复问题。它还提供了广泛的技术支持和资源,可以满足各种不同应用场景下的开发需求。 ### 回答3: Metrowerks CodeWarrior是一个集成的开发环境(IDE),可用于开发各种编程语言和处理器/架构的项目。针对ARM处理器的版本称为CodeWarrior for ARMCodeWarrior for ARM支持ARM Cortex-M处理器中的多个系列(包括Cortex-M0,M3,M4和M7),以及早期的ARM7和ARM9架构。该软件提供了一个完整的开发流程,包括C和C ++编译器,调试器和Windows寄存器级仿真器。这使得开发人员能够创建高度优化的嵌入式代码,并轻松地将其部署到各种设备中。 CodeWarrior for ARM还提供了许多工具和库,以加快开发速度。这些工具和库包括USB和TCP / IP协议堆栈,文件系统,图形库等。它还提供了与其他外部工具的集成,如版本控制工具和编译器。 CodeWarrior for ARM是一款强大的工具,它可以帮助嵌入式系统开发人员快速创建稳定和高效的应用程序,并且通过其丰富的功能和支持众多协议和架构,使得其适用于各种应用场景,包括工业自动化,物联网,智能家居等。它是一个值得信赖的工具,广受嵌入式开发群体的认可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值