ARM汇编语言程序设计培训课件

上传人:日度 文档编号:149727675 上传时间:2020-10-29 格式:PPT 页数:63 大小:306.50KB
返回 下载 相关 举报
ARM汇编语言程序设计培训课件_第1页
第1页 / 共63页
ARM汇编语言程序设计培训课件_第2页
第2页 / 共63页
ARM汇编语言程序设计培训课件_第3页
第3页 / 共63页
ARM汇编语言程序设计培训课件_第4页
第4页 / 共63页
ARM汇编语言程序设计培训课件_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《ARM汇编语言程序设计培训课件》由会员分享,可在线阅读,更多相关《ARM汇编语言程序设计培训课件(63页珍藏版)》请在金锄头文库上搜索。

1、1,第四章 ARM汇编语言程序设计,4.1 汇编语言程序格式 4.2 ARM汇编器的伪操作 4.3 汇编语言上机过程 4.4 汇编语言程序设计,2,4.1 汇编语言程序格式,4.1.1 汇编语言程序的组成 AREA Init, CODE, READONLY ENTRY StartLDRR0,=0 x3FF5000 LDRR1,0 xFF STRR1,R0 LDRR0,=0 x3FF5008 LDRR1,0 x01 STRR1,R0 . END,3,AREA Init, CODE, READONLY ENTRY StartLDRR0,=0 x3FF5000 LDRR1,0 xFF BLPRINT

2、_TEXT . . PRINT_TEXT . . MOVPC,LR END,4,;FULL SEGMENT DEFINITION-Intel 8086 ;-stack segment- STACKSEGMENT DB64 DUP(?) STACK ENDS ;-data segment- DATASEGMENT ;data definitions are placed here DATAENDS ;-code segment- CODESEGMENT MAIN PROC FAR ASSUME CS: CODE, DS: DATA, SS: STACK MOV AX,DATA MOV DS,AX

3、 - - MOV AH,4CH INT 21H MAIN ENDP CODEENDS END MAIN,5,4.1.2 汇编语言的语句格式,ARM汇编语言程序的每行语句由14部分组成。 LABELOPERATION OPERAND;COMMENT 标号域操作助记符域 操作数域注释域,6,4.2 ARM汇编器的伪操作,符号定义伪操作(Symbol Definition) 数据定义伪操作(Data Definition ) 汇编控制伪操作(Assembly Control) 框架描述伪操作(Frame Description) 其他伪操作(Miscellaneous),7,数据定义伪操作,数据定义

4、伪操作用于为特定的数据分配存储单元,同时可完 成已分配存储单元的初始化。 DCB分配一片连续的字节存储单元并初始化。 DCW分配一片连续的半字存储单元并初始化。 DCD分配一片连续的字存储单元并初始化。 SPACE分配一片连续的存储单元并初始化为0。 MAP定义一个结构化的内存表首地址。 FIELD定义一个结构化的内存表的数据域。,8,DCB 格式:标号 DCB表达式 功能:DCB伪操作用于分配一片连续的字节存储单元,并用伪操作中指定的表达式初始化。其中,表达式可以为0255的数值或字符串。DCB也可以用“=”代替。 示例: StrDCB“This is a test!”,9,DCW 格式:标

5、号 DCW表达式 功能:DCW伪操作用于分配一片连续的半字存储单元,并用伪操作中指定的表达式初始化。其中,表达式可以为程序标号或数值表达式。用DCW分配的存储单元是半字对齐的。 示例: DataTestDCW 1,2,3,10,DCD 格式:标号 DCD表达式 功能:DCD伪操作用于分配一片连续的字存储单元,并用伪操作中指定的表达式初始化。其中,表达式可以为程序标号或数值表达式。用DCD分配的存储单元是字对齐的。DCD也可 以用 “ case 1: return method_1 (); case 2: return method_2 (); case 3: return method_3 (

6、); default: return method_d ; ,38,AREA Exam CODE READONLY ENTRY STARTCMPR0,#4 ADDLT PC,PC,R0,LSL #2;分支表结构其偏 Bmethod_d;移量由R0决定 Bmethod_0 Bmethod_1 Bmethod_2 Bmethod_3,39,method_0 MOVR0,#1 Bend0 method_1 MOVR0,#2 Bend0 method_2 MOVR0,#3 Bend0 method_3 MOVR0,#4 Bend0 method_d MOVR0,#0 end0BSTART END,40

7、,ENTRY ; mark the first instruction to call start MOV r0, #1 ; set up the three parameters MOV r1, #3 MOV r2, #2 BL arithfunc ; call the function stop MOV r0, #0 x18 ; angel_SWIreason_ReportException LDR r1, =0 x20026 ; ADP_Stopped_ApplicationExit SWI 0 x123456 ; ARM semihosting SWI arithfunc ; labe

8、l the function CMP r0, #num ; Treat function code as unsigned integer MOVHS pc, lr ; If code is = num then simply return ADR r3, JumpTable ; Load address of jump table LDR pc, r3,r0,LSL#2 ; Jump to the appropriate routine JumpTable DCD DoAdd DCD DoSub DoAdd ADD r0, r1, r2 ; Operation 0 MOV pc, lr ;

