210 likes | 415 Views
嵌入式系统教案. 北京建筑工程学院 . 计算机系. 2014/10/11. 第三章 -3 ARM 汇编程序设计. 提纲. 1. ARM 汇编程序规范. 汇编子程序调用. 2. 3. ARM/Thumb 混合调用. 汇编语言与 C 的混合编程. 4. ARM 指令系统. ARM 汇编程序规范. AREA ARMex, CODE, READONLY ; 命名代码段名称为 ARMex ENTRY ; 指示符,标记要执行的第 1 条指令 ; 程序中有且只能有一个 ENTRY 指示符
E N D
嵌入式系统教案 北京建筑工程学院.计算机系 2014/10/11
第三章-3 ARM汇编程序设计 提纲 1 ARM 汇编程序规范 汇编子程序调用 2 3 ARM/Thumb混合调用 汇编语言与C的混合编程 4
ARM 指令系统 ARM汇编程序规范 AREA ARMex, CODE, READONLY ; 命名代码段名称为ARMex ENTRY ; 指示符,标记要执行的第1条指令 ;程序中有且只能有一个ENTRY指示符 start ;标号,其值是程序的起始地址 MOV r0, #10 ; 设置参数 MOV r1, #3 ADD r0, r0, r1 ; r0 = r0 + r1 stop MOV r0, #0x18 ;软中断参数设置 LDR r1, =0x20026 ;将系统控制权交给调试器 SWI 0x123456 ;结束程序运行 END ;指示汇编器结束对该源程序的处理 ;每个汇编程序都必须包含一个END行
ARM 指令系统 ARM汇编程序规范 1.格式: ARM 汇编程序中每一行的通用格式为: {标号} {指令|指示符|伪指令} {;注释} 源程序中允许有空行。除了标号和注释,指令、伪指令 和指示符都必需有前导空格,即它们不能顶格。 指令,助记符,指示符和寄存器名既可以大写,也可以小 写,但不要混用;注释从“;”开始,到该行结束为止 2.标号 标号代表一个地址。
ARM 指令系统 ARM汇编程序规范 3.常量 (1) 数字常量: 十进制数:123,45 十六进制数:0x1234,0x2bf n_XXX:n进制(n=2~9),XXX是具体数,如8_237 (2)字符常量;一对由单引号及中间字符表示,如‘A’,’C’ (3)字符串常量:一对由单引号及中间字符表示,如 “ABC” (4)布尔常量:{FALSE},{TRUE}
ARM 指令系统 ARM汇编程序设计举例-程序1: AREA ARMex, CODE, READONLY ; 命名代码段名称为ARMex ENTRY ; 指示符,标记要执行的第1条指令 ;程序中有且只能有一个ENTRY指示符 start ;标号,其值是程序的起始地址 MOV r0, #10 ; 设置参数 MOV r1, #3 ADD r0, r0, r1 ; r0 = r0 + r1 stop MOV r0, #0x18 ;软中断参数设置 LDR r1, =0x20026 ; SWI 0x123456 ; 退出调试环境 END ; 文件结束
ARM 指令系统 ARM汇编程序设计举例-程序2: AREA EXAM2, CODE, READONLY ; 命名代码段名称为EXAM2 ENTRY ; 指示符,标记要执行的第1条指令 CODE32 ;32位代码段 add ;标号,其值是程序的起始地址 ADD r0, r0, r1 ; r0 = r0 + r1 MOV PC,LR stop MOV r0, #0x18 ;软中断参数设置 LDR r1, =0x20026 ; SWI 0x123456 ; 退出调试环境 END ; 文件结束
ARM 指令系统 ARM汇编程序设计举例-程序3: 程序实现功能: 使用LDR指令读取0x30003100上的数据,将数据+1,若结果小于10,则使用STR指令将结果写回原地址,若结果大于10,则把0写回原地址。
ARM 指令系统 ARM汇编程序设计举例-程序3: • COUNT EQU 0x30003100 • AREA EXAMPLE3,CODE,READONLY • ENTRY • CODE32 • STRAT • LDR R1, =COUNT • MOV R0, #0 • STR R0,[R1] • LOOP LDR R1,=COUNT • LDR R0,[R1] • ADD R0,R0,#1 • CMP R0,#10 • MOVHS R0,#0 • STR R0,[R1] • B LOOP • END
ARM 指令系统 ARM汇编程序练习 练习:自己对照程序,使用LDR和STR指令将0x30003100开始的连续12个字节单元中赋12个值(初值自定为常数)。然后使用LDMIA指令读出0x30003100开始的连续3个字单元中的数据,分别存入寄存器中。
ARM 指令系统 练习参考答案 • COUNT EQU 0x30003100 • AREA EXAMPLE1,CODE,READONLY • ENTRY • STRAT • LDR R1, =COUNT • MOV R0, #0x88 • MOV R2,#0x0c • RE_STR • STRB R0,[R1],#1 • SUB R2,R2,#1 • CMP R2,#0 • BHI RE_STR • LDR R1,=COUNT • LDMIA R1,{R3-R5}
ARM 指令系统 练习参考答案 • stop • MOV r0, #0x18 ;软中断参数设置 • LDR r1, =0x20026 ; • SWI 0x123456 ; 退出调试环境 • END
ARM 指令系统 汇编子程序调用 汇编子程序的基本结构: AREA Init,CODE,READONLY ENTRY Start LDR r0=0x3ff5000 LDR r1,0xff STR r1,[r0] LDR r0=0x3ff5008 LDR r1,0x02 STR r1,[r0] BL PRINT_TEXT …… PRINT_TEXT
ARM 指令系统 汇编子程序调用 • AREA subrout, CODE, READONLY • ENTRY ; mark first instruction ; to execute • start • MOV r0, #0xa0 ; Set up parameters • MOV r1, #8 • BL doadd ; Call subroutine stop • MOV r0, #0x18 • LDR r1, =0x20026 • SWI 0x123456 • doadd • ADD r0, r0, r1 ; Subroutine code • MOV pc, lr ; Return from subroutine. • END
ARM 指令系统 ARM/Thumb混合调用 • AREA ThumbSub, CODE, READONLY • ENTRY • CODE32 ; Subsequent instructions are ARM • header • ADR r0, start + 1 ; Processor starts in ARM state, • BX r0 ; so small ARM code header used • ; to call Thumb main program. • CODE16 ; Subsequent instructions are Thumb. • start • MOV r0, #10 ; Set up parameters • MOV r1, #3 • BL doadd ; Call subroutine
ARM 指令系统 ARM/Thumb混合调用 • stop • MOV r0, #0x18 • LDR r1, =0x20026 • SWI 0xAB ; Thumb semihosting SWI • doadd • ADD r0, r0, r1 ; Subroutine code • MOV pc, lr ; Return from subroutine. • END ; Mark end of file
ARM 指令系统 汇编语言与C的混合编程 汇编语言与C/C++的混合编程通常采用以下几种方式: 在C/C++代码中嵌入汇编指令; 在汇编程序和C/C++的程序之间进行变量互访; 汇编程序、C/C++程序之间的相互调用。 在实际编程中,使用较多的是:程序的初始化部分用汇 编语言完成,然后用C/C++完成主要编程任务,以下 是汇编程序跳转到C程序的基本结构。
ARM 指令系统 汇编语言与C的混合编程 汇编语言调用C语言程序结构 (1)汇编初始化部分: IMPORT Main ;通知编译器该标号为一个外部标号 AREA Init, CODE, READONLY ;定义一个代码段 ENTRY ;定义程序的入口点 LDR R0=0x3FF0000 ;初始化系统配置寄存器 LDR R1=0xE7FFFF80 STR R1,[R0] LDR SP,=0x3FE1000 ;初始化用户堆栈 BL Main ;跳转到Main END ;标识汇编程序的结束
ARM 指令系统 汇编语言与C的混合编程 汇编语言调用C语言程序结构 (2)C代码部分 void Main(void) { int i; *((volatile unsigned long *) 0x3ff5000)=0x0000000f; While(1) { *((volatile unsigned long *) 0x3ff5008) = 0x00000001 for(i=0;I<0x7ffff;i++); *((volatile unsigned long *) 0x3ff5008) = 0x00000002; for( i=0; i <0x7ffff; i++); } }
ARM 指令系统 C语言调用汇编语言程序 C语言部分: #define uint8 unsigned char #define uint32 unsigned int extern uint32 Add (uint32 x,uint y);定义外部函数 uint32 sum; void Main (void) {sum=Add(555,168); while(1); }
ARM 指令系统 C语言调用汇编语言程序 汇编部分: EXPORT Add ;定义外部标号 AREA Start, CODE,READONLY ENTRY CODE32 Add ADD R0,R0,R1 MOV PC,LR END