arm反汇编.docx
- 文档编号:28276738
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:16
- 大小:273.96KB
arm反汇编.docx
《arm反汇编.docx》由会员分享,可在线阅读,更多相关《arm反汇编.docx(16页珍藏版)》请在冰豆网上搜索。
arm反汇编
在bin文件中,就是一条条的机器指令,每条指令4个字节。
在ADS中打开一个.s文件,选择project->disassemble
可以看到汇编的机器码
汇编代码如下(ADS中的一个例程\ARM\ADSv1_2\Examples\asm\armex.s):
AREAARMex,CODE,READONLY;namethisblockofcode
ENTRY;markfirstinstruction
;toexecute
start
MOVr0,#10;Setupparameters
MOVr1,#3
ADDr0,r0,r1;r0=r0+r1
stop
MOVr0,#0x18;angel_SWIreason_ReportException
LDRr1,=0x20026;ADP_Stopped_ApplicationExit
SWI0x123456;ARMsemihostingSWI
END;Markendoffile
执行project->disassemble后:
**Section#1'ARMex'(SHT_PROGBITS)[SHF_ALLOC+SHF_EXECINSTR+SHF_ENTRYSECT]
Size:
28bytes(alignment4)
start
$a
ARMex
0x00000000:
e3a0000a....MOVr0,#0xa
0x00000004:
e3a01003....MOVr1,#3
0x00000008:
e0800001....ADDr0,r0,r1
stop
0x0000000c:
e3a00018....MOVr0,#0x18
0x00000010:
e59f1000....LDRr1,0x18
0x00000014:
ef123456V4..SWI0x123456
$d
0x00000018:
00020026&...DCD131110
使用UltraEdit看bin文件如下:
可以看到,与上面的一样。
其中MOV的机器码如下(ARM体系结构pdf:
p156):
cond,AL(Always)为0b1110
最后有一个131110不知道是什么意思。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
另一个例子汇编代码如下(ADS中的一个例程\ARM\ADSv1_2\Examples\asm\subrout.s):
AREAsubrout,CODE,READONLY;namethisblockofcode
ENTRY;markfirstinstruction
;toexecute
start
MOVr0,#10;Setupparameters
MOVr1,#3
BLdoadd;Callsubroutine
stop
MOVr0,#0x18;angel_SWIreason_ReportException
LDRr1,=0x20026;ADP_Stopped_ApplicationExit
SWI0x123456;ARMsemihostingSWI
doadd
ADDr0,r0,r1;Subroutinecode
MOVpc,lr;Returnfromsubroutine.
END;Markendoffile
执行project->disassemble后:
**Section#1'subrout'(SHT_PROGBITS)[SHF_ALLOC+SHF_EXECINSTR+SHF_ENTRYSECT]
Size:
36bytes(alignment4)
start
$a
subrout
0x00000000:
e3a0000a....MOVr0,#0xa
0x00000004:
e3a01003....MOVr1,#3
0x00000008:
ebfffffe....BLdoadd;0x18
stop
0x0000000c:
e3a00018....MOVr0,#0x18
0x00000010:
e59f1008....LDRr1,0x20
0x00000014:
ef123456V4..SWI0x123456
doadd
0x00000018:
e0800001....ADDr0,r0,r1
0x0000001c:
e1a0f00e....MOVpc,r14
$d
0x00000020:
00020026&...DCD131110
使用UltraEdit看bin文件如下:
不知道为什么,ADS里面的BLdoadd的机器码和bin中的机器码不一样。
BL的机器指令如下:
0x00000008:
ebfffffe....BLdoadd;0x18
按bin中的机器码,EB000002,1110_1101_0000_0000____0000_0000_0000_0010
会在执行bl指令时的PC后面加上2*4byte,正好跳过3条指令。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
下面这个例子将doadd写到另一个.s文件中。
subrout.s文件:
AREAsubrout,CODE,READONLY;namethisblockofcode
ENTRY;markfirstinstruction
;toexecute
IMPORTdoadd;import
start
MOVr0,#10;Setupparameters
MOVr1,#3
BLdoadd;Callsubroutine
stop
MOVr0,#0x18;angel_SWIreason_ReportException
LDRr1,=0x20026;ADP_Stopped_ApplicationExit
SWI0x123456;ARMsemihostingSWI
END;Markendoffile
fun.s文件:
AREAsubrout,CODE,READONLY;namethisblockofcode
EXPORTdoadd
doaddFUNCTION
ADDr0,r0,r1;Subroutinecode
MOVpc,lr;Returnfromsubroutine.
ENDFUNC
LTORG
END
UE查看bin结果:
可以看出,跳转指令变为跳转3个指令,doadd函数放在了bin的最后。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
这个例子将上面的subrout.s文件改为(工程subroutprj_2F_DCD):
AREAsubrout,CODE,READONLY;namethisblockofcode
ENTRY;markfirstinstruction
;toexecute
IMPORTdoadd;import
start
LDRr0,Param1;Setupparameters
LDRr1,Param2
BLdoadd;Callsubroutine
stop
MOVr0,#0x18;angel_SWIreason_ReportException
LDRr1,=0x20026;ADP_Stopped_ApplicationExit
SWI0x123456;ARMsemihostingSWI
Param1DCD10
Param2DCD3
END;Markendoffile
MOV只能操作reg和立即数
操作内存,MOV要改为LDR
UE查看bin为:
LDRr0,Param1的机器码为:
E59F0010=0111_0101_1001_1111_0000_0000_0001_0000
Rn为R15=PC,Rd=R0,address=16(4*Instruction)+PC
输出的ImageSymbolTable为:
================================================================================
ImageSymbolTable
MappingSymbols
SymValueExecutionRegion
$a0x00000000ER_RO
$d0x00000020ER_RO
其中$a表示ARMCode,$d表示Data
这是整个bin文件的区域分配,从0开始为ARMCode,然后从20开始为Data,其中ARMCode是funsection和subroutsection合在一起的,Data也是两个数据合在一起的(似乎是armlink把inputsection中同一属性的段合并到outputsection中)。
ADS中输出调试信息
ImageMap
Symbol
Sectioncross-reference
在listfile中choose一个文件,比如boot270.txt,可以把信息输出到txt中
下面这个输出是subroutprj_2F_DCD的输出,在arm反汇编.doc里。
================================================================================
ImageSymbolTable
MappingSymbols
SymValueExecutionRegion
$a0x00000000ER_RO
$d0x00000020ER_RO
LocalSymbols
SymbolNameValueOvTypeSizeObject(Section)
E:
\dsparm\pxa270\project\subroutprj_2F_DCD\subrout.s0x00000000Number0subrout.oABSOLUTE
subrout0x00000008ARMCode36subrout.o(subrout)
start0x00000008ARMCode0subrout.o(subrout)
stop0x00000014ARMCode0subrout.o(subrout)
Param10x00000020Data4subrout.o(subrout)
Param20x00000024Data4subrout.o(subrout)
E:
\dsparm\pxa270\project\subroutprj_2F_DCD\fun.s0x00000000Number0fun.oABSOLUTE
fun0x00000000ARMCode8fun.o(fun)
GlobalSymbols
SymbolNameValueOvTypeSizeObject(Section)
BuildAttributes$$ARM_ISAv4$M$PE$A:
L22$X:
L11$S22$~IW$~STKCKD$~SHL$OSPACE0x00000000Number0anon$$obj.oABSOLUTE
doadd0x00000000ARMCode8fun.o(fun)
UE查看bin结果
从bin看到,doadd两条指令放在了bin的最前面,这样
start的值value为0x00000008
fun的值value为0x00000000
start和fun都是ARMCode,是代码的标号label,标号的值代表一个地址,所以start和fun在bin中的地址即为它们的值。
ImageSymbolTable中包含两部分,LocalSymbol和GlobalSymbol,前者在只能在定义的文件中引用,后者可以在整个工程中引用。
在这个工程中后者只有doadd函数。
========================================================================
MemoryMapoftheimage
ImageEntrypoint:
0x00000000
LoadRegionLR_1(Base:
0x00000000,Size:
0x0000002c,Max:
0xffffffff,ABSOLUTE)
ExecutionRegionER_RO(Base:
0x00000000,Size:
0x0000002c,Max:
0xffffffff,ABSOLUTE)
BaseAddrSizeTypeAttrIdxESectionNameObject
0x000000000x00000008CodeRO5*funfun.o
0x000000080x00000024CodeRO1*subroutsubrout.o
ExecutionRegionER_RW(Base:
0x0000002c,Size:
0x00000000,Max:
0xffffffff,ABSOLUTE)
****Nosectionassignedtothisexecutionregion****
ExecutionRegionER_ZI(Base:
0x0000002c,Size:
0x00000000,Max:
0xffffffff,ABSOLUTE)
****Nosectionassignedtothisexecutionregion****
ImageEntrypoint:
0x00000000这句话有点问题?
?
!
!
BaseAddrSizeTypeAttrIdxESectionNameObject
0x000000000x00000008CodeRO5*funfun.o
0x000000080x00000024CodeRO1*subroutsubrout.o
上面这些说明了各段的基地址,长度,类型(code,data),属性(RO,RW),段名,存在的目标文件。
在这里fun放在了subrout的前面,由于armlinker在链接inputsection的时候排序sort是有规则的,先同一属性(RO,RW,RI),然后按名字的字母表顺序。
由于fun和subrout都是RO,所以按名字fun在前面。
-----------------------------------------------------------------
下面以boot270工程为例子分析:
输出的ImageSymbolTable
GlobalSymbols
SymbolNameValueOvTypeSizeObject(Section)
xlli_read_SCR0xa000cea0ARMCode420xlli_LowLev_Init.o(text)
可以看出xlli_read_SCR为ARMCode,是一个标号label,值即为其在bin中的地址,由于设置ROBase为0xA0000000,所以在bin中找0x0000cea0处的指令:
指令为E59F_419C,即为
xlli_read_SCRFUNCTION
;
;InsuretheRDHandPHbitsonPXA27xmustbecleartoenableGPIOpins.
;Theyarestickybitssotheymustbesettoclearthem.
;
ldrr4,=xlli_PMRCREGS_PHYSICAL_BASE
该指令表示(E表示AL,无条件,F为R15=PC,4表示放到R4里,地址为PC+19C=D03C,再加2*4为D044)
0x0000d044处的数据为40F00000,与代码中的数据吻合:
;POWERMANAGERbaseaddressandregisteroffsetsfromthebaseaddress
;
xlli_PMRCREGS_PHYSICAL_BASEEQU0x40F00000
这个数据在ImageSymbolTable中也能找到,在LocalSymbols中:
xlli_PMRCREGS_PHYSICAL_BASE0x40f00000Number0main_Flash.oABSOLUTE
能看到是一个Number,值value为0x40f00000。
这个数据的地址在ImageSymbolTable中也能看到:
MappingSymbols
SymValueExecutionRegion
$d0xa000d044ER_RO
$d表示数据data。
下一条指令:
;Get,andsavethepresentGPIOsettingsfordirectionregisters0,1and2
;
ldrr4,=xlli_GPIOREGS_PHYSICAL_BASE;GettheGPIOregistersbaseaddress
指令为:
E5_9F_4_194
数据的地址为:
PC+194+2*4=D048
数据为:
40E00000,与代码中的定义对应:
;GENERALPURPOSEI/O(GPIO)baseaddressandregisteroffsetsfromthebaseaddress
;
xlli_GPIOREGS_PHYSICAL_BASEEQU0x40E00000
地址0x0000D048在ImageSymbolTable中没有,不过有:
MappingSymbols
SymValueExecutionRegion
$d0xa000d044ER_RO
说明从0xa000d044处开始为许多ROdata
上面的工程只有RO,怎么才能产生RW,RI呢?
MOVE3
LDRE5
ADDE0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- arm 汇编