今天在这里:
先打印这cpsr;通过一条未定义指令,进入异常处里,打印cpsr,又回到之前的那个模式;然后再打印cpsr
test.c=>vector.s=>test.c==>结束
test.c如下:
int (*printf)(char *,...) = (void *)0x57e11d4c;//将一个函数指针指向0x57e11d4c的地址。
int main(){
unsigned long cpsr;
__asm__ __volatile__(
"mrs %0,cpsr\n" //将cpsr寄存器中的值放到,我们自定义的变量cpsr中。
:"=r"(cpsr)
:
:"memory"
);
printf("cpst is %x\n",cpsr&0x1f);
__asm__(
".word 0x77777777"//这里经过一条未定义的指令,arm进入到异常地址
undefine instructions :0x0000 0004
);
printf("welcome back !\n");
__asm__ __volatile__(
"mrs %0,cpsr\n"
:"=r"(cpsr)
:
:"memory"
);
printf("cpst is %x\n",cpsr&0x1f);
}
mov sp,#0x56000000 //在内存中的0x56000000中开辟一个栈空间。
mov ip,sp
stmdb sp!,{r0-r12,lr}
sub fp,ip,#4
mrs r1,cpsr //在r1与r2 中放printf的两个参数。
and r1,r1,#0x1f
ldr r0,=string
ldr r2,printf
blx r2
mov sp,#0x56000000
ldmdb sp,{r0-r12,pc}^
string:
.asciz "hello unfined mod is %x\n"
.align 2
printf:
.word 0x57e11d4c
makefile如下:
all:
arm-none-linux-gnueabi-gcc -c vetor.s -o vetor.o
arm-none-linux-gnueabi-ld -Ttext=0x4 vetor.o -o vetor//上面有一张表未定义指令地址为0x4
arm-none-linux-gnueabi-objcopy -Ielf32-littlearm -O binary vetor vetor.bin
cp vetor.bin /tftpboot/
arm-none-linux-gnueabi-gcc -c test.c -o test.o
arm-none-linux-gnueabi-ld -Ttext=0x50000000 test.o -o test
arm-none-linux-gnueabi-objcopy -Ielf32-littlearm -O binary test test.bin
cp test.bin /tftpboot/
clean:
rm -rf *.o *.bin /tftpboot/*.bin
最后的打印结果如下: