Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6320641
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: LINUX

2013-10-01 11:23:21

原文地址:汇编语言得玩转 作者:特殊借口

1、ARM汇编的概述
1.1、为什么要学习汇编
在我们的bootloder和内核的硬件初始化启动代码的时候需要用到汇编程序,另外在效率方面有特殊要求的需要用到汇编程序因为汇编程序的效率较C语言要高一点。
1.2、ARM汇编的分类
ARM标准汇编:主要适合在ARM公式的汇编器,适合在windos平台上使用,如ADS中使用。
ARM GNU汇编:使用于GNU交叉编译工具链中汇编器,适合于Linux开发平台。
1.3汇编程序框架
.section.data
<初始化的数据>
.section.bss
<未初始化的数据>
.section.text
.global _start
_start:
<汇编代码>
建立汇编程序的编程环境
1、建立源文件start.S
.text
.global _start
_strat:
mov r1, #1
mov r2, #2
mov r3, #3
2、编辑Makefile文件
all : start.o
arm-linux-ld Ttext 50000000 -o start.elf $^

%.o : %.S
arm-linux-gcc -g -o $@ $^ -c

clean:
rm *.o *.elf
3、连接好开发板,打开电源启动,运行./JLinkGDBserver(注意:此终端不能闭关
4、启动Eclipse集成开发环境,建立工程Makefile Project with Exiting Code,添加代码到工程里,Build All 编译工程。
5、配置调试功能:进入Debug Configurations ,双击ZYlin Embedded debug (native).此时会生成一个配置窗口,在Main选项里指定调试的应用程序start.elf,在Debugger选项里去掉勾选Step on Startup at: Main,指定GDB调试器为arm-linux-gdb。最后在Commandsl里添加相应开发板的初始化脚本文件。
6、进入调试阶段:双击我们创建好的的配置文件。
2、ARM指令分类学习

点击(此处)折叠或打开

  1. .data
  2. hello:
  3. .ascii "helloworld"
  4. .align 4
  5. bh:
  6. .byte 0x1
  7. ADD:
  8. .word 0xff
  9. .text
  10. .global _start
  11. _start:
  12. .equ DA,0x89
  13. mov r0,#DA
  14. @存储器访问指令ldr,str
  15. mov r0,#0xee
  16. str r0,[r1]
  17. ldr r2,[r1]
  18. @程序状态字寄存器访问指令
  19. mrs r0,cpsr
  20. orr r0,#0b100
  21. msr cpsr,r0
  22. @移位指令,
  23. mov r1,#0b1
  24. mov r1,r1,lsl#2
  25. mov r1,#0b11
  26. mov r1,r1,ror#1
  27. @b指令,跳转指令
  28. mov r1, #6
  29. mov r2, #5
  30. cmp r1, r2
  31. bgt branch
  32. sub r3, r2, r1
  33. b end
  34. branch:
  35. add r3,r2,r1
  36. end:
  37. nop
  38. @tst指令,按位与,如果结果为0则cpsr的c位置1,否则为0
  39. mov r1, #0b101
  40. tst r1, #0b001
  41. mov r1, #0b101
  42. tst r1, #0b10
  43. @cmp指令,执行比较,影响N位
  44. mov r1,#2
  45. cmp r1,#1
  46. mov r1,#2
  47. cmp r1,#3
  48. mov r1,#2
  49. cmp r1,#2
  50. @bic指令,执行位清除
  51. mov r1,#0b101011
  52. bic r2,r1,#0b101
  53. @and指令,执行逻辑与操作
  54. mov r1,#5
  55. and r2,r1,#0
  56. mov r1,#5
  57. and r2,r1,#1
  58. @add指令范例,执行加法操作
  59. add r1,r2,#3
  60. @sub指令范例,执行减法操作
  61. mov r2,#4
  62. sub r1,r2,#2
  63. mov r0,#1
  64. sub r3,r1,r0
  65. @mov 指令的范例
  66. mov r1,#8
  67. mov r2,r1
  68. mov r3,#10
  69. @mvn指令范例
  70. mvn r1,#0b10
  71. mvn r2,#5
  72. mvn r3,r1


3、机器码与伪指令
3.1、机器码分析
当我们将start.elf文件进行反汇编时,(arm-linux-objdump -D -S start.elf)我们 会看到一列8位的十六进制数,其实质是一个32位整数,被分成很多歌段,每个段代表不同的含义,如下图所示:
3.2、伪指令
global:表明一个全局符号
ascii:表明字符串数据
byte:表明一个字节型数据
word:表明一个字数据
data:表明数据段
equ:定义宏的值
align:地址字节对齐
nop:实际是执行 mov r0,r0的操作
ldr:可以将一个大于8位的立即数加载到寄存器上,其实质是将PC地址减4,将立即数转化为一个字数据加载到寄存器里。
指令本身并没有机器码,他只是在编译的时候起作用,或者转化为其它的指令运行。
4、协处理器器及访问指令
4.1、协处理器的定义:
协处理器器用于执行特定的任务,可用于设置和控制caches、MMU等,数字协处理器器可以控制数字处理,ARM可支持最多16个协处理器器,其中CP15是最重要的一个。
4.2、协处理器的访问指令:mcr、mrc,用于在协处理器器和通用寄存器之间传递数据。在具体使用时可以参考ARM手册很容易的就可以使用了。
阅读(401) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~