9、Return DoSub SUB r0, r1, r2 ; Operation 1 MOV pc,lr ; Return END ; mark the end of this file,41,循环程序设计:,计数控制:当循环次数已知时,通常使用计数控制法。 MOVRn,#N;循环初值部分 LOOPA;循环体 SUBSRn,Rn,#1;修改部分 CMPRn,#0 BGTLOOPA;控制部分 直到Rn=0时,循环结束。,42,另,每循环一次计数其加一,直到与设定的值相等时结束。 MOVRn,#0;循环初值部分 LOOPA;循环体 ADDSRn,Rn,#1;修改部分 CMPRn,#N BNELOOP

10、A;控制部分 直到Rn=N时,循环结束。,43,例如:编制程序使S=1+2*3+3*4+4*5+N(N+1),直到N等于10为止。 AREAExam,CODE,READONLY ENTRY STARTMOVR0,#1;R0累加,置初值1,S MOVR1,#2;R1第一个乘数置为2,N REPEATADDR2,R1,#1;R2第二个乘数,N+1 MULR3,R2,R1;N(N+1)存于R3 ADDR0,R0,R3;将部分积累加到R0 ADDR1,R1,#1;修改循环次数 CMPR1,#10 BLEREPEAT BSTART END,44,条件控制:有些情况下,循环次数事先无法确定,但它与某些条件

11、有关。 例如:求两个数组DATA1、DATA2对应的数据之和,并将和存入新数组SUM中,计算一直到两数之和为零时结束,并把新数组的长度存于R0中。 AREABlockData,DATA,READWRITE DATA1DCD2,5,0,3,-4,5,0,10,9 DATA2DCD3,5,4,-2,0,8,3,-10,5 SUMDCD0,0,0,0,0,0,0,0,0,45,AREA,Exam,CODE,READONLY ENTRY STARTLDRR1,=DATA1 LDRR2,=DATA2 LDRR3,=SUM MOVR0,#0 LOOPLDRR4,R1,#4 LDRR5,R2,#4 ADDS

12、R4,R4,R5 ADDR0,R0,#1 STRR4,R3,#4 BNELOOP BSTART END,46,多重循环:,即循环体内嵌套循环。设计时可以从外层循环到内层循环,一 层一层的进行。通常在设计外层时,仅把内层看成一个处理粗 框,然后再将该粗框细化成置初值、工作、修改和控制等四个 部分。 例:在以BUF为首地址的字存储区中存放有10个无符号数 0 x0FF,0 x00,0 x40,0 x10,0 x90,0 x20,0 x80,0 x30,0 x50,0 x70,0 x60 现需将他们按从小到大的顺序排列在BUF中,使编写其程序。 分析:“冒泡排序法”。 寄存器分配如下:,47,R0:

13、指示缓冲区初始地址 R1:外循环计数器 R2:内循环计数器 R3:外循环地址指针 R4:内循环地址指针 R5:内循环下一个数地址指针 R6:存放内循环一轮比较的最小值 R7:存放内循环取出的下一个比较值 源程序如下: AREABlockData,DATA,READWRITE BUFDCD 0 x0FF,0 x00,0 x40,0 x10,0 x90,0 x20,0 x80, 0 x30,0 x50,0 x70,0 x60 NEQU10,48,AREAExam,CODE,READONLY ENTRY START LDRR0,=BUF;指向数组的首地址 MOVR1,#0;外循环计数器 MOVR2,

14、#0;内循环计数器 LOOPI ADDR3,R0,R1,LSL #2;外循环首地址放入R3 MOVR4,R3;内循环首地址放入R4 ADDR2,R1,#1;内循环计数器初值 MOVR5,R4;内循环下一地址初值 LDRR6,R4;取内循环第一个值R4 LOOPJ ADDR5,R5,#4;内循环下一地址值 LDRR7,R5;取出下一地址值R7 CMPR6,R7;比较 BLTNEXT;小则取下一个 SWPR7,R6,R5;大则交换,最小值R6 MOVR6,R7,49,NEXTADDR2,R2,#1;内循环计数器 CMPR2,#N;循环终止条件 BLTLOOPJ;小于N则继续内循环,实现比较一轮 S

15、WPR7,R6,R3;否则,内循环一轮结束, ;将最小数存入外循环的首地址处 ADDR1,R1,#1;外循环计数 CMPR1,#N-1;外循环终止条件 BLTLOOPI;小于N-1继续执行外循环 BSTART END 程序运行的结果: 00H,10H,20H,30H,40H,50H,60H,70H,80H,90H,0FFH,50,4.3.3 子程序设计,保护现场、参数传递、恢复现场、子程序返回 AREAExam,CODE,READONLY ENTRY STARTLDRR0,=0 x3FF5000 LDRR1,=0 x3FF5008 STMFD R13 !, R0-R2 , R14 BLPrin

16、t_Text Print_Text LDMFD R13 !, R0-R2 , PC MOVPC,R14 END,51,4.3.4 模式切换程序设计,52,53,处理器工作在什么模式下是由状态寄存器CPSR的模式位M4:0来决定的。注意:某些组合会导致处理器进入一个不可恢复的状态。 要实现模式之间的切换只需通过专用指令MRS、MSR修改CPSR模式位即可实现。 例:堆栈初始化的子程序: InitStack MOVR0,LR;R0 - LR保存返回地址 ;切换到管理模式并设置其堆栈 MSRCPSR_c,#0 xd3;CPSR4:0-10011 LDRSP,STACKSVC; STACKSVC堆栈地址,54,;切换到中断模式并设置其堆栈 MSRCPSR_c,#0 xd2;CPSR4:0-1001

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 专业基础教材

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