College of Computer Science & Technology

Slides:



Advertisements
Similar presentations
While 迴圈 - 不知重複執行次數
Advertisements

C++语言程序设计教程 第5章 构造数据类型 第6章 C++程序的结构.
認識食品標示 東吳大學衛生保健組製作.
ARM 编程技巧.
入党基础知识培训.
颞下颌关节常见病.
第八章 结算业务的核算.
教育的理想和教育家成长 成都.
致理科技大學保險金融管理系 實習月開幕暨頒獎典禮
營利事業所得稅查核準則 相關概念介紹 南區國稅局 新營分局 林俊標 各位學員大家好:
企業實習方案 --「保險機構實習」 報告時間:105年5月18日 報告者: 汪 芳 國.
結腸直腸腫瘤的認知.
經歷復活的愛 約翰福音廿一1-23.
郭詩韻老師 (浸信會呂明才小學音樂科科主任)
第一章 C语言概述 计算机公共教学部.
课程改革:培养学 生的独立人格 ——中学校长《课程改革 与校长担当》论坛的讲话 郭振有
學 號:997I0010、997I0024 組 員:洪韋鈴、王婷婷 日 期: 指導老師:王立杰 老師
微机原理与接口技术 第二章 ARM微处理器硬件结构
2. 戰後的經濟重建與復興 A. 經濟重建的步驟與措施 1.
好好學習 標點符號 (一) 保良局朱正賢小學上午校.
公司法(六) 股份有限公司 1.
实践 课题 周围环境对当代大学生成长的影响 指导老师:王永章 小组成员:陈荣、刘若楠、张红艳、吕雪丹、樊金芳、李惠芬、黄婧
機車第六篇 事故預防 單元二 行駛中注意事項.
4. 聯合國在解決國際衝突中扮演的角色 C. 聯合國解決國際衝突的個案研究.
新陸書局股份有限公司 發行 第十九章 稅捐稽徵法 稅務法規-理論與應用 楊葉承、宋秀玲編著 稅捐稽徵程序.
民法第四章:權利主體 法人 楊智傑.
高级语言程序设计 主讲人:陈玉华.
主讲教师:吴琼 微信群:C语言2016 QQ群: 密码scu2016 昵称:“真名+学号”
嵌入式系统讲义 第3章 ARM指令系统 周国运
Object-Oriented Programming in C++ 第一章 C++的初步知识
第四章 BootLoader开发 附-s3c2410/s3c2440中断控制器介绍
第4章 汇编语言程序设计 汇编语言源程序格式 汇编语言上机过程 汇编语言与C语言混合编程技术.
嵌入式体系结构与应用 第三章-ARM指令系统(ARMv4T).
第五章 C/C++及汇编语言的混合编程 5.1 ARM C/C++编译器 5.2 在C/C++程序中内嵌汇编指令
嵌入式系统教案 武汉创维特信息技术有限公司 2019/1/18.
計數式重複敘述 for 迴圈 P
(第2版).
四年級 中 文 科.
第六章 安全衛生工作守則 6-1 前 言  6-2 訂定依據相關法令規定  6-3 工作守則製作程序及製作前應注意事項  6-4 如何訂定適合需要之安全衛生工作守則  6-5 結 論.
組合語言和程式範例.
(第2版).
第六次全国人口普查 近期数据处理工作部署 夏雨春 2010年12月28日.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
ARM及Thumb指令集 (练习).
聖誕禮物 歌羅西書 2:6-7.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第3章 ARM微處理器的指令集.
ARM指令集 Author : Steve Furber Advisor: Mei-Ling Chiang Speaker: 徐翔宇
嵌入式系统教案 武汉创维特信息技术有限公司 2019/4/29.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
C语言程序设计 李祥 QQ:
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
第7章 程序的结构 四、生存期与存储属性 五、extern关键字与外部连接属性 六、static关键字与内部连接属性.
第二章 类型、对象、运算符和表达式.
ARM简介及BootLoader介绍 黄大荣
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
第四章 函数 丘志杰 电子科技大学 计算机学院 软件学院.
微處理機 Microprocessor (100上) ARM 內核嵌入式SOC原理
遞迴 Recursion.
依撒意亞先知書 第一依撒意亞 公元前 740 – 700 (1 – 39 章) 天主是宇宙主宰,揀選以民立約,可惜他們犯罪遭
第1章程序设计和C语言.
第3章 目录 1.简介 2.ARM7TDMI 3.ARM7TDMI的模块和内部框图 4.体系结构直接支持的数据类型 5.处理器状态
變數與資料型態  綠園.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
經文 : 創世紀一章1~2,26~28 創世紀二章7,三章6~9 主講 : 周淑慧牧師
嵌入式系统教案 武汉创维特信息技术有限公司 2019/10/1.
隨機函數.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

