在bin文件中,就是一条条的机器指令,每条指令4个字节。

在ADS中打开一个.s文件,选择project->disassemble

可以看到汇编的机器码

汇编代码如下(ADS中的一个例程/ARM/ADSv1_2/Examples/asm/armex.s):

AREA ARMex, CODE, READONLY  ; name this block of code

ENTRY                       ; mark first instruction

; to execute

start

MOV     r0, #10             ; Set up parameters

MOV     r1, #3

ADD     r0, r0, r1          ; r0 = r0 + r1

stop

MOV     r0, #0x18           ; angel_SWIreason_ReportException

LDR     r1, =0x20026        ; ADP_Stopped_ApplicationExit

SWI     0x123456            ; ARM semihosting SWI

END                         ; Mark end of file

执行project->disassemble后:

** Section #1 'ARMex' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR + SHF_ENTRYSECT]

Size   : 28 bytes (alignment 4)

start

$a

ARMex

0x00000000:    e3a0000a    ....    MOV      r0,#0xa

0x00000004:    e3a01003    ....    MOV      r1,#3

0x00000008:    e0800001    ....    ADD      r0,r0,r1

stop

0x0000000c:    e3a00018    ....    MOV      r0,#0x18

0x00000010:    e59f1000    ....    LDR      r1,0x18

0x00000014:    ef123456    V4..    SWI      0x123456

$d

0x00000018:    00020026    &...    DCD    131110

使用UltraEdit看bin文件如下:

可以看到,与上面的一样。

其中MOV的机器码如下(ARM体系结构pdf:p156):

cond,AL(Always)为0b1110

最后有一个131110不知道是什么意思。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

另一个汇编代码如下(ADS中的一个例程/ARM/ADSv1_2/Examples/asm/ subrout.s):

AREA subrout, CODE, READONLY    ; name this block of code

ENTRY                           ; mark first instruction

; to execute

start

MOV     r0, #10                 ; Set up parameters

MOV     r1, #3

BL      doadd                   ; Call subroutine

stop

MOV     r0, #0x18               ; angel_SWIreason_ReportException

LDR     r1, =0x20026            ; ADP_Stopped_ApplicationExit

SWI     0x123456                ; ARM semihosting SWI

doadd

ADD     r0, r0, r1              ; Subroutine code

MOV     pc, lr                  ; Return from subroutine.

END                             ; Mark end of file

执行project->disassemble后:

** Section #1 'subrout' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR + SHF_ENTRYSECT]

Size   : 36 bytes (alignment 4)

start

$a

subrout

0x00000000:    e3a0000a    ....    MOV      r0,#0xa

0x00000004:    e3a01003    ....    MOV      r1,#3

0x00000008:    ebfffffe    ....    BL       doadd  ; 0x18

stop

0x0000000c:    e3a00018    ....    MOV      r0,#0x18

0x00000010:    e59f1008    ....    LDR      r1,0x20

0x00000014:    ef123456    V4..    SWI      0x123456

doadd

0x00000018:    e0800001    ....    ADD      r0,r0,r1

0x0000001c:    e1a0f00e    ....    MOV      pc,r14

$d

0x00000020:    00020026    &...    DCD    131110

使用UltraEdit看bin文件如下:

不知道为什么,ADS里面的BL       doadd的机器码和bin中的机器码不一样。

BL的机器指令如下:

0x00000008:    ebfffffe    ....    BL       doadd  ; 0x18

按bin中的机器码,EB000002,1110_1101_0000_0000____0000_0000_0000_0010

会在执行bl指令时的PC后面加上2*4byte,正好跳过3条指令。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

下面这个将doadd写到另一个.s文件中。

subrout.s文件:

AREA subrout, CODE, READONLY    ; name this block of code

ENTRY                           ; mark first instruction

; to execute

IMPORT doadd                                  ; import

start

MOV     r0, #10                 ; Set up parameters

MOV     r1, #3

BL      doadd                   ; Call subroutine

stop

MOV     r0, #0x18               ; angel_SWIreason_ReportException

LDR     r1, =0x20026            ; ADP_Stopped_ApplicationExit

SWI     0x123456                ; ARM semihosting SWI

END                             ; Mark end of file

fun.s文件:

AREA subrout, CODE, READONLY    ; name this block of code

EXPORT doadd

doadd   FUNCTION

ADD     r0, r0, r1              ; Subroutine code

MOV     pc, lr                  ; Return from subroutine.

ENDFUNC

LTORG

END

UE查看bin结果:

可以看出,跳转指令变为跳转3个指令,doadd函数放在了bin的最后。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

将上面的subrout.s文件改为:

AREA subrout, CODE, READONLY    ; name this block of code

ENTRY                           ; mark first instruction

; to execute

IMPORT doadd                                  ; import

start

LDR     r0, Param1              ; Set up parameters

LDR     r1, Param2

BL      doadd                   ; Call subroutine

stop

MOV     r0, #0x18               ; angel_SWIreason_ReportException

LDR     r1, =0x20026            ; ADP_Stopped_ApplicationExit

SWI     0x123456                ; ARM semihosting SWI

