天天看点

Linux环境下ARM9开发中交叉编译的movt指令相关问题前言:一、movt命令与movw命令二、解决方法

前言:

为什么写这篇文章?

笔者在ARM9(s3c2440)的linux下开发中遇到了非常基础的问题,就是关于movt和movw的问题,下面将详细解答。

一、movt命令与movw命令

关于movt命令,我是在linux下反汇编后发现的问题

在使用arm-linux-gcc对c语言文件进行编译时并未报错,

程序文件正常编译,但当c程序中调用32位数据的赋值操作时

程序执行在UND模式,也就是ARM无法识别指令,最终将问题

定位到movt与movw,这两个指令是使用arm-linux-gcc

编译时自动产生。

例如

#define GPBCON	 ( *( volatile unsigned long* ) 0x56000010 )
void fun(void){
	GPBCON = (1<<10);		//设置GPB5为输出模式
}
           

上面是一段最简单的电亮led的代码,但在执行时系统运行在UND模式。

当使用命令arm-linux-objdump -d ,对目标文件进行反汇编时进行进行的赋值操作:

出现以下反汇编代码:

Linux环境下ARM9开发中交叉编译的movt指令相关问题前言:一、movt命令与movw命令二、解决方法

第48地址movw命令代表将imm16放在r3寄存器的低16位,清零高16位,

第4c地址movt命令代表将imm22016放在r3寄存器的高16位,不影响低16位,

所以正常来讲,应该有r3 = imm16+(imm22016<<16),也就是0x56000010

但是movt和movw对于ARM9来讲是却是UND的命令,上网查找后发现,ARM9是ARMv4的指令集,

而movt和movw是只可用于ARMv6T2 及更高版本,于是出现undef异常的情况。

二、解决方法

执行指令是添加编译选项 -march=armv4t

arm-linux-gcc -march=armv4t -c -o main.o main.c
           

使用march指定指令集即可

继续阅读