ARM彙編指令集

2021-07-14 00:17:30 字數 1421 閱讀 4868

arm彙編指令集的介紹,包括指令和偽指令。

指令指的是cpu機器指令的助記符,是由cpu的指令集提供的,經過編譯之後,會以二進位制機器碼的形式由cpu讀取執行

偽指令本質上不是指令,和cpu的機器指令沒有任何關係,只是和指令一起寫在**中而已,是由編譯器環境提供的,其目的是用於指導編譯過程,偽指令經過編譯後不會生成二進位制機器碼,僅僅在編譯階段有效果

官方風格指令一般使用大寫,例如:ldr r0,[r1],windows中常使用這種風格

指令一般使用小寫字母,例如:ldr r0,[r1],linux環境中常用這種風格

mvn:和mov用法一致,區別是mvn會把後乙個暫存器的值或者立即數按位取反後賦值給前乙個暫存器

用於讀取cpsr和spsr

用於寫cpsr和spsr

ldm:和ldr功能一樣,一次多位元組多暫存器訪問

stm:和str功能一樣,一次多位元組多暫存器訪問

swp:記憶體和暫存器互換指令,一邊讀一邊寫,例如:

swi(software interrupt),在軟體層模擬產生乙個中斷,這個中斷會傳送給cpu,常用於實現系統呼叫

arm指令都是32為,除了指令標記和操作標記外,只能附帶少位數的立即數,所以有非法與合法之分

協處理器屬於soc中另外一顆核心,用於協助主cpu實現某些功能,被主cpu呼叫來執行任務,協處理器和mmu,cache,tlb有功能和管理上的聯絡

arm設計可以支援多達16個協處理器,但是一般只實現其中的cp15

ldr與str只能訪問4個位元組,當資料較大的時候,就會明顯的降低效率,這時就需要使用到ldm和stm,ldm與stm是大量的從暫存器與記憶體交換資料的方式,常用於在記憶體和暫存器之間大量讀取和寫入資料:

操作棧時使用相同的字尾就不會出錯

在彙編中常見」!」符號,究竟是用來幹嘛的呢?

例如:那麼^號又是什麼作用呢?

例如:

作用:當目標暫存器中有pc時,會同時將spsr寫入到cpsr,一般用於從異常返回。

偽指令的作用用於指導編譯過程,偽指令並不是指令,編譯後並不會生成二進位制機器碼,偽指令是和具體的編譯環境有關的,我們使用的gnu編譯工具鏈,所以需要使用gnu下的彙編偽指令。

.section .text:指定當前段為**段

.ascii .byte .short .long .word .quad .float .string:定義各種型別的資料

.align 4:以16位元組對齊

.balignl 16 0x3c:b表示填充,align表示對齊,l表示long,以4位元組為單位填充,16表示以16位元組對齊,0x3c是用來填充的原料

.equ:巨集定義

.end:表示乙個檔案的結束

.include:用於包含標頭檔案

.arm / .code32:宣告以下的**是arm指令

.thumb / .code16:宣告以下的**是thumb指令

ARM彙編指令集2

常用arm指令1 資料處理指令 資料傳輸指令 mov mov r1,r2 mov r1,0xff01 mvnmvn和mov用法是一樣的,區別是mov是原封不動的傳遞,而mvn是按位取反後傳遞 如r1 0xff,然後mov r0,r1後,r0 0xff,但 mvn r0,r1時,r0 0xffffff...

常用arm彙編指令 RISC指令集

ldr r0,r1 讀記憶體,r0等於r1所指向位址的值,相當於c語言r0 r1 str r0,r1 寫記憶體,把r0的值存放到r1所指向的位址中,相當於c語言 r1 r0 ldr r1,r2,4 基址變址定址,相當於c語言r1 r2 4 ldr r0,0x12345678 偽指令,編譯最終拆分為幾...

彙編指令集

1.通用資料傳送指令.mov 傳送字或位元組.movsx 先符號擴充套件,再傳送.movzx 先零擴充套件,再傳送.push 把字壓入堆疊.pop 把字彈出堆疊.pusha 把ax,cx,dx,bx,sp,bp,si,di依次壓入堆疊.popa 把di,si,bp,sp,bx,dx,cx,ax依次彈...