College of Computer Science & Technology 第三章 ARM9汇编编程 College of Computer Science & Technology

第三章 ARM9汇编编程 ARM汇编程序结构 ARM指令寻址方式 ARM9指令集 ARM汇编语言伪操作与伪指令 鲁东大学 LUDONG UNIVERSITY ARM汇编程序结构 ARM指令寻址方式 ARM9指令集 ARM汇编语言伪操作与伪指令

汇编语言优点 直接操作底层硬件,有利于底层控制 代码效率高 汇编语言缺点 与硬件联系紧密,移植性差 非结构化,代码不易理解,可维护性差 鲁东大学 LUDONG UNIVERSITY 汇编语言优点 直接操作底层硬件,有利于底层控制 代码效率高 汇编语言缺点 与硬件联系紧密,移植性差 非结构化,代码不易理解,可维护性差 改善 高级语言

应用程序 实时操作系统RTOS Kernel BSP板极支持包/HAL硬件抽象层 鲁东大学 LUDONG UNIVERSITY 应用程序 C,C++,Java API 用户图形接口 文件系统 TCP/IP协议 高级语言C 实时操作系统RTOS Kernel BSP板极支持包/HAL硬件抽象层 汇编语言 硬件

第三章 ARM9汇编编程 ARM汇编程序结构 ARM指令寻址方式 ARM9指令集 ARM汇编语言伪操作与伪指令 鲁东大学 LUDONG UNIVERSITY ARM汇编程序结构 ARM指令寻址方式 ARM9指令集 ARM汇编语言伪操作与伪指令 ARM汇编语言与C语言混编程序

ARM汇编语言与C/C++语言混合编程 C语言程序内嵌汇编语句 C语言中调用汇编函数 汇编语言中调用C函数 鲁东大学 LUDONG UNIVERSITY C语言程序内嵌汇编语句 C语言中调用汇编函数 汇编语言中调用C函数

内嵌式汇编语句 函数-实现结果为64位的乘法 C语言函数 内嵌汇编函数 long long smull(int x, int y) { 鲁东大学 LUDONG UNIVERSITY 函数-实现结果为64位的乘法 long long smull(int x, int y) { return (long long) x * y; } C语言函数 内嵌汇编函数 long long smull(int x, int y) { long long res; __asm { SMULL ((int*)&res)[0], ((int*)&res)[1], x, y } return res; }

内嵌汇编(Inline-assembler) I.C语言程序中内嵌汇编指令 鲁东大学 LUDONG UNIVERSITY 内嵌汇编(Inline-assembler) 通过嵌入汇编语句,实现高级语言相同的功能 可以优化编程,提高编程效率。 ①怎样嵌入汇编语句 汇编语言 高级语言C 内嵌汇编 内嵌汇编 汇编语言 高级语言C 内嵌汇编: C/C++编译器编译 汇编:汇编器直接汇编 突出的不同: 1)汇编语言-大量通过直接通过寄存器名使用寄存器,内嵌汇编- 使用C定义的变量,由编译器分配寄存器,不直接指定物理寄存器号 2)汇编伪指令不好用了,因为不是使用汇编器汇编 3)SWI/BL,需要保存现场,恢复现场,比较麻烦,需要查资料准确确定调用格式 ②内嵌汇编与汇编不同 硬核

1.怎样在C中内嵌汇编语句(1) 方法一 内嵌语句形式——C++编译器支持形式 鲁东大学 LUDONG UNIVERSITY 方法一 内嵌语句形式——C++编译器支持形式 asm(“instruction[;instrunction]”); 分隔多条语句 long long smull(int x, int y) { long long res; asm ( “SMULL ((int*)&res)[0], ((int*)&res)[1], x, y” ); return res; } C++编译器要求源文件后缀为*.cpp 分号用于分隔语句,故不能加注释

