1 / 21

嵌入式系统教案

嵌入式系统教案. 北京建筑工程学院 . 计算机系. 2014/10/11. 第三章 -3 ARM 汇编程序设计. 提纲. 1. ARM 汇编程序规范. 汇编子程序调用. 2. 3. ARM/Thumb 混合调用. 汇编语言与 C 的混合编程. 4. ARM 指令系统. ARM 汇编程序规范. AREA ARMex, CODE, READONLY ; 命名代码段名称为 ARMex ENTRY ; 指示符,标记要执行的第 1 条指令 ; 程序中有且只能有一个 ENTRY 指示符

gwyn
Download Presentation

嵌入式系统教案

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 嵌入式系统教案 北京建筑工程学院.计算机系 2014/10/11

  2. 第三章-3 ARM汇编程序设计 提纲 1 ARM 汇编程序规范 汇编子程序调用 2 3 ARM/Thumb混合调用 汇编语言与C的混合编程 4

  3. 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行

  4. ARM 指令系统 ARM汇编程序规范 1.格式: ARM 汇编程序中每一行的通用格式为: {标号} {指令|指示符|伪指令} {;注释} 源程序中允许有空行。除了标号和注释,指令、伪指令 和指示符都必需有前导空格,即它们不能顶格。 指令,助记符,指示符和寄存器名既可以大写,也可以小 写,但不要混用;注释从“;”开始,到该行结束为止 2.标号 标号代表一个地址。

  5. 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}

  6. 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 ; 文件结束

  7. 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 ; 文件结束

  8. ARM 指令系统 ARM汇编程序设计举例-程序3: 程序实现功能: 使用LDR指令读取0x30003100上的数据,将数据+1,若结果小于10,则使用STR指令将结果写回原地址,若结果大于10,则把0写回原地址。

  9. 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

  10. ARM 指令系统 ARM汇编程序练习 练习:自己对照程序,使用LDR和STR指令将0x30003100开始的连续12个字节单元中赋12个值(初值自定为常数)。然后使用LDMIA指令读出0x30003100开始的连续3个字单元中的数据,分别存入寄存器中。

  11. 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}

  12. ARM 指令系统 练习参考答案 • stop • MOV r0, #0x18 ;软中断参数设置 • LDR r1, =0x20026 ; • SWI 0x123456 ; 退出调试环境 • END

  13. 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

  14. 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

  15. 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

  16. 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

  17. ARM 指令系统 汇编语言与C的混合编程 汇编语言与C/C++的混合编程通常采用以下几种方式: 在C/C++代码中嵌入汇编指令; 在汇编程序和C/C++的程序之间进行变量互访; 汇编程序、C/C++程序之间的相互调用。 在实际编程中,使用较多的是:程序的初始化部分用汇 编语言完成,然后用C/C++完成主要编程任务,以下 是汇编程序跳转到C程序的基本结构。

  18. 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 ;标识汇编程序的结束

  19. 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++); } }

  20. 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); }

  21. ARM 指令系统 C语言调用汇编语言程序 汇编部分: EXPORT Add ;定义外部标号 AREA Start, CODE,READONLY ENTRY CODE32 Add ADD R0,R0,R1 MOV PC,LR END

More Related