在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM匯編常用偽操作總結(jié)

            ARM匯編常用偽操作總結(jié)

            作者: 時(shí)間:2016-11-29 來(lái)源:網(wǎng)絡(luò) 收藏

              首先使用 MACRO 和 MEND 等偽操作定義宏。包含在 MACRO 和 MEND 之間的代碼段稱為宏定義體,在 MACRO 偽操作之后的一行聲明宏的原型(包含宏名、所需的參數(shù)),然后就可以在匯編程序中通過(guò)宏名來(lái)調(diào)用它。在源程序被匯編時(shí),匯編器將宏調(diào)用展開,用宏定義體代替源程序中的宏定義的名稱,并用實(shí)際參數(shù)值代替宏定義時(shí)的形式參數(shù)。

            本文引用地址:http://www.biyoush.com/article/201611/340834.htm

              宏定義中的 $label 是一個(gè)可選參數(shù)。當(dāng)宏定義體中用到多個(gè)標(biāo)號(hào)時(shí),可以使用類似 $label.$internallabel 的標(biāo)號(hào)命名規(guī)則使程序易讀。

              MACRO 、 MEND 偽操作可以嵌套使用。

              使用示例:

              MACRO

              $HandlerLabel HANDLER $HandleLabel ; 宏的名稱為 HANDLER ,有 1 個(gè)參數(shù) $HandleLabel

              $HandlerLabel

              sub sp,sp,#4 ;decrement sp(to store jump address)

              stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)

              ldr r0,=$HandleLabel ;load the address of HandleXXX to r0

              ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX

              str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack

              ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)

              MEND

              ;在程序中調(diào)用該宏

              HandlerFIQ HANDLER HandleFIQ ;通過(guò)宏的名稱 HANDLER 調(diào)用宏,其中宏的標(biāo)號(hào)為 HandlerFIQ ,參數(shù)為 HandleFIQ

              HandlerIRQ HANDLER HandleIRQ

              HandlerUndef HANDLER HandleUndef

              HandlerSWI HANDLER HandleSWI

              HandlerDabort HANDLER HandleDabort

              HandlerPabort HANDLER HandlePabort

              ;程序被匯編后,宏展開的結(jié)果

              HandlerFIQ

              sub sp,sp,#4

              stmfd sp!,{r0}

              ldr r0,=HandleFIQ

              ldr r0,[r0]

              str r0,[sp,#4]

              ldmfd sp!,{r0,pc}

              IF 、 ELSE 、 ENDIF

              語(yǔ)法格式:

              IF 邏輯表達(dá)式

              指令序列 1

              ELSE

              指令序列 2

              ENDIF

              IF 、 ELSE 、 ENDIF 偽操作能根據(jù)條件把一段源代碼包括在匯編程序內(nèi)或者將其排除在程序之外。 [ 是 IF 偽操作的同義詞, | 是 ELSE 偽操作的同義詞, ] 是 ENDIF 偽操作的同義詞。

              IF 、 ELSE 、 ENDIF 偽指令可以嵌套使用。

              使用示例:

              MACRO

              MOV_PC_LR

              [ THUMBCODE

              bx lr

              |

              mov pc,lr

              ]

              內(nèi)存操作

              DCD “ & ”(或 DCDU )

              語(yǔ)法格式:

              標(biāo)號(hào) DCD ( 或 DCDU) 表達(dá)式

              用于分配一段字內(nèi)存單元并用偽操作中指定的表達(dá)式初始化 。其中,表達(dá)式可以為程序中的標(biāo)號(hào)或數(shù)字表達(dá)式。

              用 DCD 分配的字存儲(chǔ)單元是字對(duì)齊 的,而用 DCDU 分配的字存儲(chǔ)單元并不嚴(yán)格字對(duì)齊。

              使用示例:

              DataTest DCD 4,5,6 ; 其值分別為 4 , 5 和 6 。

              data2 DCD memaddr+4 ; 分配一個(gè)字單元,其值為程序中標(biāo)號(hào) memaddr 加 4 個(gè)字節(jié)

              MAP ( “ ^ ” )

              語(yǔ)法格式:

              MAP 表達(dá)式 { ,基址寄存器 }

              用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址 。

              表達(dá)式可以為程序中的標(biāo)號(hào)或數(shù)字表達(dá)式,基址寄存器為可選項(xiàng),當(dāng)基址寄存器選項(xiàng)不存在時(shí),表達(dá)式的值即為內(nèi)存表的首地址,當(dāng)該選項(xiàng)存在時(shí),內(nèi)存表的首地址為表達(dá)式的值與基址寄存器的和。

              MAP 偽操作通常與 FIELD 偽操作配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表。

              使用示例:

              MAP 0x100 , R9 ; 定義結(jié)構(gòu)化內(nèi)存表首地址的值為 0x100 + R9 。

              FILED ( “ # ” )

              語(yǔ)法格式:

              標(biāo)號(hào) FIELD 表達(dá)式

              用于定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域 。

              表達(dá)式的值為當(dāng)前數(shù)據(jù)域在內(nèi)存表中所占的字節(jié)數(shù)。

              FIELD 偽操作常與 MAP 偽操作配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表結(jié)構(gòu)。 MAP 偽操作定義內(nèi)存表的首地址, FIELD 偽操作定義內(nèi)存表中的各數(shù)據(jù)域的字節(jié)長(zhǎng)度,并可以為每個(gè)數(shù)據(jù)域指定一個(gè)標(biāo)號(hào)供其他的指令引用。

              注意 MAP 和 FIELD 偽操作僅用于定義數(shù)據(jù)結(jié)構(gòu),并不實(shí)際分配存儲(chǔ)單元。

              示例 1 :

              下面的偽操作序列定義一個(gè)內(nèi)存表,其首地址為固定地址 4096 ,該內(nèi)存表中包括 5 個(gè)數(shù)據(jù)域: consta 長(zhǎng)度為 4 個(gè)字節(jié); constb 長(zhǎng)度為 4 個(gè)字節(jié); x 長(zhǎng)度為 8 個(gè)字節(jié); y 長(zhǎng)度為 8 個(gè)字節(jié); string 長(zhǎng)度為 256 個(gè)字節(jié)。這種內(nèi)存表稱為基于絕對(duì)地址的內(nèi)存表。

              MAP 4096 ;內(nèi)存表的首地址為 4096 ( 0x1000 )

              consta FIELD 4 ; consta 長(zhǎng)度為 4 個(gè)字節(jié),相對(duì)位置為 0

              constb FIELD 4 ; constb 長(zhǎng)度為 4 個(gè)字節(jié),相對(duì)位置為 5000

              constb FIELD 4 ; constb 長(zhǎng)度為 4 個(gè)字節(jié),相對(duì)位置為 5000

              x FIELD 8 ; x 長(zhǎng)度為 4 個(gè)字節(jié),相對(duì)位置為 5004

              y FIELD 8 ; y 長(zhǎng)度為 4 個(gè)字節(jié),相對(duì)位置為 5012

              string FIELD 256 ; string 長(zhǎng)度為 256 字節(jié),相對(duì)位置為 5020

              ; 在指令中可以這樣引用內(nèi)存表中的數(shù)據(jù)域:

              LDR R6 , consta

              上面的指令僅僅可以訪問(wèn) LDR 指令前面(或后面) 4KB 地址范圍的數(shù)據(jù)域

              示例 2 :

              下面的偽操作序列定義一個(gè)內(nèi)存表,其首地址為 0 ,該內(nèi)存表中包括 5 個(gè)數(shù)據(jù)域: consta 長(zhǎng)度為 4 個(gè)字節(jié); constb 長(zhǎng)度為 4 個(gè)字節(jié); x 長(zhǎng)度為 8 個(gè)字節(jié); y 長(zhǎng)度為 8 個(gè)字節(jié); string 長(zhǎng)度為 256 個(gè)字節(jié)。這種內(nèi)存表稱為基于相對(duì)地址的內(nèi)存表。

              MAP 4096 ;內(nèi)存表的首地址為 0

              consta FIELD 4 ; consta 長(zhǎng)度為 4 個(gè)字節(jié),相對(duì)位置為 0

              constb FIELD 4 ; constb 長(zhǎng)度為 4 個(gè)字節(jié),相對(duì)位置為 4

              x FIELD 8 ; x 長(zhǎng)度為 4 個(gè)字節(jié),相對(duì)位置為 8

              y FIELD 8 ; y 長(zhǎng)度為 4 個(gè)字節(jié),相對(duì)位置為 16

              string FIELD 256 ; string 長(zhǎng)度為 256 字節(jié),相對(duì)位置為 24

              ; 可以通過(guò)下面的指令方便地訪問(wèn)地址范圍超過(guò) 4KB 的數(shù)據(jù)

              MOV R9 , #4096

              LDR R5 , [R9,constb] ;將內(nèi)存表中數(shù)據(jù)域 constb 讀取到 R5 中

              在這里,內(nèi)存表中各數(shù)據(jù)域的實(shí)際內(nèi)存地址不是基于一個(gè)固定地址,而是基于 LDR 指令執(zhí)行時(shí) R9 寄存器中的內(nèi)容。這樣通過(guò)上面方法定義的內(nèi)存表結(jié)構(gòu)可以在程序中有多個(gè)實(shí)例(通過(guò)在 LDR 指令中指定不同的基址寄存器值來(lái)實(shí)現(xiàn))。通常用 R9 作為靜態(tài)基址寄存器。


            上一頁(yè) 1 2 下一頁(yè)

            關(guān)鍵詞: ARM

            評(píng)論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