四、汇编指令2

上传人:ji****n 文档编号:54669947 上传时间:2018-09-17 格式:PPT 页数:30 大小:553KB
返回 下载 相关 举报
四、汇编指令2_第1页
第1页 / 共30页
四、汇编指令2_第2页
第2页 / 共30页
四、汇编指令2_第3页
第3页 / 共30页
四、汇编指令2_第4页
第4页 / 共30页
四、汇编指令2_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《四、汇编指令2》由会员分享,可在线阅读,更多相关《四、汇编指令2(30页珍藏版)》请在金锄头文库上搜索。

1、第四章 汇编指令(二),本章目标,掌握比较指令的使用。 掌握ARM的软中断指令 掌握CPSR操作指令 掌握伪指令的地址读取,数据处理指令,ARM数据处理指令,数据处理指令大致可分为3类: 数据传送指令; 算术逻辑运算指令; 比较指令。数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有ARM数据处理指令均可选择使用S后缀,并影响状态标志。,数据处理指令,数据传送指令,MOV指令将8位图立即数或寄存器传送到目标寄存器(Rd),可用于移位运算等操作。,同类型的指令还有MVN,它可以实现数据的非传递,即把操作数取反后送至目标寄存器。,思考与练习,?,1.MOV指令与LDR指令都

2、是往目标寄存器中传送数据,但是它们有什么区别吗?MOV指令用于将数据从一个寄存器传送到另一个寄存器中,或者将一个常数传送到一个寄存器中,但是不能访问内存。LDR指令用于从内存中读取数据放入寄存器中。,思考与练习,算术逻辑运算指令,算术逻辑运算指令,比较指令,比较指令,比较指令将两个数值进行的特定运算,根据运算结果影响CPSR的相关标志位,用于后面程序的条件执行,但是运算结果不予保存。,比较指令,比较指令,CMP:数值比较。将寄存器的值减去操作数的值,CMN:负数比较。将寄存器的值加上操作数的值。结果为0,z=1;否则z=0;,TST: 位测试。 寄存器的值与操作数的值按位“与“操作。结果为0,

3、z=1;否则z=0;,TEQ: 相等测试。 寄存器的值与操作数的值按位“异或“操作。结果为0,z=1;否则z=0;,与CMP的区别在于TEQ不影响C和V位,也就是只能判断是否相等,而不能判断是否大于,或小于。,乘法指令,乘法指令,在ARM指令集中杂项指令共有3条,它们非常重要,特别是与操作系统的使用息息相关: 1.软件中断产生指令:SWI 2. 程序状态寄存器读指令:MRS 3. 程序状态寄存器写指令:MSR,杂项指令,杂项指令,软中断指令,软中断指令,SWI指令用于产生软中断,主要用于用户程序调用操作系统的系统服务。执行该指令后,处理器将完成以下动作: 1. 切换到管理模式 2. 将CPSR

4、备份到管理模式下的SPSR寄存器 3. 程序跳转到软件中断入口,“SWI”,1.使用操作系统后,为了防止出错的任务影响其它任务的执行,通常将任务放在用户模式执行,以限制其权限;,2.对于一些重要的操作,如中断的开关,必须由操作系统完成。使用软件中断指令即可完成系统功能调用;,软中断指令,软中断指令,软中断指令,根据SWI指令传递的参数SWI异常处理程序可以作出相应的处理。SWI指令传递参数有以下两种方法, 指令中的24位立即数指定了用户请求的服务类型,参数通过通用寄存器传递。 MOV R0,#34 ;设置子功能号为34 SWI 12 ;调用12号软中断 指令中的24位立即数被忽略,用户请求的服

5、务类型由寄存器R0的值决定,参数通过其它的通用寄存器传递。 MOV R0,#12 ;调用12号软中断 MOV R1,#34 ;设置子功能号为34 SWI 0,软中断指令,在SWI异常中断处理程序中,取出SWI指令中立即数的步骤为: 首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到; 然后取得该SWI指令的地址,这可通过访问LR寄存器得到; 接着读出该SWI指令,分解出立即数。,SWI_HandlerSTMFD SP!, R0-R3, R12, LR ; 现场保护MRS R0, SPSR ; 读取SPSRSTMFD SP!, R0 ; 保存SPSRTST

6、R0, #0x20 ; 测试T标志位LDRNEH R0, LR,#-2 ; 若是Thumb指令,读取指令码(16位)BICNE R0, R0, #0xFF00 ; 取得Thumb指令的8位立即数LDREQ R0, LR,#-4 ; 若是ARM指令,读取指令码(32位)BICEQ R0, R0, #0xFF000000 ; 取得ARM指令的24位立即数.LDMFD SP!, R0-R3, R12, PC ; SWI异常中断返回,软中断指令,状态寄存器读指令,状态寄存器读指令,在ARM处理器中,只有MRS指令可以对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以了解当前处理器的工作状态。

