最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

(基于ARM的)微機(jī)原理與接口技術(shù)筆記(5)

2021-10-14 22:53 作者:會(huì)整活的劍人  | 我要投稿

ARM(7TDMI)的指令(復(fù)習(xí))

一般的ARM指令形式: 32位ARM指令集(4字節(jié)) 16位Thumb指令集(2字節(jié))

一般的ARM匯編格式,其中<>內(nèi)是必須的 {}內(nèi)的是可選的.

Rd目標(biāo)寄存器 Rn操作數(shù) operand2第二操作數(shù)

<opcode> {<cond>}{s} <Rd>,<Rn>{,<operand2>}

  • 數(shù)據(jù)處理

  • 存儲(chǔ)器訪問

  • 比較

  • 分支跳轉(zhuǎn)


條件碼:基于狀態(tài)寄存器高4位(N負(fù)數(shù)標(biāo)志,Z零標(biāo)志,C進(jìn)位借位,V溢出)指令條件執(zhí)行

operand2可以是

  • 寄存器 R0-R15

  • 寄存器進(jìn)行移位以后

  • 立即數(shù)

    • #immed_8r 常數(shù)表達(dá)式 ?可以由8位二進(jìn)制數(shù)通過循環(huán)右移偶數(shù)位可以得到的數(shù)


    • 算術(shù)移位(右)

    • 邏輯移位(左,右)

    • 寄存器方式下operand2即為寄存器的值

      例如

      sub r1,r2,r2
      addeq r2,r4,r5;條件執(zhí)行sub r0,r0,r1,lsl #4
      ;r0是目標(biāo)寄存器 r0減(r1邏輯左移位4)扔到r0
    • 寄存器移位方式

    • 立即數(shù)方式

ARM(7TDMI)的尋址方式

尋址:

處理器如何根據(jù)指令中的地址來(lái)尋找真實(shí)操作數(shù)的地址

外設(shè)(IO口等)可以映射到內(nèi)存里當(dāng)做內(nèi)存處理

操作數(shù)可能在

(1)指令中直接給出

(2)寄存器

(3)內(nèi)存單元

