当前位置: 首页 > news >正文

品牌厂家网站建设旅游公司电子商务网站建设策划书

品牌厂家网站建设,旅游公司电子商务网站建设策划书,搜索引擎seo优化,app开发兼职的价位Linux 学习记录53(ARM篇) 本文目录 Linux 学习记录53(ARM篇)一、内存读写指令1. 在C语言中读取内存2. 指令码及功能3. 格式4. 使用示例5. 寻址方式(1. 前索引方式(2. 后索引方式(3. 自动索引 6.批量寄存器操作指令(1. 操作码(2. 格式(3. 使用示例(4. 地址增长方式1 ia后缀1 ia后缀2 ib后缀3 da后缀4 db后缀 二、栈内存的读写1. 概述2. 栈的类型3. 满减栈的压栈和出栈实现4. 叶子函数和非叶子函数 三、状态寄存器CPSR读写指令1. 指令码及格式2. 使用示例3. 注意事项 四、软中断指令1. 概念2. 指令码和格式3. ARM异常处理过程分析(1. ARM异常源以及异常模式(2. 异常的处理过程分析(3. 异常向量表(4. swi异常处理代码 一、内存读写指令 在下图界面中可以搜索指定的内存地址 1. 在C语言中读取内存 例如已知可以访问的地址为0x12345678(unsigned int*)0x12345678//将其强制转换为unsigned int类型的地址 *((unsigned int*)0x12345678)//获取0x12345678地址下的数据2. 指令码及功能 写内存 1. str:向指定内存中写入一个字的数据 2. strh:向内存中写入半个字的数据 3. strb:向内存中写入一个字节的数据 读内存 4. ldr:从内存中读取一个字的数据 5. ldrh:从内存中读取半个字的数据 6. ldrb:从内存中读取一个字节的数据3. 格式 指令码{条件码} 目标寄存器 [目标地址] 例如 str r1,r0] 将目标寄存器的数值写入到目标地址对应的内存中 ldr r1,[r0] 在目标地址中读取一个字的数据到4. 使用示例 .text .global _start _start:mov r0,#0x40000000mov r1,#0xffffffffstr r1,[r0] 将r1中的数据写一个字到0x40000000内存中 stop:b stop .end 5. 寻址方式 (1. 前索引方式 .text .global _start _start:mov r0,#0x40000000mov r1,#0xffffffff前索引方式str r1,[r0,#8] 将r1中的数据写一个字到0x400000008的内存中ldr r2,[r0,#8] 读取r08对应的地址内存中的一个字的数据到r2中 stop:b stop .end (2. 后索引方式 .text .global _start _start:mov r0,#0x40000000mov r1,#0xffffffff后索引方式 完成一次存储后r0寄存器会自动偏移8str r1,[r0],#8 将r1中的数据写一个字到0x40000000的内存中 stop:b stop .end (3. 自动索引 结合了前两者的索引方式 .text .global _start _start:mov r0,#0x40000000mov r1,#0xffffffff自动索引方式 完成一次存储后r0寄存器会自动偏移8str r1,[r0,#8]! 将r1中的数据写一个字到0x400000008的内存中 stop:b stop .end 6.批量寄存器操作指令 (1. 操作码 1. stm 写 2. ldm 读(2. 格式 stm rm,{寄存器列表}将寄存器列表中每一个寄存器的数值存放到以rm数值为起始地址的内存中 ldm rm,{寄存器列表}从rm数值为起始地址的内存中 读取指定数量的数据到寄存器列表中每一个寄存器内解释1.rm:存放操作的内存首地址的寄存器2.关于寄存器列表中的寄存器的表达方式如果寄存器列表中寄存器编号连续可以用-表示范围 {r7-r11}如果寄存器列表中寄存器的编号不连续可以用分隔 {r7,r8,r9,r10,r11}3.无论寄存器列表中的寄存器顺序是什么样的在操作内存时始终是低地址对应小编号寄存器ex:ldm r6,{r11,r10,r9,r7,r8} 虽然列表中寄存器顺序散乱但是r7是对应最小的地址数值(3. 使用示例 .text .global _start _start:mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5mov r6,#0x40000000stm r6,{r1-r5} 将r1-r5寄存器的数据批量存放到内存中stm r6,{r1,r2,r3,r4,r5} 将r1-r5寄存器的数据批量存放到内存中ldm r6,{r7-r11} 将内存中的数据批量读取到r7-r1寄存器中stop:b stop .end (4. 地址增长方式 1 ia后缀 ia后缀先往指定的寄存器数值为起始地址中存放数据然后该寄存器数值自动偏移 例stmia r6!,{r1-r5} .text .global _start _start:mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5mov r6,#0x40000000stmia r6!,{r1-r5}stop:b stop .end 2 ib后缀 ib后缀先让指定寄存器的数值增大再存放数据 .text .global _start _start:mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5mov r6,#0x40000000stmib r6!,{r1-r5}stop:b stop .end 可以看到是先偏移在存放数据 3 da后缀 da后缀先存放后再向小地址偏移 .text .global _start _start:mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,0x40000800stmda r6!,{r1-r5}stop:b stop .end 4 db后缀 db后缀先偏移后存放 .text .global _start _start:mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,0x40000800stmdb r6!,{r1-r5}stop:b stop .end 可以看到是先从0800偏移后再存放的数据 二、栈内存的读写 1. 概述 栈指针寄存器R13 [SP],sp始终保存栈顶元素的首地址 栈的本质就是一段内存空间被分出来用于存放一些临时数据我们可以用过对栈区内存读写来保护现场 2. 栈的类型 1. 增栈基于栈指针寄存器完成压栈之后栈指针的数组往地址大的方向增长 2. 减栈基于栈指针寄存器完成压栈之后栈指针的数组往地址小的方向增长 3. 空栈压栈结束后栈指针寄存器保存的地址内存中没有有效数据先压栈再增长地址 4. 满栈压栈结束后栈指针寄存器保存的地址内存中存放追后一次压栈的数据先增长地址再压栈栈的类型可以分为空增(EA)、空减(ED)、满增(FA)、满减(FD) ARM处理器默认采用满减栈实现压栈和出栈 3. 满减栈的压栈和出栈实现 .text .global _start _start:mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr sp,0x40000800 初始化栈stmdb sp!,{r1-r5} 压栈用dbldmia sp!,{r7-r11} 出栈用iastop:b stop .end 采用满减栈特有后缀 fd .text .global _start _start:mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr sp,0x40000800 初始化栈stmfd sp!,{r1-r5} 压栈用dbldmfd sp!,{r7-r11} 出栈用iastop:b stop .end 4. 叶子函数和非叶子函数 叶子函数函数中没有再调用其他函数的函数称为叶子函数 在使用汇编指令跳转时如果在非叶子函数再次发生跳转时就需要使用通过压栈的方式来对当前函数内现场进行保护防止数据被覆盖后原有现场被破坏 .text .global _start _start:栈的初始化LDR SP,0X40000800b main main:mov r1,#1mov r2,#2bl fun1add r3,r1,r2b main fun1:压栈 保护现场非叶子函数内部调用其他函数lr的数值也会被覆盖所以需要将它压栈保护stmfd sp!,{r1,r2,lr}mov r1,#5mov r2,#2bl fun2sub r4,r1,r2出栈恢复现场ldmfd sp!,{r1,r2,pc}fun2: 压栈 保护现场stmfd sp!,{r1,r2}mov r1,#6mov r2,#4mul r5,r1,r2出栈恢复现场ldmfd sp!,{r1,r2}mov pc,lr 函数返回stop:b stop .end 三、状态寄存器CPSR读写指令 1. 指令码及格式 读 MRS Rd,CPSR:将CPSR寄存器的数值读取到目标寄存器中 写 MSR cpsr,操作数将操作数写道CPSR寄存器中2. 使用示例 从复位模式切换到USER模式 .text .global _start _start:mrs r0,cpsr 读取CPSR寄存器bic r0,r0,#0x1F 低5位清零orr r0,r0,#0x10 给定数值msr cpsr,r0 将修改后的值赋值stop:b stop .end 3. 注意事项 USER模式作为唯一的非特权模式我们不能直接修改CPSR的值切换至其他特权模式为例保护系统 想要从USER模式切换到其他模式需要特定的异常出现才能切换到对应的模式 四、软中断指令 1. 概念 从软件层次上模拟的一个中断用于ARM从工作模式从USER模式切换到特权模式 2. 指令码和格式 swi 中断号 注意 1. swi是软中断的指令码 2. 中断号是系统中的中断标识是由24位数据组成的一个立即数3. ARM异常处理过程分析 (1. ARM异常源以及异常模式 5种异常模式对应7种异常源 异常模式异常源解释FIQ异常模式FIQ类型异常源引发程序进入FIQ模式的异常事件IRQ异常模式IRQ类型异常源引发程序进入IRQ模式的异常事件SVC异常模式复位信号按键复位/上电复位SVC异常模式swi软中断指令swi 软中断号undef异常模式未定义异常源译码器翻译指令时无法编译成功指令未定义abort异常模式data abort取数据发生中断abort异常模式prefetch abort取指令发生中断 五种异常工作模式对应七种异常源 1. 当发生对应类型的异常源时 2. 则处理器会进入到异常的工作模式 3. 执行异常处理程序完成某个特定的功能 4. 五种异常工作模式对应七种异常源异常源优先级 5. 复位的优先级最高(2. 异常的处理过程分析 **********处理过程********* 保存现场这个过程是由CPU自动完成(四大步三小步) 1.保存CPSR到SPSR_MODE寄存器中 2.修改CPSR寄存器1修改状态位T位切换到ARM状态2根据需要禁止IRQ和FIQ中断位3修改CPSR寄存器中的模式位切换到对应的异常模式 M[4:0] 3.保存返回地址到LR_MODE 4.修改PC指针指向对应的异常向量表**************恢复过程*********** 1.恢复SPSR_mode寄存器中的值到CPSR寄存器中 2.恢复LR_mode寄存器中的值到PC寄存器中1保存现场是CPU自动完成的当发生异常时CPU自动完成保存现场过程 2当修改PC指针指向异常处理程序的入口时 3由于异常处理程序的入口地址不固定 4所以ARM公司设计引入异常向量表(3. 异常向量表 1.异常向量表是代码段的一块空间这块空间大小是32字节被平均分成了8份每份占用4个字节 2.异常向量表存放7种异常源对应的异常处理函数的跳转指令有一份保留 3.7种异常源在异常向量表中的位置是固定的不可以随意更改 4.只需要指定异常向量表的基地址根据异常源在异常向量表中的偏移地址就可以确定异常源在异常向量表中的位置中断向量地址异常中断类型异常中断模式优先级(6最低)0x0复位特权模式(SVC)10x4未定义的指令未定义指令中止模式(Undef)60x8软件中断(SWI)特权模式(SVC)60x0c指令预取中止中止模式50x10数据访问中止中止模式20x14保留未使用未使用0x18外部中断请求(IRQ)外部中断(IRQ)模式40x1c快速中断请求(FIQ)快速(FIQ)中断模式3 (4. swi异常处理代码 .text .global _start _start:初始化异常向量表b main 复位异常b . undef异常b do_swi 软中断异常b . 指令中止b . 数据中止b . 保留b . IRQ异常b . FIQ异常main:初始化栈LDR SP,0X40000800切换到USER模式MSR CPSR,#0X10mov r1,#1mov r2,#2触发软中断swi 1add r3,r1,r2b main do_swi: 压栈保护现场STMFD SP!,{R1,R2,LR}mov r1,#3mov r2,#5mul r4,r1,r2恢复现场返回主程序执行LDMFD SP!,{R1,R2,PC}^ ^的作用是修改PC数值的同时将SPSR数值赋值给CPSR stop:b stop .end
http://www.zqtcl.cn/news/611263/

相关文章:

  • 郴州建设工程集团招聘信息网站wordpress 橘子皮模板
  • win7搭建网站服务器成都网站建设需多少钱
  • 网站开发一般需要多久菜谱网站模版
  • 基于jsp的电子商务网站开发最好的网站建设公司哪家好
  • 个人网站图片郑州技术支持seo
  • 先做网站还是先做app广州互联网
  • 租用网站的服务器wordpress手机加搜索
  • 做彩票网站怎么样才能让百度收录自己的网站
  • 廊坊网站建设技术托管seo怎么优化关键词排名培训
  • 抛丸机网站怎么做手机网站打不开的解决方法
  • 上海做网站的公司多少钱冷水江网站
  • 百度网站流量查询宣传片制作公司费用
  • 安徽炒股配资网站开发搭建平台载体
  • 中华建设杂志网站记者黑龙江省建设集团有限公司网站首页
  • 成都络迈品牌网站建设网站建设的行业资讯、
  • 英语网站大全免费赤峰市建设厅官方网站
  • 宁波网站建设熊掌号成都网络关键词排名
  • 织梦网站改版需要怎么做平台设计软件
  • 企业展示型网站网站建设设计
  • 增城网站建设服务网站建设制作设计公司佛山
  • 微网站套餐自媒体网站源码模板dede
  • 企业网站改版升级成都便宜网站建设公司
  • 广州公共资源建设工程交易中心网站新塘做网站
  • 数码港 太原网站开发公司iis 建立子网站
  • 做一个自己的网站需要什么商标设计网站猪八戒
  • 傻瓜式网站建设软件保险预约
  • 网站 备案规定自己做简单网站
  • 网站上怎么做支付接口南乐网站建设
  • 咸阳网站建设公司电话做个公司网站大概多少钱
  • 网站如何做关键词排名点子网创意网