ARM汇编实验-工作模式
2014-06-06 20:31
274 查看
USR_STACK_LEGTH EQU 64 SVC_STACK_LEGTH EQU 0 FIQ_STACK_LEGTH EQU 16 IRQ_STACK_LEGTH EQU 64 ABT_STACK_LEGTH EQU 0 UND_STACK_LEGTH EQU 0 AREA Example5, CODE, READONLY ENTRY CODE32 START MOV R0, #0 ;0x40000000 MOV R1, #1 ;0x40000004 MOV R2, #2 ;0x40000008 MOV R3, #3 ;0x4000000c MOV R4, #4 ;0x40000010 MOV R5, #5 ;0x40000014 MOV R6, #6 ;0x40000018 MOV R7, #7 ;0x4000001c MOV R8, #8 ;0x40000020 MOV R9, #9 ;0x40000024 MOV R10, #10 ;0x40000028 MOV R11, #11 ;0x4000002c MOV R12, #12 ;0x40000030 BL InitStack ;0x40000034 ;打开IRQ中断(将CPSR寄存器的I位清零) MRS R0,CPSR ;0x40000038 BIC R0,R0,#0X80 ;0x4000003c MSR CPSR_cxsf, R0 ;0x40000040 ;切换到用户模式 MSR CPSR_c, #0xd0 ;0x40000044 MRS R0, CPSR ;0x40000048 ;切换到管理模式 MSR CPSR_c, #0xdf ;0x4000004c MRS R0, CPSR ;0x40000050 HALT B HALT ;0x40000054 InitStack MOV R0, LR ;0x40000058 ;设置管理模式堆栈 MSR CPSR_c, #0xd3 ;0x4000005c LDR SP, StackSvc ;0x40000060 ;设置中断模式堆栈 MSR CPSR_c, #0xd2 ;0x40000064 LDR SP, StackIrq ;0x40000068 ;设置快速中断模式堆栈 MSR CPSR_c, #0xd1 ;0x4000006c LDR SP, StackFiq ;0x40000070 ;设置中止模式堆栈 MSR CPSR_c, #0xd7 ;0x40000074 LDR SP, StackAbt ;0x40000078 ;设置未定义模式堆栈 MSR CPSR_c, #0xdb ;0x4000007c LDR SP, StackUnd ;0x40000080 ;设置系统模式堆栈 MSR CPSR_c, #0xdf ;0x40000084 LDR SP,StackUsr ;0x40000088 MOV PC,R0 ;0x4000008c StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH - 1)*4 ;0x40003000+FC(252)=0x400030FC(用户(系统)模式堆栈起始地址) StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)*4 ;0x40003100+(-4) =0x400030FC(管理模式堆栈起始地址) StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)*4 ;0x40003100+FC(252)=0x400031FC(向量中断模式堆栈起始地址) StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)*4 ;0x40003200+3C(60) =0x4000323C(快速中断模式起始地址) StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)*4 ;0x40003240+(-4) =0x4000323C(中止模式堆栈起始地址) StackUnd DCD UndStackSpace + (UND_STACK_LEGTH - 1)*4 ;0x40003240+(-4) =0x4000323C(未定义模式堆栈起始地址) AREA MyStacks, DATA, NOINIT, ALIGN=2 UsrStackSpace SPACE USR_STACK_LEGTH * 4 ;0x40003000 连续分配256B SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;0x40003100 连续分配0B IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;0x40003100 连续分配256B FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;0x40003200 连续分配64B AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;0x40003040 连续分配0B UndStackSpace SPACE UND_STACK_LEGTH * 4 ;0x40003040 连续分配0B END |
31 30 29 28 --- 7 6 5 4 3 2 1 0
N Z C V I F T M4 M3 M2 M1 M0
0 1 0 0 0 0 User用户模式
0 1 0 0 0 1 FIQ 快中断模式
0 1 0 0 1 0 IRQ 中断模式
0 1 0 0 1 1 SVC 管理模式
0 1 0 1 1 1 ABT 中止模式
0 1 1 0 1 1 UND 未定义模式
0 1 1 1 1 1 SYS 系统模式
![](http://blogimg.chinaunix.net/blog/upfile2/091218120140.jpg)
500)this.width=500;">
CPSR的N,Z,C,V是条件代码标志,含义如下:
(1)负标志N:运算结果的第31位值,记录标志设置操作的结果。
(2)零标志Z:如果标志设置运算结果为0,则置位。
(3)进位标志位C:记录无符号加法溢出,减法无借位,循环移位。
(4)溢出标志V:记录标志设置操作的有符号溢出。
I和F为中断标志位。T为处理器状态位。
当I置位时,IRQ中断禁止,否则IRQ使能
当F置位时,FIQ中断禁止,否则FIQ使能
当T置位时,处理器在Thumb状态。
当T清零时,处理器在ARM状态。
这里使用ADS1.2进行调试的,首先设置工程链接地址RO Base为0x40000000,RW Base为0x40003000,设置调试入口地址Image entry point为0x400000000。
这些值可以根据自己板子的情况设定。
使用AXD调试我们可以得到各个模式下的堆栈分配情况:
模式 起始地址 结束地址
SVC: 0x400030FC 0x400030FC
IRQ: 0x400031FC 0x40003100
FIQ: 0x4000323C 0x40003200
ABT: 0x4000323C 0x4000323C
UND: 0x4000323C 0x4000323C
SYS: 0x400030FC 0x40003000
阅读(892) | 评论(0) | 转发(0) |
0
上一篇:linux内核双向循环链表实例
下一篇:ARM9裸机的UART程序测试
相关热门文章
公司的服务理念
公司的实力雄厚,有高效力的服...
公司以破诚信为本
Live UC论视频会议对企业的重...
我们现在已经得到了别人的地方...
shell中字符串操作
shell中的特殊字符
stagefright与opencore对比
linux守护进程的几个关键地方...
Android常用的一些make命令...
初学UNIX环境高级编程的,关于...
chinaunix博客什么时候可以设...
一个访问量较大网站的服务器。...
收音机驱动与v4l2架构的关系,...
如何将linux驱动改为裸机驱动(...
给主人留下些什么吧!~~
评论热议
相关文章推荐
- ARM工作模式选择(汇编语言)分析
- 二 ARM工作模式
- ARM工作模式和寄存器
- ARM工作模式
- ARM工作模式
- 【实验】 ARM汇编程序设计
- ARM工作模式和BOOTLOADER ---好
- ARM工作模式及寄存器
- 嵌入式中 ARM的几种工作模式 以及异常模式的优先级
- ARM汇编编程基础(五) -- 其它常见寻址模式与常见指令
- arm 工作模式
- ARM工作模式
- ARM寄存器的7种工作模式和几种寻址方式
- GUN ARM的汇编的.balignl 16,0xdeadbeef 实验
- ARM工作模式
- 《ARM与Linux些许问题》第一章:ARM工作模式
- GNU ARM汇编的.balignl对齐实验
- 【实验】Arm汇编和C语言混合编程实验
- ARM启动及工作模式转换
- ARM汇编指令(ARM工作模式、寄存器)