7、读SPSR寄存器可以了解到进入异常前的处理器状态。指令格式如下所示:,应用示例:MRS R1,CPSR ; 读取CPSR状态寄存器到R1MRS R2,SPSR ; 读取SPSR状态寄存器到R2,状态寄存器写指令,在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式等操作。,状态寄存器写指令,状态寄存器写指令,状态寄存器写指令,示例,将R0的内容写入CPSR寄存器的控制位域 MSR CPSR_c,R0,Byte0,(1),(2),(3),(4),;子程序:使能IRQ中断 Enabl

8、e_IRQMRS R0, CPSRBIC R0, R0,#0x80MSR CPSR_c,R0MOV PC,LR,;子程序:禁能IRQ中断 Disable_IRQMRS R0 CPSRORR R0, R0,#0x80 MSR CPSR_c,R0 MOV PC,LR,1.将CPSR寄存器内容读出到R0;,2.修改对应于CPSR中的I控制位;,3.将修改后的值写回 CPSR寄存器的对应控制域;,4.返回上一层函数;,1. 使用MSR和MRS指令,通过修改CPSR寄存器,实现打开/关闭IRQ中断的两个子程序,注意不能影响其它位?,状态寄存器写指令,伪指令,伪指令,ARM伪指令有四条: 1.空操作指令:

9、NOP 2.小范围地址读取指令:ADR 3.中等范围地址读取指令:ADRL 4.大等范围地址读取指令:LDR,ARM伪指令不属于ARM指令集中的指令,是为了编程方便而定义的。伪指令可以像其它ARM指令一样使用,但在编译时这些指令将被等效的ARM指令代替。,小范围的地址读取,ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令,若不能用一条指令实现,则产生错误,编译失败。,取指范围: 当地址值不是字对齐时,其取指范围为255; 当地址值是字对齐时,其取指范围为1020; 当地址值是16字节对齐时,其取

10、指范围将更大。,伪指令,小范围的地址读取,.ADR R0,Delay . DelayMOV R0,r14.,应用示例(源程序):,使用伪指令将程序标号Delay的地址存入R0,. 0x20 ADD r0,pc,#0x3c. 0x64 MOV r0,r14.,编译后的反汇编代码:,ADR伪指令被汇编成一条指令,伪指令,中等范围的地址读取,ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,取指范围: 当地址值不

11、是字对齐时,其取指范围为64K 当地址值是字对齐时,其取指范围为256K 当地址值是16字节对齐时,其取指范围将更大,伪指令,.ADRL R0,Delay . DelayMOV R0,r14.,应用示例(源程序):,使用伪指令将程序标号Delay的地址存入R0,. 0x20 ADD r0,pc,#40 0x24 ADD r0,r0,#0. 0x68 MOV r0,r14.,编译后的反汇编代码:,ADRL伪指令被汇编成两条指令,尽管第2条指令并没有意义,伪指令,大范围的地址读取,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指

12、令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。,伪指令,大范围的地址读取,.LDR R0,=Delay . DelayMOV R0,r14.,应用示例(源程序):,. 0x60 LDR R0,0xb4. 0x64 MOV R0, LR. 0xb4 DCD 0x64,编译后的反汇编代码:,LDR伪指令被汇编成一条LDR指令,并在文字池中定义了一个常量,该常量为Delay标号的地址,使用伪指令将程序标号Delay的地址存入R0,必须加入”=”,Thumb指令,Thumb指令,T

13、humb指令集可以看作是ARM指令压缩形式的子集,它是为减小代码量而提出的,具有16位的代码密度。Thumb指令体系不完整,只支持通用功能。必要时仍需要使用ARM指令,如进入异常时。,相似点: 存储器访问指令 数据处理指令 分支指令 杂项指令 伪指令,区别: 只有B指令可以条件执行,其它指令都不能条件执行; 分支指令的跳转范围有更多限制; 数据处理指令的操作结果必须放入其中一个; 单寄存器访问指令,只能操作R0R7; LDM和STM指令可以对R0R7的任何子集进行操作;,_packed,通常ARM编译器会按以下原则自动存放结构体:起始地址为结构体成员中最大数据宽度的整数倍;通过插入填充位,使对

14、结构体成员的访问可以按对齐访问操作。,struct uint8 X; uint32 Y; uint8 Z; uint16 M; tmp;,补充知识,可以使用指针方便的顺序读取所有成员内容;缩小结构体的存储空间;缺点:降低结构体成员的访问速度。,_packed struct uint8 X; uint32 Y; uint8 Z; uint16 M; tmp;,使用_packed关键词定义结构体,可以把插入的填充位全部去除,称之为结构体的紧凑存储。,volatile,有些变量在中断中被改变,而在正常程序中被读取。这种操作可能被编译器优化,而使得在正常程序中无法获知变量被改变后的内容。,uint8 flag; while( flag = FALSE ) ,extern uint8 flag; void _irq INT(void) flag = TRUE; ,编译器认为在一个函数中重复读取一个变量无意义,所以将该操作优化处理.,volatile uint8 flag;,volatile uint8 flag;,_align(n),变量存放的起始地址和对齐字节数与变量的结构有关,有时为了控制它的对齐方式(比如IAP应用),可以使用_align(n)关键词,其中n表示对齐字节数,取值2、4或8。,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号