历史上的今天
返回首页

历史上的今天

今天是:2024年12月23日(星期一)

正在发生

2019年12月23日 | ARM反汇编学习

2019-12-23 来源:eefocus

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


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

可以看到汇编的机器码

汇编代码如下(ADS中的一个例程ARMADSv1_2Examplesasmarmex.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文件如下:

clip_image002

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

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

clip_image004

cond,AL(Always)为0b1110

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

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

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

另一个例子汇编代码如下(ADS中的一个例程ARMADSv1_2Examplesasm 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文件如下:

clip_image006

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

BL的机器指令如下:

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

clip_image008

clip_image010

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

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

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

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

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

clip_image012

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结果:

clip_image014

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

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

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

这个例子将上面的subrout.s文件改为(工程subroutprj_2F_DCD):

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为:

clip_image016

LDR r0, Param1的机器码为:

E59F0010=0111_0101_1001_1111_0000_0000_0001_0000

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

clip_image018

输出的Image Symbol Table为:

================================================================================

Image Symbol Table

Mapping Symbols

Sym Value Execution Region

$a 0x00000000 ER_RO

$d 0x00000020 ER_RO

其中$a表示ARM Code,$d表示Data

这是整个bin文件的区域分配,从0开始为ARM Code,然后从20开始为Data,其中ARM Code是fun section和subrout section合在一起的,Data也是两个数据合在一起的(似乎是armlink把input section中同一属性的段合并到output section中)。

clip_image019

ADS中输出调试信息
clip_image021Image Map
Symbol
Section cross-reference
在list file中choose一个文件,比如boot270.txt,可以把信息输出到txt中

下面这个输出是subroutprj_2F_DCD的输出,在arm反汇编.doc里。

================================================================================

Image Symbol Table

Mapping Symbols

Sym Value Execution Region

$a 0x00000000 ER_RO

$d 0x00000020 ER_RO

Local Symbols

Symbol Name Value Ov Type Size Object(Section)

E:dsparmpxa270projectsubroutprj_2F_DCDsubrout.s 0x00000000 Number 0 subrout.o ABSOLUTE

0x00000000 Data 16 subrout.o(.debug_abbrev)

0x00000000 Data 128 subrout.o(.debug_info)

0x00000000 Data 108 subrout.o(.debug_line)

subrout 0x00000008 ARM Code 36 subrout.o(subrout)

start 0x00000008 ARM Code 0 subrout.o(subrout)

stop 0x00000014 ARM Code 0 subrout.o(subrout)

Param1 0x00000020 Data 4 subrout.o(subrout)

Param2 0x00000024 Data 4 subrout.o(subrout)

E:dsparmpxa270projectsubroutprj_2F_DCDfun.s 0x00000000 Number 0 fun.o ABSOLUTE

0x00000000 Data 60 fun.o(.debug_frame)

0x00000010 Data 16 fun.o(.debug_abbrev)

fun 0x00000000 ARM Code 8 fun.o(fun)

0x0000006c Data 96 fun.o(.debug_line)

0x00000080 Data 124 fun.o(.debug_info)

Global Symbols

Symbol Name Value Ov Type Size Object(Section)

BuildAttributes$$ARM_ISAv4$M$PE$A:L22$X:L11$S22$~IW$~STKCKD$~SHL$OSPACE 0x00000000 Number 0 anon$$obj.o ABSOLUTE

doadd 0x00000000 ARM Code 8 fun.o(fun)

UE查看bin结果

clip_image023

从bin看到,doadd两条指令放在了bin的最前面,这样

start的值value为0x00000008

fun的值value为0x00000000

start和fun都是ARM Code,是代码的标号label,标号的值代表一个地址,所以start和fun在bin中的地址即为它们的值。

Image Symbol Table中包含两部分,Local Symbol和Global Symbol,前者在只能在定义的文件中引用,后者可以在整个工程中引用。在这个工程中后者只有doadd函数。

========================================================================

Memory Map of the image

Image Entry point : 0x00000000

Load Region LR_1 (Base: 0x00000000, Size: 0x0000002c, Max: 0xffffffff, ABSOLUTE)

Execution Region ER_RO (Base: 0x00000000, Size: 0x0000002c, Max: 0xffffffff, ABSOLUTE)

Base Addr Size Type Attr Idx E Section Name Object

0x00000000 0x00000008 Code RO 5 * fun fun.o

0x00000008 0x00000024 Code RO 1 * subrout subrout.o

Execution Region ER_RW (Base: 0x0000002c, Size: 0x00000000, Max: 0xffffffff, ABSOLUTE)

**** No section assigned to this execution region ****

Execution Region ER_ZI (Base: 0x0000002c, Size: 0x00000000, Max: 0xffffffff, ABSOLUTE)

**** No section assigned to this execution region ****

Image Entry point : 0x00000000这句话有点问题??!!

Base Addr Size Type Attr Idx E Section Name Object

0x00000000 0x00000008 Code RO 5 * fun fun.o

0x00000008 0x00000024 Code RO 1 * subrout subrout.o

上面这些说明了各段的基地址,长度,类型(code,data),属性(RO,RW),段名,存在的目标文件。

在这里fun放在了subrout的前面,由于armlinker在链接input section的时候排序sort是有规则的,先同一属性(RO,RW,RI),然后按名字的字母表顺序。由于fun和subrout都是RO,所以按名字fun在前面。

-----------------------------------------------------------------

下面以boot270工程为例子分析:

输出的Image Symbol Table

Global Symbols

Symbol Name Value Ov Type Size Object(Section)

xlli_read_SCR 0xa000cea0 ARM Code 420 xlli_LowLev_Init.o(text)

可以看出xlli_read_SCR为ARM Code,是一个标号label,值即为其在bin中的地址,由于设置RO Base为0xA0000000,所以在bin中找0x0000cea0处的指令:

clip_image025

指令为E59F_419C,即为

xlli_read_SCR FUNCTION

;

; Insure the RDH and PH bits on PXA27x must be clear to enable GPIO pins.

; They are sticky bits so they must be set to clear them.

;

ldr r4, =xlli_PMRCREGS_PHYSICAL_BASE

该指令表示(E表示AL,无条件,F为R15=PC,4表示放到R4里,地址为PC+19C=D03C,再加2*4为D044)

clip_image027

0x0000d044处的数据为40F00000,与代码中的数据吻合:

; POWER MANAGER base address and register offsets from the base address

;

xlli_PMRCREGS_PHYSICAL_BASE EQU 0x40F00000

这个数据在Image Symbol Table中也能找到,在Local Symbols中:

xlli_PMRCREGS_PHYSICAL_BASE 0x40f00000 Number 0 main_Flash.o ABSOLUTE

能看到是一个Number,值value为0x40f00000。

这个数据的地址在Image Symbol Table中也能看到:

Mapping Symbols

Sym Value Execution Region

$d 0xa000d044 ER_RO

$d表示数据data。

下一条指令:

; Get, and save the present GPIO settings for direction registers 0, 1 and 2

;

ldr r4, =xlli_GPIOREGS_PHYSICAL_BASE ; Get the GPIO registers base address

clip_image029

指令为:E5_9F_4_194

数据的地址为:PC+194+2*4=D048

clip_image031

数据为:40E0 0000,与代码中的定义对应:

; GENERAL PURPOSE I/O (GPIO) base address and register offsets from the base address

;

xlli_GPIOREGS_PHYSICAL_BASE EQU 0x40E00000

地址0x0000 D048在Image Symbol Table中没有,不过有:

Mapping Symbols

Sym Value Execution Region

$d 0xa000d044 ER_RO

说明从0xa000d044处开始为许多RO data

上面的工程只有RO,怎么才能产生RW,RI呢?

MOV E3

LDR E5

ADD E0

推荐阅读

史海拾趣

Dau Semiconductor Inc公司的发展小趣事

在市场竞争日益激烈的今天,Dau Semiconductor Inc公司深知只有不断创新和升级技术,才能保持市场竞争力。因此,公司不断加大对研发的投入,引进先进的设备和人才,探索新的技术方向。近年来,公司成功研发出了多款具有创新性的半导体芯片产品,如基于人工智能技术的智能芯片、基于物联网技术的低功耗传感器芯片等。这些产品的推出,不仅为公司带来了更多的商业机会,也为行业的发展注入了新的活力。

Amplitronix LLC公司的发展小趣事

随着公司的发展,Amplitronix LLC逐渐在电子测量仪器领域站稳脚跟。然而,他们并没有满足于现状,而是继续投入研发,寻求技术突破。经过数年的努力,公司成功开发出一种具有颠覆性的新技术,显著提高了测量仪器的精度和稳定性。这一技术突破为公司赢得了更多的客户和市场份额,也为公司的未来发展奠定了坚实的基础。

DBM Optix公司的发展小趣事

随着全球对环保和可持续发展的重视,DBM Optix也积极响应这一趋势。公司在生产过程中注重节能减排、降低废弃物排放等措施,同时积极开发环保型产品,以满足客户对绿色环保的需求。此外,DBM Optix还积极参与各种环保活动和社会公益事业,为推动电子行业的可持续发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。

Diotec Electronics Corp公司的发展小趣事

随着环保意识的提高,Diotec开始关注绿色发展和社会责任。公司积极采用环保材料和生产工艺,减少生产过程中的环境污染。同时,Diotec还参与了一系列公益活动,为当地社区和环境保护事业做出了贡献。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了基础。

EM Microelectronic-Marin SA公司的发展小趣事

多年来,EM Microelectronic-Marin始终保持着对技术的热爱和追求。公司不断投入资源进行研发,推动电子技术的持续发展。在未来,随着物联网、人工智能等技术的不断兴起,EM Microelectronic-Marin将继续致力于技术创新和产品升级,为电子行业的发展贡献自己的力量。

DIPTRONICS MANUFACTURING INC公司的发展小趣事

圜达实业于1985年在台湾新北市创立,创始人凭借对电子开关行业的深刻理解和前瞻视野,决定专注于研发制造各类程序开关、触动开关等产品。公司初创时期面临资金短缺、市场竞争激烈等挑战,但创始人凭借坚定的信念和不懈的努力,逐步在市场上站稳脚跟。

问答坊 | AI 解惑

VxWorks5.4->6.5移植--ifLib

目前在做VxWorks的应用程序代码移植,从5.4到6.5,在5.4的代码使用了ifLib库里的函数,如ifunit()、ifAddrGet()等;而在VxWorks6.5中,ifLib库已经没用,请问是用别的库来代替?若是,可否有针对性的对ifunit()做个移植的解释?谢谢!…

查看全部问答>

WINCE字体的问题!

请问:修改WINCE的字体变使它变小后,窗口上文字又显示不清晰!有什么好办法解决呀!谢谢了!…

查看全部问答>

求单片机控制程序源代码

各位大侠帮忙啊~ 求单片机控制程序源代码,单片机控制状态的转移  就是实现标签和阅读器的控制 希望做过有经验的 帮帮忙啊  感谢感谢…

查看全部问答>

自动控制原理

有没有对自动控制原理感兴趣的大师啊,交流下.…

查看全部问答>

测试设备,寻求合作!

水位、温度测试,用单片机实现,体积要小,数据传送800米,最好用mcs1200,熟悉者联系:437175689,诚求合作…

查看全部问答>

请问谁有 MST710 芯片驱动

请问谁有MSG710芯片驱动(最好是linux下面的)的,现在正在做模拟屏的驱动,第一次做芯片驱动又比较急,不知道该怎么下手,想要一份参考一下。谢谢。 luogk@magliving.com …

查看全部问答>

EE_FPGA基础教程系列 --NO.3-- 玩转LED

Table of Contents 1.        剧情回放        4 2.        玩转LED        4   2.1        硬件连接        4 ...…

查看全部问答>

用PADS logic做原理图封装时出现如下问题,请赐教

Error: Signal pin number invalid - Pin number 1 already exists on Gate A, Logical pin 1.Error: Signal pin number invalid - Pin number 2 already exists on Gate A, Logical pin 2.Error: Signal pin number invalid - Pin number 3 alread ...…

查看全部问答>

用MSP430 内置传感器测试温度时为什么在串口上显示的数据不对

我想用430内置传感器测试环境温度的变化,但是为什么在串口上现实的数据不变化呢 ?哪位高人给指点下,下面的程序有什么错误啊?     #include <msp430x14x.h>#define CPU_F ((double)8000000) #define delay_us(x) __delay_cycle ...…

查看全部问答>

STM32的RTC问题 难搞啊

被STM32的RTC搞晕的过来看看本来打算放弃内置的RTC而采用DS1302了,无奈1302的通信太慢,屡次不成功,就把扔在一边的老板子拿来又试了试,这次没用自己原来的程序,在网上又新找了一个,结果程序都不用动的居然就行了··· 芯片是VCT6,晶振是那 ...…

查看全部问答>