Cortex M3权威指南中文版chpt04 05.pdf
文本预览下载声明
Cortex‐M3 权威指南 初稿 第4 章
第4章
指令集
汇编语言基础
指令集
近距离地检视指令
Cortex‐M3 中的一些新好指令
终于“开荤”了,本章开始把Cortex‐M3 的指令系统展现出来,并且给出了一些简单却
意味深长的例子。在本书的附录 A 中还有一个快速的查阅参考。指令集的详细信息由
《ARMv7‐M Architecture Application Level Reference Manual》(Ref2)给出——写了两百多页呢。
如果读者以前没有写过ARM 汇编程序,可以结合看本书的第20 章,那里讲述了Keil RVMDK 工具的使
用,包括添加汇编源文件的方法。RVMDK 带了一个指令模拟器,对于练习汇编程序非常有帮助。那一章虽
然不是很短但很简单。值得一提的是,在那一章的末尾,译者添加了少量内容,是专为学习第4 章而添加
的。
汇编语言基础
为了给以后的学习扫清障碍,这里我们先简要地介绍一下ARM 汇编器的基本语法。本
书绝大多数的汇编示例都使用ARM 汇编器的语法,而第19 章则使用GCC 汇编器AS 的语法。
汇编语言:基本语法
汇编指令的最典型书写模式如下所示:
标号
操作码 操作数1, 操作数2, … ; 注释。
其中,标号是可选的,如果有,它必须顶格写。标号的作用是让汇编器来计算程序转移
的地址。
操作码是指令的助记符,它的前面必须有至少一个空白符,通常使用一个“Tab”键来
产生。操作码后面往往跟随若干个操作数,而第1 个操作数,通常都给出本指令执行结果的
存储地。不同指令需要不同数目的操作数,并且对操作数的语法要求也可以不同。举例来说,
立即数必须以“# ”开头,如
MOV R0, #0x12 ; R0 0x12
MOV R1, #’A’ ; R1 字母A 的ASCII码
注释均以”;”开头,它的有无不影响汇编操作,只是给程序员看的,能让程序更易理解。
还可以使用EQU 指示字来定义常数,然后在代码中使用它们,例如:
NVIC_IRQ_SETEN0 EQU 0xE000E100
NVIC_IRQ0_ENABLE EQU 0x1
…
LDR R0, =NVIC_IRQ_SETEN0 ;在这里的LDR 是个伪指令,它会被汇编器转换成
;一条“相对PC 的加载指令”
MOV R1, #NVIC_IRQ0_ENABLE ; 把立即数传送到指令中
STR R1, [R0] ; *R0=R1,执行完此指令后IRQ #0被使能。
51
Cortex‐M3 权威指南 初稿 第4 章
注意:常数定义必须顶格写
如果汇编器不能识别某些特殊指令的助记符,你就要“手工汇编”——查出该指令的确
切二进制机器码,然后使用DCI 编译器指示字。例如,BKPT 指令的机器码是0xBE00,即可
以按如下格式书写:
DCI 0xBE00 ; 断点(BKPT),这是一个16位指令
(DCI 也必须空格写——译注)
类似地,你还可以使用 DCB 来定义一串字节常数——允许以字符串的形式表达,还可
以使用DCD 来定义一串32
显示全部