怎样在C中内嵌汇编语句(2) 方法二 内嵌程序段形式-C编译器支持 __asm{ instruction [;instruction] … 鲁东大学 LUDONG UNIVERSITY 常用 方法二 内嵌程序段形式-C编译器支持 __asm{ instruction [;instruction] … instruction } C语法习惯 两条下划线 long long smull(int x, int y) { long long res; __asm { SMULL ((int*)&res)[0], ((int*)&res)[1], x, y } return res; }

示例-内嵌汇编实现strcopy函数 void my_strcpy(const char *src, char *dst) { 鲁东大学 LUDONG UNIVERSITY void my_strcpy(const char *src, char *dst) { int ch; __asm loop: LDRB ch, [src], #1 STRB ch, [dst], #1 CMP ch, #0 BNE loop } 内嵌汇编标号与C相同 ARMASM语句 STRB r2,[r1],#1

2.内嵌汇编与汇编语言之间的差异 鲁东大学 LUDONG UNIVERSITY 内嵌汇编语句中操作数尽量不要使用物理寄存器,应使用C常量/局部变量,变量在编译时由编译器分配寄存器,所以相当于操作寄存器; 以免造成冲突 __asm { MOV r0, x ADD y, r0, x / y } X=10 Y=2 Y最后应该=? 编译器在运算表达式时,使用了r0

使用物理寄存器务必谨慎 因为: 计算C表达式的值,将使用R0~R3作为临时寄存器 鲁东大学 LUDONG UNIVERSITY 使用物理寄存器务必谨慎 因为: 计算C表达式的值,将使用R0~R3作为临时寄存器 过程调用,将利用R0~R3传递参数 (APCS规则),使用R12(ip)作为临时寄存器,修改R14(lr),存放返回地址 以上操作都有可能更改CPSR 并且不允许直接操作PC(达到转移的效果)

既然参数由r0~r3传递,所以直接对r0~r3操 作,认为是对实参进行操作。 鲁东大学 LUDONG UNIVERSITY 误区 既然参数由r0~r3传递,所以直接对r0~r3操 作,认为是对实参进行操作。 int bad_f(int x) { __asm ADD r0, r0, #1 } return x; } 传参使用r0,r0=x 编译器认为此处使用的r0并不是实参x 改为:ADD x,x,#1 调用后,X=?

内嵌汇编另一作用-直接控制底层硬件 典型应用-使用内嵌汇编开/关中断 inline void enable_IRQ(void) ;开中断函数 鲁东大学 LUDONG UNIVERSITY 典型应用-使用内嵌汇编开/关中断 inline void enable_IRQ(void) { int tmp; __asm MRS tmp, CPSR BIC tmp, tmp, #0x80 MSR CPSR_c, tmp } ;开中断函数 ;CPSR-I位清零,开中断

__inline void disable_IRQ(void) { int tmp; __asm MRS tmp, CPSR 鲁东大学 LUDONG UNIVERSITY __inline void disable_IRQ(void) { int tmp; __asm MRS tmp, CPSR ORR tmp, tmp, #0x80 MSR CPSR_c, tmp } ;关中断函数 ;CPSR-I位置位,关中断

② ① II . C语言程序中调用汇编函数 C源文件 调用 ASM源文件 调用汇编函数strcpy 内嵌汇编指令到C语言源文件 鲁东大学 LUDONG UNIVERSITY C源文件 调用汇编函数strcpy 内嵌汇编指令到C语言源文件 调用 ② C源文件内调用C函数strcpy strcpy内嵌汇编实现拷贝 ASM源文件 内嵌汇编指令与ARM汇编相比: 发生了很多更改 有了很多限制 效率比ARMASM差 汇编函数strcpy ①

汇编函数的编写 标号 -函数名,函数的入口 MOV pc,lr -从函数返回 strcpy strcpy(){ } 鲁东大学 LUDONG UNIVERSITY 汇编函数的编写 标号 -函数名,函数的入口 MOV pc,lr -从函数返回 strcpy LDRB r2, [r1],#1 ; 取出一个字符,修改地址 STRB r2, [r0],#1 ; 向字符串2存入该字符,修改地址 CMP r2, #0 ; 测试字符是不是\0 BNE strcopy ; 如果不是,继续传送 MOV pc,lr ;返回 strcpy(){ }

死循环! ? start LDR r1,=str2 LDR r2,=str1 BL strcpy 运行结果为: 返回BL下一条 strcpy 鲁东大学 LUDONG UNIVERSITY start LDR r1,=str2 LDR r2,=str1 BL strcpy 运行结果为: 死循环! ? 返回BL下一条 strcpy LDRB r2, [r1],#1 STRB r2, [r0],#1 CMP r2, #0 BNE strcopy MOV pc,lr ;返回 汇编函数应写在主程序之后,以免造成不应该的调用。 stop MOV r0,0x18 LDR r1,=0x20026 SWI 0x123456 strcpy LDRB r2, [r1],#1 STRB r2, [r0],#1 CMP r2, #0 BNE strcopy MOV pc,lr ;返回 stop MOV r0,0x18 LDR r1,=0x20026 SWI 0x123456

必须在汇编中用export声明将函数导出 而在C程序中使用extern声明函数原形 II . C语言程序中调用汇编函数 鲁东大学 LUDONG UNIVERSITY 调用问题1: 汇编函数和C程序位于不同的源文件中 要进行函数调用 必须在汇编中用export声明将函数导出 而在C程序中使用extern声明函数原形 AREA SCopy, CODE EXPORT strcopy strcopy …. MOV pc,lr END #include <stdio.h> extern void strcopy(char *d, char *s); int main(){ … }

C调用函数使用的实参,根据APCS规则,编译器将按照顺序通过R0~R3寄存器传递给汇编函数。 鲁东大学 LUDONG UNIVERSITY 调用问题2: 参数传递 C调用函数使用的实参,根据APCS规则,编译器将按照顺序通过R0~R3寄存器传递给汇编函数。 汇编函数 C调用 func func(arg1,arg2,arg3,arg4) r0 r1 r2 r3

#include <stdio.h> extern void strcopy(char *d, char *s); 鲁东大学 LUDONG UNIVERSITY #include <stdio.h> extern void strcopy(char *d, char *s); int main() { char srcstr[] = "First string - source "; char dststr[] = "Second -destination "; strcopy(dststr,srcstr); } AREA SCopy, CODE EXPORT strcopy strcopy LDRB r2, [r1],#1 STRB r2, [r0],#1 CMP r2, #0 BNE strcopy MOV pc,lr END

第二种参数传递方法 使用C全局变量进行参数传递 通过内存传递参数,速度慢 汇编函数 C程序 鲁东大学 LUDONG UNIVERSITY 第二种参数传递方法 使用C全局变量进行参数传递 通过内存传递参数,速度慢 汇编函数 C程序 import globalvar 定义全局变量globalvar func extern func(void) ldr r0,=globalvar int main() ldr r1,[r0] { … func() } ;声明无形参 ;调用无实参 R1为globalvar的值

III.汇编程序中调用C函数 #include <stdio.h> 鲁东大学 LUDONG UNIVERSITY #include <stdio.h> char srcstr[] = "First string - source "; char dststr[] = "Second -destination "; extern void strcopy(void); int main() { strcopy(); } char型8位 int型16位 AREA SCopy, CODE EXPORT strcopy IMPORT srcstr IMPORT dststr strcopy LDR r0,=dststr LDR r1,=srcstr LDRB r2, [r1],#1 STRB r2, [r0],#1 CMP r2, #0 BNE strcopy MOV pc,lr END

III.汇编语言中调用C函数 系统启动过程: 系统启动->0x00000000地址 0x00000000单元 B reset 鲁东大学 LUDONG UNIVERSITY 系统启动过程: 系统启动->0x00000000地址 0x00000000单元 B reset 复位异常处理程序为汇编语言程序对系统部分初始化 将控制权交给C语言编写的启动程序,继续对包括RAM,Cache在内的系统器件进行初始化

III.汇编语言中调用C函数 调用方法: IMPORT函数名,BL函数名 C函数 汇编程序 IMPORT 函数名 … 鲁东大学 LUDONG UNIVERSITY 调用方法: IMPORT函数名,BL函数名 C函数 汇编程序 IMPORT 函数名 … r0 r1 r2 r3 BL 函数名 func(arg1,arg2,arg3,arg4) 传参 调用

int sum(int a, int b, int c) { return a + b + c; } 鲁东大学 LUDONG UNIVERSITY AREA f, CODE, READONLY IMPORT sum ENTRY start MOV r1,#1 MOV r2,#2 MOV r3,#3 BL sum END int sum(int a, int b, int c) { return a + b + c; }