當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]匯編指令和偽匯編指令匯編指令:CPU指令的助記符偽匯編指令:本質(zhì)上不是指令,是編譯器環(huán)境提供的,目的是用來(lái)指導(dǎo)編譯過(guò)程,經(jīng)過(guò)編譯后偽指令最終不會(huì)生成機(jī)器碼ARM匯編的特點(diǎn)ARM匯編的特點(diǎn)1:LDR/STR架構(gòu)ARM采用RI

匯編指令和偽匯編指令

匯編指令:CPU指令的助記符
偽匯編指令:本質(zhì)上不是指令,是編譯器環(huán)境提供的,目的是用來(lái)指導(dǎo)編譯過(guò)程,經(jīng)過(guò)編譯后偽指令最終不會(huì)生成機(jī)器碼

ARM匯編的特點(diǎn)ARM匯編的特點(diǎn)1:LDR/STR架構(gòu)

ARM采用RISC架構(gòu),CPU本身不能直接讀取內(nèi)存(CISC結(jié)構(gòu)的可以直接讀取內(nèi)存),而需要先將內(nèi)存中內(nèi)容載入CPU中通用寄存器才能被CPU執(zhí)行。
ldr (load register) 將內(nèi)存內(nèi)容加載進(jìn)入通用寄存器
str (store register) 將寄存器內(nèi)容存入內(nèi)存空間

ARM匯編的特點(diǎn)2:8種尋址方式類別示例寄存器尋址mov r1, r2立即尋址mov r0, #0xFF00}寄存器移位尋址mov r0, r1, lsl #3 @(r0=r1<<3)寄存器間接尋址ldr r1, [r2]基址變址尋址ldr r1,[r2,#4] @r1 = r2+4多寄存器尋址ldmia r1!,{r2-r7,r12}堆棧尋址stmfd sp!, {r1-r7,lr}相對(duì)尋址beq flagARM匯編的特點(diǎn)3:指令后綴

同一指令經(jīng)常附帶不同后綴,變成不同的指令。經(jīng)常使用的后綴有:

后綴功能B (byte)功能不變,操作長(zhǎng)度變?yōu)?位H (half word)功能不變,長(zhǎng)度變?yōu)?6位S (signed)功能不變,操作數(shù)變?yōu)橛蟹?hào) 如 ldr ldrb ldrh ldrsb ldrshS (S標(biāo)志)功能不變,影響CPSR標(biāo)志位 如 mov和movsARM匯編的特點(diǎn)3:條件執(zhí)行后綴


如果后綴條件滿足才執(zhí)行。

例如:
mov r0, r1 @r0 = r1
moveq r0,r1 @ if(eq) r0 =r1

條件后綴執(zhí)行注意:條件后綴是否成立,不是取決于本句代碼,而是取決于這句代碼之前的代碼運(yùn)行后的結(jié)果。

ARM匯編的特點(diǎn)4:多級(jí)指令流水線

S5PV210使用13級(jí)流水線。PC指向正被取值的指令,而非正在執(zhí)行的指令。

數(shù)據(jù)處理指令數(shù)據(jù)傳輸指令

mov (move)

movr1,r0@兩個(gè)寄存器之間數(shù)據(jù)傳遞r1=r0movr1,#0xFF@將立即數(shù)賦值給寄存器r1=0xFF

mvn 用法和mov一樣,區(qū)別是mvn是按位取反后傳遞

r1=0xFF,執(zhí)行movr0,r1后r0=0xFF執(zhí)行mvnr0,r1后r0=0xffffff00
算術(shù)指令

add 加法指令add r2, r0, r1 @(r2 = r0+r1)
sub 減法指令sub r2, r0, r1 @(r2 = r0 - r1)
rsb 逆向減法指令
adc 帶進(jìn)位加法指令
sbc 帶借位減法指令
rsc 帶借位的逆向減法指令

邏輯指令

