我的逆向工程之路 - 匯編基礎(chǔ)

寄存器弄抬、內(nèi)存氮昧、和棧

  1. 寄存器:
  CPU 自帶的變量蓄愁。數(shù)量有限娶桦。速度最快贾节。存放的是全局變量。
  如果數(shù)量較多衷畦,就需要放到內(nèi)存中栗涂。
  一些寄存器:   
       CR0, CR2, CR3  (控制寄存器) (如:CR0的作用是切換實(shí)模式和保護(hù)模式)
       D0, D1, D2, D3, D6和D7  (調(diào)試寄存器)(作為調(diào)試器的硬件支持來設(shè)置條件斷點(diǎn))
       TR3, TR4, TR5, TR6 和TR? (測試寄存器)(于某些條件測試)
       CS  代碼段
       DS  數(shù)據(jù)段
       ES  附加段
       SS  堆棧段
  1. 內(nèi)存:
存放的也是全局變量。
  1. 棧:
  存放局部本地變量祈争。
  也是一個(gè)內(nèi)存區(qū)域斤程,只有擁有棧的特點(diǎn): 先進(jìn)后出。ARM的棧是滿遞減,棧低內(nèi)存地址最小忿墅。

實(shí)用寄存器 詳解:

 SP  Stack Pointer 保存棧的棧底地址扁藕,稱為棧地址。
     實(shí)際操作中疚脐,棧地址會不斷變化亿柑,但是一塊代碼里面 棧地址是不變的。
 PC  Program Counter 存放下一條指令的地址
     一般情況下棍弄,處理器執(zhí)行完一條指令后,將PC加1.順序執(zhí)行
 LR  Link Register 連接寄存器呼畸,
     一是用來保存子程序返回地址;
     二是當(dāng)異常發(fā)生時(shí)卧须,LR中保存的值等于異常發(fā)生時(shí)PC的值減4(或者減2)
     因此在各種異常模式下可以根據(jù)LR的值返回到異常發(fā)生前的相應(yīng)位置繼續(xù)執(zhí)行
 PSR Program Status Register 程序狀態(tài)寄存器。
     程序的條件判斷準(zhǔn)則(flag), 如:結(jié)果是否為0 | 負(fù)數(shù) | 有進(jìn)位 | 溢出

指令解讀

預(yù)備知識: { }表示可選項(xiàng)瞬痘, [ ]表示間接尋址故慈, #立即數(shù)直接尋址板熊,@間接尋址

  1. 數(shù)據(jù)操作指令:

基本格式: op { cond }{ s } Rd, Rn, Op2

  op 指令, cond條件津辩, s設(shè)置flag, op2可以是寄存器容劳、被移位的寄存器或立即數(shù)喘沿。
