Linux环境下ARM9开发中交叉编译的movt指令相关问题

前言:


为什么写这篇文章?

笔者在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 ,对目标文件进行反汇编时进行进行的赋值操作:
出现以下反汇编代码:
在这里插入图片描述
第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指定指令集即可

猜你喜欢

转载自blog.csdn.net/qq_26106317/article/details/104356631