第一部分 組合語言
組合語言是二進位制指令的文字形式,與二進位制指令是一一對應的關係
(彙編)指令:是機器碼的助記符,經過彙編器編譯後,由cpu執行。
(彙編)偽指令:用來指導指令執行,是彙編器的產物,最終不會生成機器碼。
常用彙編指令:
1、相對跳轉指令:b、bl
這兩條指令的不同之處在於bl指令除了跳轉之外,還將返回位址(bl的下一條指令的位址)
儲存在lr暫存器中,這兩條指令的跳轉範圍是當前指令的前後32mb,它們是位置無關的指令。
2、資料傳送指令:mov,位址讀取偽指令:ldr
mov可以把乙個暫存器的值賦給另乙個暫存器,也可以把乙個常量賦值給暫存器。
mov r1, r2
mov r1, #4096
ldr本意為「大範圍的位址讀取偽指令」。
3、記憶體訪問指令:ldr、str、ldm、stm
ldr 從記憶體中讀取資料到暫存器;
ldr r1, [r2, #4] //將位址為r2+4的記憶體單元的資料讀取到r1中。
ldr r1, [r2] //將位址為r2的記憶體單元中的資料讀取到r1中。
ldr r1, [r2], #4 //將位址為r2的記憶體單元中的資料讀取到r1中,然後r2=r2+4。
str 將暫存器的資料存放在記憶體中;
str r1, [r2, #4] //將r1中的資料儲存到位址為r2+4的記憶體單元中。
str r1, [r2] //將r1中的資料儲存到位址為r2的記憶體單元中。
str r1, [r2], #4 //將r1中的資料儲存到位址為r2的記憶體單元中,然後r2=r2+4。
ldm和stm屬於批量記憶體訪問指令,只用一條指令就可以讀取多個資料。
4、加減指令:add、sub
add r1, r2, #1 //表示r1=r2+1
sbb r1, r2, #1 //表示r1=r2-1
5、程式狀態暫存器訪問指令:msr、mrs
arm處理器有乙個程式狀態暫存器(cpsr),它用來控制處理器的工作模式,設定中斷的總開關。
msr cpsr, r0 //複製r0到cpsr中
mrs cpsr, r0 //複製cpsr到r0中
6、其它偽指令
.extern main //".extern"定義乙個外部符號(可以是變數,也可以是函式),改**表示
本檔案中引用的main是乙個外部函式
.text //表示下面的語句都屬於**段
.global _start //將本檔案中的某個程式標號定義為全域性的,比如該**表示_start是個全域性函式。
_start:
指令1、8種定址方式
暫存器定址
立即定址
暫存器移位定址
暫存器間接定址
基址定址
多暫存器定址
堆疊定址
相對定址
2、6類指令:
資料處理指令:
資料傳輸指令, mov mvn
算術指令, add sub rsb adc sbc rsc
邏輯指令, and orr eor bic
比較指令, cmp cmn tst teq
乘法指令, mul mla umull umlal smull smlal
前導零計數。
程式狀態暫存器訪問指令:mrs msr
跳轉指令: b bl bx
訪存指令: ldr/str ldm/stm swp
異常中斷產生指令: swi
協處理器指令: mcr mrc
3、ldr/str架構
ldr ldrb ldrh ldrsb ldrsh
str strb strh strsb strsh
ldm/stm
swp swpb
4、指令字尾:b h s
5、條件字尾:
eq/ne:等於/不等於(equal / not equal)
hs/lo:無符號數高於或等於/無符號數小於(higher or same/lower)
hi/ls:無符號數高於/無符號數低於或等於(higher/lower or same)
ge/lt:有符號數大於或等於/有符號數小於(greater or equal/less than)
gt/le:有符號數大於/有符號數小於或等於(greater than/less or equal)
mi/pl:負/非負
vs/vc:溢位/不溢位(overflow set / overflow clear)
cs/cc:進製/無進製(carry set / carry clear
6、ldm/stm與棧的操作
ldmfd/stmfd
ldmia/stmia
7、合法、非法立即數
偽指令(gnu彙編偽指令)
arm匯程式設計序常用的編譯環境有2個:armasm(arm官方彙編格式,windows中常用,如ads、mdk,指令一般用全大寫)和gnu arm asm(開源社群常用,如uboot、linux,指令一般全小寫)。
@開頭的之後部分是注釋(@不一定非在行首,類似於c中的//)
#開頭的整行注釋。一般整行注釋用#而前面是**後面寫注釋的用@
:結尾的是標號
標號+f,表示在引用處向前找;標號+b,表示在引用的地方向後查詢; 區域性標號一般用數字1、2
點號「.」在彙編中表示當前指令的位址
直接運算元字首用#或$
.global xx(有時寫為.globl) 給符號xx外部鏈結屬性,一般為了在別的檔案中引用這個符號
.section .mysection 自定義資料段,段名為「.mysection」
.align 2 4位元組對齊
.balign/.balignw/.balignl 位元組/2位元組/4位元組填充
注意.align數字是2的n次方,而.balign數字是直接數字
.ascii "string..." 定義乙個ascii字串
.byte .short .long .word .quad .float .string .ascii
.equ .set 賦值語句
.end 檔案結束
.include 標頭檔案包含
.if .else .endif 條件編譯,類似於c語言的#if #elif #endif
.arm / .code32 以arm指令格式編譯
.thumb / .code16 以thumb指令格式編譯
nopldr
adr巨集定義
.macro macroname
巨集體.endm
第二部分:**流水線架構
組合語言常用指令
上次說到組合語言十分重要,所以又為了避免忘記,貼上一些常用彙編指令 mov 指令範例 mov r1,8 mov r2,r1 mov r3,10 mvn 傳送取反賦值 mvn r1,0b10 mvn r2,5 mvn r3,r1 sub 減法 目的暫存器 被減數 不能是立即數 減數 mov r2,4 ...
組合語言 彙編指令
功能 用來進行資料傳輸。以 mov a,b 為例,相當於a b。具有以下形式 mov 暫存器,資料 mov 暫存器,暫存器 mov 暫存器,記憶體單元 mov 記憶體單元,暫存器 mov 段暫存器,暫存器 功能 用來做加法。以 add a,b 為例,相當於a a b。具有的形式,和 mov 一樣。功...
組合語言 傳送指令
一.傳送指令 1.通用傳送指令mov mov dst,src 將src傳送到dst中 dstsrc操作位數 mem reg imm8 16 mem reg seg reg8 16 reg seg mem 8 16 mem reg seg 8 16 imm是立即數,reg是暫存器,seg是段暫存器,m...