Param1   DCD 10

Param2   DCD 3

END                             ; Mark end of file

MOV只能操作reg和立即数

操作内存,MOV要改为LDR

UE查看bin为:

LDR     r0, Param1的机器码为:

E59F0010=0111_0101_1001_1111_0000_0000_0001_0000

Rn为R15=PC,Rd=R0,address=16(4*Instruction)+PC

有时候ADS会把doadd函数的两条指令放到最开始,此时Image Entry Point变为0x8,不知道ADS在分配主程序和doadd时有什么原则?

转载于:https://www.cnblogs.com/yanhc/archive/2011/05/03/2175245.html

arm的bin二进制代码分析相关推荐

  1. ARM中断返回地址详细分析

    ARM中断返回地址详细分析 在ARM体系中,通常有以下3种方式控制程序的执行流程: 1.在正常执行过程中,每执行一条ARM指令,程序计数器PC的值加4个字节:每执行一条Thumb指令,程序计数器PC加 ...

  2. (转载)bin文件格式分析

    xip 的 bin 文件分析 一个bin 文件在存储上是按下面的结构存储的 组成:标记(7)+Image开始地址(1)+Image长度(1)            记录0地址+记录0长+记录0校验和+ ...

  3. arm上backtrace的分析与实现原理

    arm上backtrace的分析与实现原理 - bigmagic的个人空间 - OSCHINA - 中文开源技术交流社区https://my.oschina.net/u/4239621/blog/43 ...

  4. ARM uboot 源码分析5 -启动第二阶段

    一.start_armboot 解析6 1.console_init_f (1) console_init_f 是 console(控制台)的第一阶段初始化._f 表示是第一阶段初始化,_r 表示第二 ...

  5. ARM GICv3 GIC代码分析

    前言 在前一篇博文(ARM GICv3中断控制器)中, 介绍了GIC的一些基本概念,本文主要分析了linux kernel中GIC v3中断控制器的代码(drivers/irqchip/irq-gic ...

  6. ARM中断向量表的简单分析

    一般编写arm的裸机程序的时候,创建中断向量表就把它放在0x00000000~0x0000001c中,一般都放在这个位置上.但是中断向量表也可以放在0xffff0000~0xffff001c中,知道这 ...

  7. 【ARM】Uboot代码分析

    一.摘要 这篇文章主要对BootLoader(UBoot)的源码进行了分析,并对UBoot的移植略作提及.  BootLoader的总目标是正确调用内核的执行,由于大部分的BoorLoader都依赖于 ...

  8. proxmark3 IC卡密码bin文件格式分析

    冰人固件需要创建对应的密码bin文件,从GUI生成的文件分析,文件由16个扇区的密码A拼接16个扇区的密码B构成,每个扇区密码长度为12位16进制数.例如该文件中,扇区1密码AB均为01B5BFDA1 ...

  9. Mysql的undo、redo、bin log分析

    目录 关于undo log 关于redolog 关于binlog 一个事务的提交流程 undo log :记录数据被修改之前的样子 redo log:记录数据被修改之后的样子 bin log:记录整个 ...

  10. Linux学习笔记---烧写bin文件分析

    在看正点原子 I.MX6U 嵌入式 x Linux 驱动开发指南时,在第九章分析了启动文件的组成,但是通过文档中介绍的HEX文件查看器查看 load.imx文件时感觉不是很方便,于是就在Notepad ...

最新文章

  1. docker Cannot start container [8] System error: exec format error
  2. 【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )
  3. 使用Apriori算法进行关联分析
  4. 操作系统:操作系统知识点总结
  5. 【转】Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现
  6. 行内元素和块级元素的区别,为何img、input等行内元素可以设置宽高??(夯实基础)
  7. bzoj3527: [Zjoi2014]力 fft
  8. 深入解析Koa之核心原理
  9. 微信公众平台可为市民鉴别万余药品真伪
  10. Xshell 一款很养眼的配色方案推荐
  11. 181104每日一句
  12. python perl 正则_为什么说perl的正则表达式功能比Python强大
  13. 基于TCP协议的摄像头视频网络传输
  14. 基于php+mysql的企业人事管理系统
  15. python 文件合并
  16. Samsung ML-1640/1641/1645/2240/2241/2245/scx4200/4300/4623/4824/4828免费清零软件2.1.2完全版
  17. FusionCharts 技术文档-drilldown map
  18. 7-28 猴子选大王 (20分)
  19. Java从服务端下载Excel模板文件
  20. 【技巧】如何修改PDF文件?

热门文章

  1. 个图标当十个用—多功能系统级图标制作攻略
  2. string成员函数
  3. leetcode python 042收集雨水
  4. 2017.3.28杂感
  5. 【记录】AutoMapper Project To OrderBy Skip Take 正确写法
  6. mahout推荐15-在hadoop上运行MapReduce
  7. SQL数据库每日自动备份
  8. 基于k8s安装配置kubeflow
  9. 软件详细设计文档【转】
  10. Android 比SwipeRefreshLayout更漂亮和强大的下拉刷新控件:Android-MaterialRefreshLayout