野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16470|回复: 1

详细学习ARM 汇编指令(二)

[复制链接]
发表于 2015-1-15 13:45:51 | 显示全部楼层 |阅读模式
上一篇文章对ARM下汇编的常用的指令进行了介绍,由于篇幅限制的原因,本文接着往下讲,主要介绍的内容是ARM汇编的伪指令的协处理器指令。
1. ARM 机器码(1) 机器码反汇编示例
汇编程序执行流程 : 汇编代码 > 汇编器 > 机器码 > CPU 运行;
反汇编示例 : 找到一个 elf 文件, 使用 arm-linux-objdump 反汇编;
命令 : 使用 arm-linux-objdump -S -D start.elf 命令进行反汇编, 其中 "50008000:e3a01001 movr1, #1; 0x1" 中的 "e3a01001" 就是机器码, 如下图标注部分;
反汇编部分结果 :
  1. [root@localhost 04_assembly]# arm-linux-objdump -S -D start.elf
  2. start.elf:     file format elf32-littlearm
  3. Disassembly of section .text:
  4. 50008000 <_start>:
  5. .text
  6. .globl _start
  7. _start:
  8. mov r1,#1
  9. 50008000:   e3a01001   mov r1, #1 ; 0x1
  10. mov r2,#2
  11. 50008004:   e3a02002   mov r2, #2 ; 0x2
  12. mov r3,#3
  13. 50008008:   e3a03003   mov r3, #3 ; 0x3
  14. Disassembly of section .debug_aranges:
复制代码
(2) 机器码格式
机器码格式 : 截图自 arm 文档 P110;
ARM 机器码位数 : 32位;
机器码分段 :
(3) 解析 MOV 指令机器码
代码准备 :
汇编代码 :
  1. .text
  2. .globl _start
  3. _start:
  4. mov r0, r1
  5. moveq r0, #0xff
复制代码
Makefile 脚本 :
  1. all:start.o
  2. arm-linux-ld -Ttext 0x50008000 -o start.elf $^
  3. [[[[[[%]]]]]].o:[[[[[[%]]]]]].S
  4. arm-linux-gcc -g -o $@ $^ -c
  5. clean:
  6. rm -rf *.o *.elf
复制代码
反汇编 elf 文件 :
反汇编内容 : 省略下面的大部分;
  1. [root@localhost 04_assembly]# arm-linux-objdump -S -D start.elf
  2. start.elf:     file format elf32-littlearm
  3. Disassembly of section .text:
  4. 50008000 <_start>:
  5. .text
  6. .globl _start
  7. _start:
  8. mov r0, r1
  9. 50008000:   e1a00001   mov r0, r1
  10. moveq r0, #0xff
  11. 50008004:   03a000ff   moveq   r0, #255   ; 0xff
  12. Disassembly of section .debug_aranges:
复制代码
汇编对应机器码 :
"mov r0, r1" : 十六进制 0xe1a00001, 二进制      11100001101000000000000000000001;
"moveq r0, #0xff" : 十六进制 0x03a000ff, 二进制 00000011101000000000000011111111;
机器码解析 :
第一条 : 1110 00 0 1101 0 0000 0000 000000000001
第二条 : 0000 00 1 1101 0 0000 0000 000011111111
条件位对比 (第一段 31 ~ 28) :  第一条是 1110 对应 AL 总是执行,  第二条是 0000 对应 EQ;
保留位对比 (第二段 27 ~ 26) : 第一条 00, 第二条 00, 明显都一样;
I 操作数类型标识位 (第三段 25) : 标志最后一个存立即数 还是寄存器, 如果是 0 表示寄存器, 如果是 1 表示立即数;
操作码位 (第四段 24 ~ 21) : 区分不同指令, 1101 是 MOV 指令;
S 状态寄存器改变标识 (第五段 20) : 是否影响 CPSR 寄存器, 如果 S = 0 不影响, 如果 S = 1 影响;
Rn 源操作寄存器 (第六段 19 ~ 16) : MOV 和 MVN 不使用 Rn 位, 寄存器编号;
Rd 目的操作寄存器 (第七段 15 ~ 12) : 寄存器编号;
shifter_operand 源操作书 (第八段 11 ~ 0) : 源操作数, 这个与 I 位结合起来, 如果 I = 0, 该位表示寄存器编号, 如果 I = 1, 该位表示 立即数大小, 立即数是有范围的, 如果超出会报错, 这里就需要使用伪指令了;
转自物联网博客:http://www.iotblog.cn/u/lixiaomei/b-192,转载请注明出处。

回复

使用道具 举报

发表于 2015-1-15 15:58:17 | 显示全部楼层
赞,现在很少人研究汇编啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 13:50 , Processed in 0.034589 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表