(如:ADD R0,R1,#5 ;R0=R1+5   #5為立即數(shù))

  cond條件: 
EQ    結(jié)果為0      EQual to 0 
NE    結(jié)果不為0     Not Equal to 0 
CS    有進(jìn)位或借位   Carry Set 
HS    同CS         CS unsigned Higher or Same 
CC    沒有進(jìn)位或借位 Carry clear 
LO    同CC         unsigned LOwer 
MI    結(jié)果小于0 MInus 
PL    結(jié)果大于0 PLus 
VS    溢出   oVerflow Set 
VC    無溢出  oVerflow Clear 
HI    無符號比較大于         unsigned HIgher 
LS    無符號比較小于等于      unsigned Lower or Same  
GE    有符號比較大于等于      signed Greater than or Equal 
LT    有符號比較小于    signed Less Than 
GT    有符號比較大于    signed Greater Than 
LE    有符號比較小于等于 signed Less than or Equal 
AL    無條件 Always,默認(rèn)

  s的四種flag:
N  negative 負(fù)數(shù): 結(jié)果小于0 則置1竭贩,否則置0;
Z  zero 零:       結(jié)果是0則置1窄赋, 否則置0;
C  carry 位移:     產(chǎn)生進(jìn)位則置1忆绰,否則0可岂,減操作則產(chǎn)生借位則置0,否則置1...
V  overflow 溢出:  操作有導(dǎo)致溢出缕粹,則置1纸淮, 否則置0亚享。(有符號數(shù)運(yùn)算結(jié)果萎馅,無符號數(shù)溢出用C)

算術(shù)操作:

ADD R0, R1, R2;    R0=R1+R2
ADC R0, R1, R2;    R0=R1+R2 + C(carry)
SUB R0, R1, R2;    R0=R1-R2 
SBC R0, R1, R2;    R0=R1-R2 - !C 
RSB R0, R1, R2;    R0=R2-R1 
RSC R0, R1, R2;    R0=R2-R1 - !C

邏輯操作:

AND R0, R1, R2;    R0 = R1 & R2
ORR R0, R1, R2;    R0 = R1 | R2
EOR R0, R1, R2;    R0 = R1 ^ R2 
BIC R0, R1, R2;    R0 = R1 &~ R2
MOV R0, R1;        R0 = R1 
MVN R0, R1;        R0= ~ R1

位移操作:  (如:ADD R0,R1,R2,LSL#5 ;R0=R1+R2左移5位)
LSL 邏輯左移糜芳,
LSR 邏輯右移,
ASR 算術(shù)右移峭竣,
ROR 循環(huán)右移

比較操作:

CMP R1, R2   執(zhí)行  R1 - R2,并依結(jié)果設(shè)置flag晃虫,
CMN R1, R2   執(zhí)行  R1 + R2,并依結(jié)果設(shè)置flag,
TST R1, R2   執(zhí)行  R1 & R2,并依結(jié)果設(shè)置flag哲银, 
TEQ R1, R2   執(zhí)行  R1 ^ R2,并依結(jié)果設(shè)置flag,

乘法操作:

MUL R4, R3, R2;       R4 = R3 * R2
MLA R4, R3, R2, R1;   R4 = R3 * R2 + R1
  1. 內(nèi)存操作指令:

基本格式:

op {cond} {type} Rd, [Rn, Op2]
  Rn 是基地址寄存器滥比,用于存放基地址。cond 和上面的一樣做院。

  type的四種數(shù)據(jù)類型 (不指定type,則是默認(rèn)數(shù)據(jù)類型word)
  B (unsigned Byte)     無符號byte键耕,執(zhí)行時(shí)擴(kuò)展到32位,以0填充
  SB (signed Byte)      有符號byte村视,僅用于LDR指令,執(zhí)行時(shí)擴(kuò)展到32位蚁孔,以符號位填充
  H (unsigned Halfword) 無符號halfword讥蟆,執(zhí)行時(shí)擴(kuò)展到32位,以0填充
  SH (signed Halfword)  有符號halfword瘸彤,僅用于LDR指令,執(zhí)行時(shí)擴(kuò)展到32位,以符號位填充

ARM內(nèi)存操作基礎(chǔ)指令只有兩個(gè):
LDR: (Load Register)將數(shù)據(jù)從內(nèi)存中讀出來玻靡,存到寄存器中中贝。

  LDR Rt, [Rn {, #offset}];   Rt = *(Rn {+offset}),  { }代表可選
  LDR Rt, [Rn, #offset]!;     Rt = *(Rn + offset);  Rn = Rn + offset
  LDR Rt, [Rn], #offset;      Rt = *Rn; Rn = Rn + offset

STR: (Store Register)將數(shù)據(jù)從寄存器中讀出來,存到內(nèi)存中邻寿。

  STR Rt, [Rn {, #offset}];  *(Rn {+offset}) = Rt
  STR Rt, [Rn, #offset]!;    *(Rn {+offset}) = Rt; Rn = Rn + offset
  STR Rt, [Rn], #offset;     *Rn = Rt; Rn = Rn + offset

其變種:LDRD 和 STRD 還可以操作雙字(Doubleword),即一次操作兩個(gè)寄存器
基本格式:

op {cond} Rt, Rt2, [Rn {, #offset}]

用法和上面的類似:

  LDRD R4, R5, [R9, #offset];     R4 = *(R9 + offset); R5 = *(R9 + offset +4)

  STRD R4, R5, [R9, #offset];     *(R9 + offset) = R4; *(R9 + offset + 4) = R5

除了基礎(chǔ)指令,還有兩個(gè)塊傳輸指令(一次操作多個(gè)寄存器):
基本格式:

op {cond}{mode} Rd {!}, reglist
Rd 是基址寄存器誊涯, 蒜撮!指定Rd變化后的值是否寫會Rd, reglist是一系列寄存器 
(如:{R4-R6, R8} 就表示R4,R5,R6, R8寄存器) "{ }"  "-"  "," 

  mode 指定Rd的4種變化規(guī)律:
IA  increment after,  每次傳輸后增加Rd的值段磨;
IB  increment before, 每次傳輸前增加Rd的值;
DA  decrement after, 每次傳輸后減少Rd的值苹支;
DB decrement before, 每次傳輸前減少Rd的值。

  LDM  Load multiple   Rd開始連續(xù)的內(nèi)存數(shù)據(jù)存入reglist中琉用。
  STM  Store multiple  吧reglist中的值存入 從Rd開始的連續(xù)地址中策幼。
  
  LDMIA R0, {R4 - R6};   表示吧R0開始的內(nèi)存里面的值 依次存入寄存器中。

可以發(fā)現(xiàn) LDM特姐、STM 和 LDR黍氮、STR 的格式是相反的。
LDM 和 STM 是: op 內(nèi)存地址 寄存器
LDR 和 STR 是: op 寄存器 內(nèi)存地址

  1. 分支指令:

分為無條件分支 和 條件分支兩種沫浆。
無條件分支:

B   Label;   PC = Label, go to 的意思,直接跳到Label處執(zhí)行专执。
BL  Label;   LR = PC - 4; PC = Label
BLX Label;   Label 后面的指令必須為THUMB指令  LR = PC - 4; PC = Label;
BX  Rd;      PC = Rd 并切換指令集(THUMB 或 ARM)

條件分支:

在該指令前,會有一條數(shù)據(jù)操作指令來設(shè)置flag攀痊,分支指令根據(jù)flag的值來決定代碼走向
CMP  R0, 0;  (比較指令)如果R0 == 0 則 Z = 1, 否則 Z = 0
BNE  Label;  (B  + NE 如下)Z == 0 則跳到Label處執(zhí)行

  cond flag
EQ   Z=1
NE   Z=0
CS   C=1
HS   C=1
CC   C=0
LO   C=0
MI   N=1
PL   N=0
VS   V=1
VC   V=0
HI   C=1&Z=0 LS C=0|Z=1 GE N=V
LT   N!=V
GT   Z=0&N=V LE Z=1|N!=V
  1. THUMB指令:

THUMB 指令是ARM指令的子集苟径,均為16位,在16位的數(shù)據(jù)總線上的傳輸效率更高蟆盐,比ARM指令更節(jié)省空間。
特點(diǎn):

  1. 除了B指令外舱禽,所有的指令均無法條件執(zhí)行恩沽。
  2. 桶式位移無法結(jié)合其他指令執(zhí)行。
  3. 大多數(shù)指令只能使用R0 ~ R7 這八個(gè)寄存器罗心。
      (例外:ADD、MOV渤闷、CMP 可以將 R8~R15 作為操作數(shù)使用。
            LDR狼电、STR 可以使用 PC 或 SP 寄存器
            PUSH 可以使用 LR     
            POP 可以使用 PC
            BX 可以使用所有寄存器)
  4. 指令數(shù)量減少弦蹂,如:乘法中只有MUL保留肩碟,其他都被精簡了凸椿。
  5. 所有的指令默認(rèn)附帶s,即所有的THUMB指令都會設(shè)置flag髓抑。
  6. 立即數(shù) 和 第二操作數(shù)使用受限。 除了位移指令吨拍、ADD网杆、SUB 其他指令形式都是 "op Rd, Rm"
  7. 不支持?jǐn)?shù)據(jù)回寫握爷,即{!} 不可用了。

后記:

  1. 傳遞參數(shù)和返回值:
    函數(shù)的前四個(gè)參數(shù) 放在 R0 ~ R3 寄存器中新啼,其他參數(shù)放在棧中刹碾。 返回值放在R0中。
  2. 特殊用途寄存器:
R0 ~ R3   傳遞參數(shù)與返回值迷帜;
R7     幀指針,指向母函數(shù)與被調(diào)用子函數(shù)在棧中的交界戏锹;
R9     在iOS 3.0 以前被系統(tǒng)保留;
R12    內(nèi)部過程調(diào)用寄存器荠察,dynamic linker 會用到它奈搜;
R13    SP寄存器;
R14    LR寄存器馋吗,保存返回值;
R15    PC寄存器
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脚翘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子来农,更是在濱河造成了極大的恐慌蛇摸,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赶袄,死亡現(xiàn)場離奇詭異抠藕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)敬辣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溉跃,“玉大人,你說我怎么就攤上這事嵌牺。” “怎么了逆粹?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵炫惩,是天一觀的道長。 經(jīng)常有香客問我他嚷,道長,這世上最難降的妖魔是什么蟋字? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任扭勉,我火速辦了婚禮,結(jié)果婚禮上涂炎,老公的妹妹穿的比我還像新娘。我一直安慰自己唱捣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布赂毯。 她就那樣靜靜地躺著拣宰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巡社。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天肥荔,我揣著相機(jī)與錄音绿渣,去河邊找鬼燕耿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛誉帅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吧凉,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼踏志,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了针余?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忍级,失蹤者是張志新(化名)和其女友劉穎伪朽,沒想到半個(gè)月后轴咱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烈涮,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年戈稿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讶舰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡般甲,死狀恐怖庐舟,靈堂內(nèi)的尸體忽然破棺而出欣除,到底是詐尸還是另有隱情挪略,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布挽牢,位于F島的核電站,受9級特大地震影響禽拔,放射性物質(zhì)發(fā)生泄漏室叉。R本人自食惡果不足惜睹栖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一野来、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧曼氛,春花似錦令野、人聲如沸舀患。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽低匙。三九已至,卻和暖如春努咐,著一層夾襖步出監(jiān)牢的瞬間殴胧,已是汗流浹背渗稍。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工团滥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拱燃。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓力惯,卻偏偏與公主長得像召嘶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子弄跌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 原文地址 一尝苇、Hopper中的ARM指令A(yù)RM處理器就不多說了,ARM處理器因?yàn)榈凸牡仍蚩妨铮源蟛糠忠苿?dòng)設(shè)備上...
    顏值不夠才華來湊閱讀 1,141評論 0 4
  • 算術(shù)和邏輯指令A(yù)DC : 帶進(jìn)位的加法(Addition with Carry)ADC{條件}{S} <dest...
    luffier閱讀 3,758評論 0 3
  • .global/.def/.ref Identify Global SymbolsSyntax .global s...
    sgy1993閱讀 2,660評論 0 0
  • ARM 匯編指令學(xué)習(xí):[1]ARM指令尋址方式 一非竿、數(shù)據(jù)處理指令的操作數(shù)的尋址方式 通常具有下面3種格式: 1、 ...
    techping閱讀 1,572評論 0 2
  • -1- 床頭的手機(jī)顯示著時(shí)間是凌晨3點(diǎn)零2分侮东,這已經(jīng)是我連續(xù)第六天從夢中驚醒了豹芯。 “咯吱——”突然悄雅,閣樓傳來搖椅搖...
    車明靜閱讀 2,236評論 9 7