[内核技术] 嵌入式操作系统之四 ARM7 汇编语言简介

[复制链接]
 楼主| 山东电子小菜鸟 发表于 2018-8-8 16:51 | 显示全部楼层 |阅读模式
本帖最后由 山东电子小菜鸟 于 2018-8-8 17:39 编辑

ARM7 芯片有2 种汇编语言指令集,一种叫做ARM 指令集字长为32bits,另一种叫
THUMB 指令集,字长为16bits。这两种指令集各有优缺点,它们可以单独使用也可以混合
在一起使用,在ARM7 芯片上,我们将只使用ARM 指令集,在后续的Cortex 芯片上我们
将使用THUMB 指令集的改良版——THUMB2 指令集。

本小节只介绍本操作系统中使用到的一些汇编语言,对它们的介绍也仅限于本操作系统
使用到的部分用法,并非全面另外我再补充一下我观点,以前看到一些同学说在学习芯片
请教如何使用汇编语言编程,总是抠这方面的问题。

我觉得如果我们学习芯片的目的只是做开发项目,那么就没有必要学习汇编语言,
可以把更多的精力放在学习芯片的功能特性上。一个完备的芯片产品甚至不需要底层软件
工程师了解太多的芯片硬件外设特性,有封装好的驱动库函数可以直接调用。

这次如果不是编写操作系统,我对汇编语言也仅仅是了解一点。汇编语言了解一点即可,,
在某些极少数情况下可能会使用到汇编语言定位问题,但这也是极少的情况。


相关**
嵌入式操作系统之一为什么要使用操作系统
嵌入式操作系统之二 操作系统的分类
嵌入式操作系统之三 预备知识

作者:王奇
后期软文的资料及源代码原理图将在公众号中提供,
有兴趣的朋友可以关注微信公众号:
嵌入式单片机之家


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 山东电子小菜鸟 发表于 2018-8-8 16:56 | 显示全部楼层
本帖最后由 山东电子小菜鸟 于 2018-8-8 17:07 编辑

在操作系统中我们使用了下面几条指令:



1、MOV MOVS
  1. MOV/MOVS
  2. MOV 是英文单词Move 的缩写,“搬移”的意思,将数据搬移进寄存器,指令格式为:
  3. MOV 目的寄存器, 源寄存器
  4. MOV 指令将源寄存器中的数据搬移到目的寄存器中,寄存器间数据搬移可以使用MOV
  5. 指令,如:
  6. MOV R0, R1
  7. MOV R14, PC
  8. 意为:
  9. R0 = R1
  10. R14 = PC + 8
  11. 注意,ARM7 有两级流水线,如果读取PC 寄存器的话,就会多读取2 条指令的长度,
  12. 也就是8 个字节,目的寄存器为PC+8。
  13. MOVS 指令与MOV 指令的格式、功能是一样的,除此之外,如果目的寄存器是PC 的
  14. 话,MOVS 会将当前模式下的SPSR 写入到CPSR 中。本操作系统从SVC 模式返回USR 模
  15. 式时就需要使用MOVS 指令恢复USR 模式的CPSR。例如,在中断模式下有下面的指令:
  16. MOVS PC, R14
  17. 意为:
  18. CPSR = SPSR
  1. PC = R14





 楼主| 山东电子小菜鸟 发表于 2018-8-8 17:05 | 显示全部楼层

2、ADD
  1. ADD
  2. ADD 指令顾名思义,就是英文Add“加”的意思,指令格式为:
  3. ADD 目的寄存器, 源寄存器, 立即数
  4. ADD 指令将源寄存器中的数据和立即数相加的结果保存到目的寄存器中,执行加法操
  5. 作时可以使用ADD 指令,如:
  6. ADD R14, R14, #0x40
  7. 意为:
  8. R14 = R14 + 0x40


 楼主| 山东电子小菜鸟 发表于 2018-8-8 17:07 | 显示全部楼层
