一、指令與偽指令:
1、匯編指令是CPU機器指令的助記符,經過編譯后會得到一串01組合的機器碼,可以由CPU讀取執行,
2、偽指令本質不是指令(只是和指令一起寫在代碼中)它是編譯器環境提供的,目的是用來指導編譯程序,經過編譯后偽指令最終不會生成機器碼,在編譯程序中起作用,指導編譯,在整個程序有作用但經過編譯后不存在了,輔助編譯器把指令加工成機器碼,偽指令好像做飯用的工具,而指令像菜米原材料,加工好的飯就是機器嗎,
二、兩種不同風格的ARM指令
1、ARM官方風格:指令一般用大寫,
2、GNU風格的ARM指令:指令用小寫字母,linux常用,
三、ARM指令特點:
1、ldr / str架構:ARM采用RISC架構,CPU本身不能直接讀取記憶體,而需要先將記憶體中的內容加載入CPU中通用暫存器中才能被CPU處理,
(1)、Ldr指令:將記憶體內容加載入通用暫存器,
(2)、Str指令:將暫存器內容存入記憶體空間中,
(3)、Ldr / str組合用來實作CPU和記憶體資料交換訪問記憶體先將記憶體資料讀入CPU的(37個通用暫存器)的某個里,然后處理完,再傳回記憶體,
2、8種尋址方式:
(1)、暫存器尋址:(暫存器之間通信)
暫存器尋址:mov r1, r2把r2里面的內容送到r1里,相當于C語言r1=r2賦值,
立即數尋址:mov r0, #0xFF00 把#0xFF00這個數字放入r0里,相當于C語言的 r0 = 0xFF00賦值,
暫存器移位尋址:mov r0, r1, |s|, #3 把r1里存的數左移3位放入r0中,相當于C語言的r0 = (r1 乘2的三次方),
(2)、暫存器與記憶體通信:
暫存器間接尋址:ldr r1, [ r2 ] 把r2暫存器中存的是一個記憶體地址,把這個地址放的內容讀入r1中,相當于C語言 a = *p,
基址變址尋址:ldr r1, [ r2, #4 ] 把以r2為基地址加4的地址里放的資料讀取r1,相當于C語言: a = *( p + 4 ),
多暫存器尋址:ldmia r1!, { r2 —r7, r12 } r1里是一個記憶體地址,以r1為起始地址依次把r2----r7和r12加載入記憶體里,
堆疊尋址:stmfd sp!, { r2----r7, r10 }從堆疊上訪問多個位元組往暫存器放,壓堆疊,ldmia是彈堆疊,
注意:[ ]代表訪問的是記憶體,
相對尋址死回圈例: .beg flag
flag:
簡化 b.
Flag: 標號類似函式名,用作跳轉,C語言go to就是標號,
3、指令后綴:
(1)、同一指令經常附帶不同后綴,變成不同指令,經常使用的后綴有:B(byte)功能不變,操作長度變為8位,指令位數,
H(half word)功能不變,長度變為16位,
S(signed)功能不變,運算元變為帶符號數,
如:ldr, ldrb(功能不變,指令變為8位) ; ldrh(功能不變指令變為16位); ldrsb(功能不變指令變為帶符號8位); ldrsh(功能不變指令變為16位有符號表示),
S(S標志):功能不變,影響CPSR標志位,如mov后加S會影響CPSR條件位N、Z、C、V,
4、條件執行后綴:
N、Z、C、V 均為CPSR條件標志位,它們的內容可被算識訓邏輯運算的結果所改變,并且可以決定某條指令是否被執行(條件后綴),
例: moveq r0, r1
如果eq后娺成立,則直接執行mov r0, r1這條指令,如果eq不成立本名代碼不執行,類似于C語言if( eq ) r0 = r1;
條件后娺注意2點:
(1)、條件后綴是否成立,不是取決本句代碼,而是取決于這句代碼之前的代碼運行結果,
(2)、條件后綴決定了本句代碼是否被執行,而不會影響上一句和下一句代碼是否被執行,
5、多級指令流水:
ARM匯編為增加處理指令流水的速度,使用多級流水線,下圖為三級流水線作業原理示意圖(S5PV210使用13級流水線,ARM11為8級),
————允許多個操作同時處理,而非順序執行,

注意:PC指向的是取指令的地址,也就是:執行地址+8 = PC
如果從SVC模式中跳轉到IRQ模式,那么回傳地址會保存在IRQ模式下的lr暫存器,也就是保存PC的值,那么再回傳的時候,應該去執行的指令應該是PC - 4處的指令,也就是跳轉之前的正在譯碼的指令 ,
什么是指令流水:在ARM CPU內部有個并行處理器,有取指、解碼、執行三個模塊,在每一個CPU單元這三個模塊都會被執行,比如第一個CPU時鐘周期,第一句代碼被取指,在第2個CPU時鐘周期,第一句代碼被解碼,第二句代碼被同時取指,回圈作業,分時實作并行處理指令,每句代碼經過三個CPU時鐘,但每個CPU時鐘都會有一條指令被執行完成,
流水線過多一但被打斷重新填滿流水線就比較復雜,流水線被打斷:意思是一條流水線加載了一條指令運行到第8步還沒結束,結果跳轉了,因此前面執行的指令都不能用了,到跳轉處重新執行,ARM采用條件預測防打斷,


轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/281762.html
標籤:其他
