模式(小例9-2)

来源:互联网 发布:新浪微博域名二次修改 编辑:程序博客网 时间:2024/06/05 04:13



今天在这里:微笑

先打印这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);

}



vector.s如下:

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


最后的打印结果如下:



原创粉丝点击