3、SUB/SUBS

  1. SUB/SUBS
  2. SUB 是英文单词Subtract 的缩写,意为“减”,指令格式为:
  3. SUB 目的寄存器, 源寄存器, 立即数
  4. SUB 指令将源寄存器中的数据减去立即数,所得的结果存入到目的寄存器中,执行减
  5. 法操作时可以使用SUB 指令,如:
  6. SUB R14, R14, #4
  7. 意为:
  8. R14 = R14 – 4
  9. SUBS 指令中的S 标志与MOVS 指令中的S 标志作用类似,如果目的寄存器是PC 的话,
  10. SUBS 会将当前模式下的SPSR 写入到CPSR 中。本操作系统从IRQ 中断模式返回USR 模
  11. 式时就需要使用SUBS 指令恢复USR 模式的CPSR,如:
  12. SUBS PC, R14, #4
  13. 意为:
  14. PC = R14 – 4
  15. CPSR = SPSR
 楼主| 山东电子小菜鸟 发表于 2018-8-8 17:08 | 显示全部楼层
本帖最后由 山东电子小菜鸟 于 2018-8-8 17:14 编辑

4、AND
  1. AND
  2. AND 指令顾名思义,就是英文And“与”操作的意思,指令格式为:
  3. AND 目的寄存器, 源寄存器1, 源寄存器2
  4. AND 指令将源寄存器1 中的数据和源寄存器2 中的数据做与操作,结果存入目的寄存
  5. 器中,执行与操作时可以使用AND 指令,如:
  6. AND R0, R0, R1
  7. 意为:
  8. R0 = R0 & R1

 楼主| 山东电子小菜鸟 发表于 2018-8-8 17:08 | 显示全部楼层
本帖最后由 山东电子小菜鸟 于 2018-8-8 17:15 编辑

5、orr
  1. ORR
  2. ORR 对应的英文是Or,“或”操作的意思,指令格式为:
  3. 11
  4. ORR 目的寄存器, 源寄存器1, 源寄存器2
  5. ORR 指令将源寄存器1 中的数据和源寄存器2 中的数据做或操作,结果存入目的寄存
  6. 器中,执行或操作时可以使用ORR 指令,如:
  7. ORR R0, R0, R1
  8. 意为:
  9. R0 = R0 | R1

 楼主| 山东电子小菜鸟 发表于 2018-8-8 17:16 | 显示全部楼层
6、ldr

  1. LDR
  2. LDR 是英文Load Register 的缩写,“加载寄存器”的意思,将内存中的数据存入寄存器
  3. 中,指令格式为下面2 种格式:
  4. LDR 目的寄存器, [源寄存器]
  5. LDR 目的寄存器, =常量
  6. 第一种格式将源寄存器中数据指向的内存地址中的数据存入目的寄存器,第二种格式将
  7. 常量值存入目的寄存器,为寄存器赋值时可以使用LDR 指令,如:
  8. LDR R14, [R0]
  9. LDR R0, =gpstrCurTaskSpAddr
  10. 第一条指令意为:
  11. R14 = *R0
  12. 第二条指令中gpstrCurTaskSpAddr 是一个全局变量,第二条指令意为:
  13. R0 = &gpstrCurTaskSpAddr


 楼主| 山东电子小菜鸟 发表于 2018-8-8 17:32 | 显示全部楼层
本帖最后由 山东电子小菜鸟 于 2018-8-8 17:33 编辑





















本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
stockering 发表于 2018-8-23 07:44 来自手机 | 显示全部楼层
楼主怎么不更新了?
 楼主| 山东电子小菜鸟 发表于 2018-8-24 07:11 | 显示全部楼层
stockering 发表于 2018-8-23 07:44
楼主怎么不更新了?

最近有点忙 忙完就更新 谢谢支持
侯少 发表于 2021-2-23 20:03 | 显示全部楼层
楼主更新呀,受益良多呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq:641208111;技术交流群:377640799 大学电子竞赛预热赛开赛啦~千元大奖等你来拿火热进行中!!点击参加活动 欢迎加个人QQ:641208111一起交流合作

140

主题

3082

帖子

23

粉丝
快速回复 在线客服 返回列表 返回顶部