ARM未定义指令异常学习中关于字节对齐的心得
今天学习jz2440开发板的未定义指令异常这一节课程,跟随韦东山老师编写代码编译烧写后程序老师无法正常运行,经过仔细排查发现是字节未4字节对齐导致的,之前的程序中start.S文件如下开始:
_start:
/* 关闭看门狗 */
ldr r0, =0x53000000
ldr r1, =0
str r1, [r0]
指令从开始就是按照4字节对齐排放的,这样运行程序没有问题。但当在_start标签后增加未定义指令异常处理语句后,代码如下:
_start:
b reset
b do_und
do_und:
ldr sp, =0x34000000
stmdb sp!, {r0-r12, lr}
mrs r0, cpsr
ldr r1, =und_string
bl printException
ldmia sp!, {r0-r12, pc}^
und_string:
.string "underdefined instruction exception"
.align 4
reset:
/* 关闭看门狗 */
ldr r0, =0x53000000
ldr r1, =0
str r1, [r0]
如果不在reset标签前增加.align 4语句,那么编译后的reset段代码的地址为0x300000043,就不是4字节对齐的,所以程序启动后无法正常跳转执行。