and 邏輯與
orr 邏輯或
eor 邏輯異或
bic 位清除指令 (bic r0, r1, #0x1F @將r1中的數(shù)的bit0到bit4清零后賦值給r0 0x1F = 0001 1111)

比較指令

cmp cmp r0, r1 @(r0 - r1 = 0?)
cmn cmn r0, r1 @(r0 + r1 = 0?)
tst tst r0, 0xf @測(cè)試r0的bit0-bit3是否全為0
teq teq r0,r1, @P = r0 EOR r1
比較指令不用后加S 就能影響CPSR中的標(biāo)志位。

乘法指令

mvl mla umull umlal smull smlal 都不常用,這里只作為知識(shí)點(diǎn)羅列。

前導(dǎo)零計(jì)數(shù)

clz 返回操作數(shù)二進(jìn)制編碼中第一個(gè)1前0的個(gè)數(shù)

CPSR訪問指令

mrs & msr

mrs 用來(lái)讀psr (cpsr&spsr)
msr 用來(lái)寫psr

mrs r0, cpsr 將cpsr的值讀入到r0中
……………… 處理r0的值
msr cpsr, r0 將r0的值寫入到cpsr中

cpsr : 程序狀態(tài)寄存器,CPU中只有一個(gè),記錄程序運(yùn)行狀態(tài)
spsr:CPU中有五個(gè),分別在五種異常模式下,作用是從普通模式進(jìn)入異常模式時(shí),用來(lái)保存之前普通模式下的cpsr的,在返回普通模式時(shí)恢復(fù)原來(lái)的cpsr。

跳轉(zhuǎn)指令

b & bl &bx

b 直接跳轉(zhuǎn)
bl (branch and link) 跳轉(zhuǎn)前把返回地址存在lr寄存器中,以便返回。
bx 跳轉(zhuǎn)同時(shí)切換到ARM模式,一般用于異常處理的跳轉(zhuǎn)。

訪存指令

ldr/srt & ldm/stm & swp

單個(gè)字/半字/字節(jié)訪問 ldr/str
多字批量訪問 ldm/stm
swp r1, r2, [r0] 內(nèi)存和寄存器交換指令,將r0所指向內(nèi)存中的數(shù)據(jù)寫入r1,并將r2中的數(shù)據(jù)寫入到r0所指向的內(nèi)存。
swp r1, r1, [r0] 互換

軟中斷指令

swi (software interrupt) 用來(lái)實(shí)現(xiàn)操作系統(tǒng)中的系統(tǒng)調(diào)用。

匯編中的立即數(shù)

ARM指令都是32位,除了指令標(biāo)記和操作標(biāo)記外,本身只能附帶很少位數(shù)的立即數(shù),因此立即數(shù)有合法和非法之分。

合法立即數(shù):經(jīng)過(guò)任意位數(shù)的移位后非零部分可以用8位標(biāo)識(shí)的即為合法立即數(shù)(非零部分少于等于8位,0x000000ff 是合法立即數(shù),0x00ff0000是合法立即數(shù),0xf000000f循環(huán)移位之后仍然是合法立即數(shù),0x000001ff是非法立即數(shù))

協(xié)處理器以及協(xié)處理器指令什么是協(xié)處理器

Soc內(nèi)部另一處理核心,協(xié)助CPU實(shí)現(xiàn)某些功能,被主CPU調(diào)用執(zhí)行一定的任務(wù)。CP15 (cooperation processor)
協(xié)處理器和MMU、cache、TLB等處理有關(guān),功能上和操作系統(tǒng)的虛擬地址映射、cache等的管理有關(guān)。

協(xié)處理器訪問指令

mcr & mrc

mrc 用于讀取CP15中的寄存器
mcr 用于寫CP15中的寄存器

Rd:ARM的普通寄存器,不能是r15/pc
Crn:cp15的寄存器,合法值為c0 - c15
Crm:cp15的寄存器,一般均為c0
mrc p15, 0, r0, c1, c0, 0
mcr p15, 0, r0, c1, c0, 0

ldm/stm與棧的處理

ldr/str每周期只能訪問4個(gè)字節(jié)內(nèi)存,如果需要批量讀取,寫入內(nèi)存時(shí)太慢,這個(gè)時(shí)候就要用ldm/stm (load register mutiplt / store register mutiplt)

多寄存器訪問舉例
stmia sp, {r0-r12}

將r0存入sp指向的內(nèi)存處,然后地址+4,將r1存入內(nèi)存,然后地址再+4……直到將r12內(nèi)容存入內(nèi)存。
棧類型

空棧:棧指針指向空位,每次存入數(shù)據(jù)后,sp+4
滿棧:棧指針指向滿位,每次存入數(shù)據(jù)時(shí),先sp+4然后再存入數(shù)據(jù)
增棧:棧指針移動(dòng)時(shí)向地址增加的方向移動(dòng)
減棧:棧指針移動(dòng)時(shí)向地址減小的方向移動(dòng)
因此有四種棧類型:空增棧,空減棧,滿增棧,滿減棧。

八種后綴后綴意義ia (increase after)先傳輸,再地址+4ib (increase before)先地址+4,再傳輸da (decrease after)先傳輸,再地址-4db (decreade before)先地址-4,再傳輸fd (full decrease)滿遞減棧ed (empty decrease)空遞減棧fa滿遞增棧ea空遞增棧

操作棧的時(shí)候使用相同的后綴,就會(huì)避免出錯(cuò)。

!的作用

ldmia r0, {r2-r3} @把r0指向的內(nèi)存中的數(shù)據(jù)讀入到r2中,然后內(nèi)存地址+4再將+4后地址中的數(shù)據(jù)讀入到r3中。指令執(zhí)行完畢后r0中的值不變。
ldmia r0!, {r2-r3} @把r0指向的內(nèi)存中的數(shù)據(jù)讀入到r2中,然后內(nèi)存地址+4再將+4后地址中的數(shù)據(jù)讀入到r3中。指令執(zhí)行完畢后r0中的值變化。

感嘆號(hào)的作用就是r0的值在ldm過(guò)程中發(fā)生的增加或者減小最后寫會(huì)到r0中。

^的作用

ldmfd sp!, {r0-r6, pc}
ldmfd sp!, {r0-r6, pc}^
^:在目標(biāo)寄存器中有pc時(shí),會(huì)同時(shí)將spsr寫入到cpsr,一般用在異常返回的時(shí)候。

GNU匯編偽指令

偽指令和具體的編譯器相關(guān),我們使用GNU工具鏈,因此學(xué)習(xí)GNU環(huán)境下達(dá)匯編偽指令。

GNU匯編中的一些符號(hào)

@ 行注釋,可以在指令后邊也可以在行首
: 以冒號(hào)結(jié)束的是標(biāo)號(hào)
. 點(diǎn)號(hào)表示當(dāng)前指令的地址
立即數(shù)前面加?;蛘?,表示這是個(gè)立即數(shù)

常見的gnu匯編偽指令偽指令意義.globl _start給_start外部鏈接屬性.section .text指定當(dāng)前為代碼段.ascii .byte .short .long .word .quad .float .string定義數(shù)據(jù).align 4以16(2^4)字節(jié)內(nèi)存地址對(duì)齊.balignl 16,0xABCDEF16字節(jié)對(duì)齊填充.equ類似于C中的宏定義

.end匯編文件的結(jié)束,不加無(wú)所謂.include頭文件包含.arm或者.code32聲明以下的代碼為arm指令不是thumb指令.thumb或者.code16聲明以下的代碼為thumb指令

ldr大范圍的地址加載指令adr小范圍的地址加載指令adrl中等范圍的地址加載指令nop空操作

AAAA:.word 0xAABBFF 類似于C語(yǔ)言的 int AAAA = 0xAABBFF;

.balignl 16, 0xABCDEF 對(duì)齊+填充,b表示位填充,最后的l表示long,16表示16字節(jié)對(duì)齊,0xABCDEF表示填充的原料。

0x00000008 : .balignl 16, 0xABCDEF,

0x0000000C: 0xABCDEF

0x00000010: 下一條指令

ARM中有一個(gè)ldr指令,還有一個(gè)ldr偽指令。兩者的區(qū)別:
ldr r0, #0xFF @ldr指令
ldr r0, =0xFF @ldr偽指令 涉及到合法/非法立即數(shù),還涉及到ARM文字池

adr 和 ldr的差別:
- adr編譯時(shí)會(huì)被1條sub或add指令替代,而ldr編譯時(shí)會(huì)被一條mov指令替代或者文字池方式處理;
- adr總是以PC為基準(zhǔn)來(lái)表示地址,因此指令本身和運(yùn)行地址有關(guān),可以用來(lái)檢測(cè)程序當(dāng)前的運(yùn)行地址在哪里
-ldr加載的地址和鏈接時(shí)給定的地址有關(guān),由鏈接腳本決定。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