ARM匯編

匯編

索引

[###MOV]
[###指令后面加S]
[###條件執(zhí)行和標(biāo)志位][###指令后面加條件]
[@str@strb@strh@ldr@ldrb@ldrh]

[@LSL@LSR @ASR@ROR]

[@前索引@后索引@自動索引]
[@str@ldr]
[@棧 @fd @fa @ed @ea]
[@批量數(shù)據(jù)存儲]
[@原子操作 @swp]
[@狀態(tài)寄存器傳送指令 @mrs]

[@協(xié)處理器指令]
[@MRC][@MCR]

[@匯編偽指令和偽操作]
[@.arm][@.thumb][@.section][@.text][@.data][@.bss][@.align][@.org][@.local][@.global][@.end][@.include]
[@.byte][@.short][@.long /.word ][@.quad][@.float][@.string /.asciz/.ascii ]
[@.equ][@.macro]

指令分為六類:

  1. 數(shù)據(jù)處理指令:對數(shù)據(jù)進(jìn)行邏輯、數(shù)學(xué)等運(yùn)算與處理

  2. 跳轉(zhuǎn)指令:實(shí)現(xiàn)程序的跳轉(zhuǎn)

  3. Load/Store指令:CPU與內(nèi)存之間進(jìn)行數(shù)據(jù)的存取

  4. 狀態(tài)寄存器傳送指令:對狀態(tài)寄存器進(jìn)行讀寫操作

  5. 協(xié)處理器指令:對協(xié)處理器進(jìn)行操作

  6. 異常中斷產(chǎn)生指令:產(chǎn)生異常中斷

MOV

    MOV  R0,#0X55

    @R0 = 0X55

ps:@立即數(shù)
@ #0xff000000
@ mov r0, #0xff00
@ 立即數(shù)的本質(zhì)是包含在指令當(dāng)中的數(shù)
@ 一個(gè)立即數(shù)是由一個(gè)八位二進(jìn)制數(shù)循環(huán)右移偶數(shù)次得到的
@ mov r0, #0xffffff00
@ 不是立即數(shù) 編譯器對指令進(jìn)行了替換

@ 數(shù)據(jù)處理指令的語法:<操作>{<cond>}{S} Rd, Rn, Operand2
@ <操作碼><目標(biāo)寄存器Rd><第一操作寄存器Rn><第二操作數(shù)Operand2>

指令后面加S

數(shù)據(jù)運(yùn)算指令后加后綴‘s’時(shí)才會對CPSR中的條件位產(chǎn)生影響,默認(rèn)不會對CPSR中的條件位產(chǎn)生影響

條件執(zhí)行和標(biāo)志位&&###指令后面加條件

    CMP r3,#0      |                          | CMP r3,#0
    BEQ skip         |    equal=>        | ADDNE r0,r1,r2
    ADD r0,r1,r2   |                         | ......
skip                    |                         |
    .......

|條件碼|助記符后綴 |標(biāo)志 |含義 |
|-----|---------:|---------------------:|-------------------|--
|0000 | EQ | Z置位 | 相等 |
|0001 | NE | Z清零 | 不等于 |
|0010 | CS | C置位 |無符號大于或等于 |
|0011 | CC | C清零 | 無符號小于 |
|0100 | MI | N置位 | 負(fù)數(shù) |
|0101 | PL | N清零 | 正數(shù)或零 |
|0110 | VS | V置位 | 溢出 |
|0111 | VC | V清零 | 未溢出 |
|1000 | HI | C置位 | 無符號數(shù)大于 |
|1001 | LS | C清零 | 無符號數(shù)小于或等于 |
|1010 | GE | N等于 | 帶符號數(shù)大于或等于 |
|1011 | LT | N不能與于V | 帶符號數(shù)小于 |
|1100 | GT | Z清零且N等于V | 帶符號數(shù)大于 |
|1101 | LE | Z置位或N不等于V | 帶符號數(shù)小于或等于 |
|1110 | AL | 忽略 | 無條件執(zhí)行 |

(@str@strb@strh@ldr@ldrb@ldrh)

@str
     mov r0, #0xaa
     mov r1, #0x41000000
     str r0, [r1]
     @將r0中的數(shù)據(jù)存儲到以r1為起始地址的四個(gè)字節(jié)的內(nèi)存單元中
@strb
     mov r0, #0xaa
     mov r1, #0x41000000
     strb r0, [r1]
     @將r0中的[7:0]存儲到r1指向的內(nèi)存單元
@strh
     mov r0, #0xaa
     mov r1, #0x41000000
     strh r0, [r1]
     @將r0中[15:0]數(shù)據(jù)存儲到以r1為起始地址的2個(gè)字節(jié)的內(nèi)存單元中

@位操作

@AND@ORR@EOR@BIC
@LSL

only for reg

/*
*@置位
*/
MOV R1,#0x01
ORR R0,R1,LSL #0x4
@ r0 |= 0x01<<4

/*
*@翻轉(zhuǎn)
*/
MOV R1,#0x01
EOR R0,R1,LSL #0x4
@ r0 ^= 0x01<<4

/*
*@清零
*/
MOV R1,#0x01
BIC R0,R1,LSL  #0x4
@ r0 &= ( ~(0x01<<4))

@LSL@LSR @ASR@ROR

移位.png

@str@ldr

@前索引@后索引@自動索引

  1. 標(biāo)號(地址助記符)
val
ldr r0,val              @   r0=*(val)

ps:注意區(qū)分: ldr r0,=val @ r0=val

  1. 寄存器間接尋址
ldr r0,=0x40000000
ldr r1,[r0]  @ r1 = *r0  =*(0x40000000)
  1. 基址變址尋址

索引方式

@前索引
mov r0, #0xaa
mov r1, #0x41000000
str r0, [r1, #4]
將r0中的數(shù)據(jù)存儲到r1+4內(nèi)存中

mov r2, #8
str r0, [r1, r2]
將r0中的數(shù)據(jù)存儲到r1+r2內(nèi)存中

str r0, [r1, r2, lsl #1]
r1 + (r2 << 1)

@后索引
mov r0, #0xaa
mov r1, #0x41000000
str r0, [r1], #4
將r0存儲到r1指向的內(nèi)存單元中 然后r1 = r1 + 4

@自動索引
mov r0, #0xaa
mov r1, #0x41000000
str r0, [r1, #8]!
將r0存儲到1r+8地址中,然后r1=r1+8
在地址后加‘!’使用完地址后地址自增

@批量數(shù)據(jù)存儲

@ mov r1, #1
    @ mov r2, #2
    @ mov r3, #3
    @ mov r4, #4
    @ mov r5, #5
    @ mov r11,#0x41000000
    @ stm r11, {r1-r5}
    @ 將r1-r5寄存器中的值存儲到以r11為起始地址的內(nèi)存單元中
    @ stm r11!, {r1,r3,r5}
    @ 編號小的寄存器對應(yīng)的存儲到低地址
    @ 加上'!'后存儲完以后地址值自動更新

@增長方式

    @ 增長方式
    @ mov r1, #1
    @ mov r2, #2
    @ mov r3, #3
    @ mov r4, #4
    @ mov r5, #5
    @ mov r11,#0x41000000
    @ stmda r11!, {r1-r2}
    @ stmda r11!, {r1-r5}

    @ IA 先使用后增長
    @ IB 先增長后使用
    @ DA 先使用后遞減
    @ DB 先遞減后使用

    @ 將r1-r5存儲到r11為起始地址的內(nèi)存單元  然后將該數(shù)據(jù)再讀取到r6-r10寄存器
    @ stmia r11!, {r1-r5}
    @ ldmda r11!,{r6-r10}

@棧 @fd @fa @ed @ea

@fd 滿減 常用

    mov r1, #1
    mov r2, #2
    mov r3, #3
    mov r4, #4
    mov r5, #5
    mov r11,#0x41000000
    stmfd r11!, {r1-r5}
    ldmfd r11!, {r6-r10}

    @ 棧的種類
    @ fd滿減  fa滿增  ed空減  ea空增
    @ 一般使用滿減棧
    @ 使用什么后綴壓棧  就使用什么后綴的出棧指令  這樣不會出現(xiàn)錯誤

    @ 初始化棧
    @ mov sp, #0x41000000

@原子操作 @swp

swp r0, r1, [r2]

[r2]=>r0 ; r1=>[r2]
將r2地址中的數(shù)據(jù)加載到r0寄存器,然后將r1中的數(shù)據(jù)存儲到r2指向的內(nèi)存中
優(yōu)點(diǎn):單條指令可以實(shí)現(xiàn)內(nèi)存與處理器之間的數(shù)據(jù)交換 中間不會被打斷

@狀態(tài)寄存器傳送指令 @mrs

mrs r0, cpsr \\讀取CPSR中的值到R0寄存器

bic r0, r0, #0x1f
orr r0, r0, #0x10 \\修改r0中的值

msr cpsr, r0 \\將r0中的數(shù)據(jù)寫入CPSR

一般用于模式的切換
對CPSR的操作 讀-改-寫
當(dāng)前在哪種模式下使用哪種模式下的寄存器 編程的時(shí)候不需要專門指定

@異常中斷產(chǎn)生指令 @swi 1

swi 1

@協(xié)處理器指令

[@MRC][@MCR]
MRC 將協(xié)處理器中寄存器的值傳送到處理器寄存器
MCR 將處理器中寄存器的值傳送到協(xié)處理器寄存器

@匯編偽指令和偽操作(在ppt中有詳細(xì)介紹)

@偽指令

ldr r0, =0x12345678
將0x12345678放入r0寄存器
先將0x12345678放在內(nèi)存當(dāng)中 然后再通過內(nèi)存訪問指令將其讀取 進(jìn)行了指令的替換
ldr r0, =55
根據(jù)偽指令書寫方式的不同 最終生成的指令可能也不同

ADR R0, lable
ADR偽指令為小范圍地址讀取偽指令

ADRL R0,lable
ADRL偽指令為中等范圍地址讀取偽指令

@偽操作

@宏操作

[@.equ][@.macro]
.equ GPF3DAT,0x114001E4
mov r0, #GPF3DAT
宏替換指令

.macro {$label}macroname{$parameter{,$parameter}...}
........code
.endm

函數(shù)宏 :宏操作可以 使用一個(gè)或多個(gè)參數(shù),當(dāng)宏操作被展開時(shí),這些參數(shù)被相應(yīng)的值替換 。

@數(shù)據(jù)定義(Data Definition)偽操作

[@.byte][@.short][@.long /.word ][@.quad][@.float][@.string /.asciz/.ascii ]
.byte
單字節(jié)定義 .byte 0x12,’a’,23 在當(dāng)前位置定義 0x12 'a' 23三個(gè)byte的數(shù)據(jù)
.short
定義雙字節(jié)數(shù)據(jù).short 0x1234,65535
.long /.word
定義4字節(jié)數(shù)據(jù).word 0x12345678
.quad
定義8字節(jié).quad 0x1234567812345678
.float
定義浮點(diǎn)數(shù).float 0f3.2
.string /.asciz/.ascii
定義字符串 .ascii “abcd\0”,

@雜項(xiàng)偽操作

[@.arm][@.thumb][@.section][@.text][@.data][@.bss][@.align][@.org][@.local][@.global][@.end][@.include]
.arm 定義一下代碼使用ARM指令集編譯
.thumb .thumb 定義一下代碼使用Thumb指令集編譯
.section .section expr 定義一個(gè)段。expr可以使.text .data. .bss

.text {subsection} 將定義符開始的代碼編譯到代碼段
.data {subsection} 將定義符開始的代碼編譯到數(shù)據(jù)段,初始化數(shù)據(jù)段
.bss {subsection} 將變量存放到.bss段,未初始化數(shù)據(jù)段
.align{alignment}{,fill}{,max} 通過用零或指定的數(shù)據(jù)進(jìn)行填充來使當(dāng)前位置與指定邊界對齊
.org offset{,expr}指定從當(dāng)前地址加上offset開始存放代碼,并且從當(dāng)前地址到當(dāng)前地址加上offset之間的內(nèi)存單元,用零或指定的數(shù)據(jù)進(jìn)行填充
_start 匯編程序的缺省入口是_ start標(biāo)號,用戶也可以在連接腳本文件中用 ENTRY標(biāo)志指明其它入口點(diǎn).
.local定義一個(gè)局部的符號
.global/.globl:用來聲明一個(gè)全局的符號
.end 文件結(jié)束
.include “filename”包含指定的頭文件, 可以把一個(gè)匯編常量定義放在頭文件中

@GUN匯編書寫標(biāo)準(zhǔn)

  1. 代碼行中的注釋符號: ‘@’ 整行注釋符號: ‘#’ 語句分離符號: ‘;’ 直接操作數(shù)前綴: ‘#’ 或 ‘$’

  2. 標(biāo)號:標(biāo)號只能由az,AZ,0~9,“.”,_等(由點(diǎn)、字母、數(shù)字、 下劃線等組成,除局部標(biāo)號外,不能以數(shù)字開頭)字符組成,標(biāo)號的后面加“:”。

  3. 局部標(biāo)號:局部標(biāo)號主要在局部范圍內(nèi)使用而且局部標(biāo)號可以重復(fù)出現(xiàn)。它由兩部組成開頭是一個(gè)0-99直接的數(shù)字局部標(biāo)號 后面加“:”

  4. F:指示編譯器只向前搜索

  5. B:指示編譯器只向后搜索

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容