文档详情

第2章3_ARM汇编程序设计.ppt

发布:2017-05-10约1.02万字共63页下载文档
文本预览下载声明
在ARM嵌入式系统中,一般用C语言等高级语言对各个应用接口模块功能的实现进行程序设计,但在某些地方用汇编语言更方便、简单。 在一些关键部分,例如用来初始化电路以及用来为软件(高级语言编写)做运行前准备的启动代码必须用汇编语言编写。 汇编语言的代码效率很高,一般用于对硬件的直接控制。 例 5 实现整数除法,整数用补码表示。先将被除数和除数高位对齐,如果够减上商1,并减去除数;否则上商0。然后右移除数1位,重复上述操作。 .global _start .macro mCLZ Rd, Rs @ 求一个数的前导0个数 MOV \Rd, #0 @ 在某些ARM中,可使用指令CLZ代替 __mCLZ_L1: TST \Rs, #0 ADDEQ \Rd, \Rd, #1 MOVEQ \Rs, \Rs, ROR #31 @ 左移一位 BEQ __mCLZ_L1 MOV \Rs, \Rs, LSR \Rd .endm .macro mUNSIGN Rd, Rs @ 将一个数无符号化 TST \Rs, #0@ 将无符号的整数放到Rs中 EORNE \Rd, \Rd, #1 @ 将符号部分放到Rd中 MVNNE \Rs, \Rs ADDNE \Rs, \Rs, #1 .endm .text _start: LDR R0, =-123456 @ 被除数 LDR R1, =523 @ 除数 Div: MOV R6, #0 @ 结果的符号位 mUNSIGN R6, R0 @ 无符号化 mUNSIGN R6, R1 MOV R5, #0 @ 商 CMP R0, R1 @ 如果被除数小于除数 BLT Division_L2 @ 直接商0 mCLZ R3, R1 @ 判断除数位数,确定移位情况 SUB R3, R3, #1 MOV R1, R1, LSL R3 Division_L1: MOV R5, R5, LSL #1 CMP R0, R1 @ 判断是否够减 SUBGT R0, R0, R1 @ 如果够减,做减法,上商1 ORRGT R5, R5, #1 SUBS R3, R3, #1 MOVCS R1, R1, LSR #1 BCS Division_L1 Division_L2: TST R6, #1 @ 处理结果的符号 MVNNE R5, R5 ADDNE R5, R5, #1 Division_F: MOV R1, R0 MOV R0, R5 例 6 用Thumb指令实现内存数据区块拷贝操作。 .global _start .equ NUM, 18 @设置要复拷贝的字数 .text _start: .arm MOV SP, #0x9000 ADR R0, Thumb_start + 1 BX R0 .thumb Thumb_start: LDR R0, =Src @R0 = 源数据区指针 LDR R1, =Dst @R1 = 目标数据区指针 MOV R2, #NUM LSR R3, R2, #2 @获得块拷贝的次数 BEQ Copy_Words PUSH {R4-R7} @保存将要使用的寄存器R4-R7 Copy_4Word: @进行块拷贝,每次拷贝4个字 LDMIA R0!, {R4-R7} STMIA R1!, {R4-R7} SUB R3, #1 BNE Copy_4Word POP {R4-R7} @恢复寄存器R4-R7 Thumb_start: @将剩余的数据区以字为单位拷贝 Copy_Words: MOV R3, #3 AND R2, R3 @获得剩余的数据的字数 BEQ Stop Copy_Word: LDMIA R0!, {R3} STMIA R1!, {R3} SUB R2, #1 BNE Copy_Word Stop: B Stop .ltorg Src: .long 1,2,3,4,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF,0x10,0x11,0x12 Dst: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .end
显示全部
相似文档