ARM處理器8種尋址方式

  • 寄存器尋址

    • 操作數(shù)就是寄存器 取寄存器的數(shù)值 來(lái)的很快

    • 舉例

      mov r1,r2;把r2的值扔到r1里面
      sub r0,r1,r2;把[r1的值減去r2的值]扔到r0里面

      設(shè)r1: 0x55 r2:0xaa

      mov r1,r2后r1: 0xaa r2:0xaa

  • 立即尋址

    • immediate指令里面帶操作數(shù)

    • 舉例

      subs r0,r0,#1 ;把r0減1扔到r0并影響狀態(tài)位
      mov r0,#0xff000 ;把0xff000扔到r0

      設(shè)r0:0xaa執(zhí)行mov r0,#0xff000

  • 寄存器偏移尋址

    • ARM指令集特有,寄存器值移位后

    • 舉例

      mov r0,r2, lsl #3 把[r2左移3位]扔到r0
      ands r1,r1,r2,lsl r3 ;把[r2左移[r3]位 和r1與]扔到r1

      注意r2的真實(shí)值不變

  • 寄存器間接尋址

    • 從內(nèi)存讀數(shù)據(jù)/寫內(nèi)存

    • 舉例

      ldr r1,[r2];此處r2儲(chǔ)存的是地址(類比指針) 把r2指向的內(nèi)容扔到r1
      swp r1,r1,[r2];把r1的值的r2指向的存儲(chǔ)內(nèi)容交換

      注意r2是地址.執(zhí)行時(shí)間要長(zhǎng)()

  • 基址尋址

    • 基址寄存器中內(nèi)容(地址)+偏移量OFFSET得一個(gè)地址

    • offset為0則為間接尋址

    • 舉例

      ldr r2,[r3,#0x0c] ;r3是地址 offset 0x0c
      str r1,[r0,#-4] ;把r1的內(nèi)容保存到[r0的地址-4]的內(nèi)容

      先算offset再尋址

  • 多寄存器尋址

    • 一次搬一堆,把內(nèi)存中一堆連續(xù)32位數(shù)搬到多個(gè)寄存器

    • 或者反過來(lái)把多個(gè)寄存器的值扔到內(nèi)存中

    • 最多16個(gè)

    • 舉例

      ldmia r1!,{r2-r7,r12};把r1儲(chǔ)存的地址處連續(xù)的數(shù)據(jù)扔到{r2到r7,r12} (r1自動(dòng)偏移)
      stmia r0!,{r2-r7,r12};把{r2到r7,r12}的值扔到r1儲(chǔ)存的地址處(連續(xù)的 r0自動(dòng)偏移)

      r1!表示執(zhí)行完指令r1的值會(huì)變化

    • 這個(gè)指令A(yù)RM指令集肯定有 Thumb可能沒有

  • 堆棧尋址(其實(shí)只是用的)

    • STACK是一個(gè)按特定順序進(jìn)行存取的區(qū)域.后進(jìn)先出.人為在內(nèi)存中劃的(可以認(rèn)為是"設(shè)置棧指針和棧大小")

    • 主要保存臨時(shí)數(shù)據(jù),"函數(shù)調(diào)用棧"

    • STACK OVERFLOW有2種 上溢/下溢 (也有可能沒事?但是會(huì)導(dǎo)致runtime error )

    • 向上生長(zhǎng)(扔一個(gè)數(shù)進(jìn)棧,棧指針向上)

    • 向下生長(zhǎng)(棧從高地址開始,扔一個(gè)數(shù)進(jìn)棧,棧指針向下)

    • 棧指針SP

    • 進(jìn)棧LDM 出棧STM

    • 后期arm指令有PUSH或者POP like this

  • 相對(duì)尋址

    • 基于PC(R15)的尋址,加上OFFSET得到一個(gè)地址

(可能有錯(cuò))

ARM指令集(及其匯編語(yǔ)言)

全部是ARM7的ARM指令

先上例子

area example1,code,readonly ;用分號(hào)注釋
entry
code32
start mov r0,#0
mov r1,#10
loop bl add_sub
?b loop
add_sub
adds r0,r0,r1
mov pc,lr
end

1.存儲(chǔ)器訪問指令

分為單寄存器操作指令多寄存器操作指令

ldrstr訪問內(nèi)存變量

程序加載數(shù)據(jù)到PC實(shí)現(xiàn)散轉(zhuǎn)

單寄存器加載/存儲(chǔ)可以實(shí)現(xiàn)32位/16位/8位

零偏移:Rn就是地址

前索引偏移:先對(duì)[]計(jì)算OFFSET,得到地址,然后取地址 !執(zhí)行完Rn變化

程序相對(duì)偏移:

后索引偏移:先對(duì)[]取地址后算OFFSET 下一次影響

ldr r2,[r5] ;把r2
str r1,[r2,#0x04] ;把r1的值扔到[r2+0x04]的地址 r2的值不變


pdf下載:


(基于ARM的)微機(jī)原理與接口技術(shù)筆記(5)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
姜堰市| 襄垣县| 石柱| 甘谷县| 康定县| 定南县| 新沂市| 重庆市| 阿鲁科尔沁旗| 娱乐| 甘谷县| 麻城市| 甘泉县| 翁牛特旗| 城固县| 北京市| 镇江市| 铁岭市| 临邑县| 卢氏县| 兴隆县| 高密市| 钦州市| 祁阳县| 米脂县| 南乐县| 简阳市| 始兴县| 德清县| 西盟| 深州市| 郎溪县| 克什克腾旗| 山阳县| 小金县| 宁安市| 运城市| 陇南市| 墨玉县| 青海省| 淄博市|