- 論壇徽章:
- 0
|
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
st1\:*{behavior:url(#ieooui) }
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
Arm匯編實(shí)例解析
源代碼
int global=19;
int main(int argc,char **argv)
{
int i, j;
i=1;
j=2;
if(j>2){
global=j;
} else {
global=i;
}
return 0;
}
編譯:
Gcc test_arm.c
Objdump后的結(jié)果
Objdump –CSDR >obj
Cat obj
00008350 :
8350: e1a0c00d
mov ip, sp
/*把進(jìn)入main之前的棧指針保存*/
8354: e92dd800
stmdb sp!, {fp, ip, lr, pc}
/*把fp也即是棧底指針,ip(此時(shí)指向sp)保存 ,lr也就是返回地址保存,pc當(dāng)前指令地址保存(為實(shí)際的值加8)*/
8358: e24cb004 sub fp, ip, #4 ; 0x4
/*fp=ip-4,也就是說(shuō)fp此刻指向的地方是屬于新的函數(shù)的棧底就是上一個(gè)函數(shù)的棧指針下面*/
835c:
e24dd010 sub sp, sp, #16 ; 0x10
/*sp往下漲16個(gè)字節(jié),也就是4個(gè)字長(zhǎng)*/
8360: e50b0010 str r0, [fp, #-16]
/*把r0的內(nèi)容放在剛長(zhǎng)出來(lái)的空間里面的第一個(gè)*/
8364: e50b1014 str r1, [fp, #-20]
/*把r1的內(nèi)容放在r0下面,這都是在棧里*/
8368: e3a03001 mov
r3, #1 ; 0x1
/*把1放在r3里面,其實(shí)就是i*/
836c:
e50b3018 str r3, [fp, #-24]
/*把i的值1放在開辟出來(lái)的四個(gè)字長(zhǎng)的第三個(gè)空間里面*/
8370: e3a03002 mov r3, #2
; 0x2
/*把j的值放在r3里面*/
8374: e50b301c str r3,
[fp, #-28]
/*把r3的值2放在了開辟出來(lái)的四個(gè)字長(zhǎng)的空間里面最后一個(gè)*/
8378: e51b301c ldr r3,
[fp, #-28]
/*再把剛放進(jìn)去的東西,取出來(lái)放在r3里面*/
837c:
e3530002 cmp r3, #2 ; 0x2
/*和2比較*/
8380: da000003 ble 8394
/*如果小于==就跳轉(zhuǎn)到8394*/
8384: e59f2020 ldr
r2, [pc, #32] ; 83ac
/*把全局的那個(gè)變量global的值取到r2上*/
8388: e51b301c ldr r3,
[fp, #-28]
/*把四個(gè)字長(zhǎng)的空間里面最后一個(gè)放到r3寄存器里面*/
838c:
e5823000 str r3, [r2]
/*把j的值存在r2所在的空間也就是global變量的地方*/
8390: ea000002 b 83a0 main+0x50>
/*跳轉(zhuǎn)到83a0*/
8394:
e59f2010 ldr r2, [pc, #16] ; 83ac
/*把83ac的地址放到r2寄存器*/
8398: e51b3018 ldr r3, [fp, #-24]
/*把i的值放在r3寄存器*/
839c:
e5823000 str r3, [r2]
/*把i的值放到global變量*/
83a0: e3a00000 mov r0, #0
; 0x0
/*把r0設(shè)為0*/
83a4: e24bd00c sub sp,
fp, #12 ; 0xc
/*sp=fp-12,這樣的話,sp就指向了先前入棧的時(shí)候fp所在的地址*/
83a8:
e89da800 ldmia
sp, {fp, sp, pc}
/*這樣的話再把sp所在的內(nèi)容出棧,把以前的fp送會(huì)到fp,把以前的ip送給sp,把以前的返回地址送回給了pc,這樣的話,下次執(zhí)行的時(shí)候就直接跳轉(zhuǎn)到這個(gè)pc地址,也就是調(diào)用這個(gè)函數(shù)的時(shí)候設(shè)好的返回地址*/
83ac: 0001055c andeq
r0, r1, ip, asr r5
/*這里其實(shí)就是那個(gè)全局的global所在的地址,而不是一個(gè)指令*/
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u2/67984/showart_2122441.html |
|