<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM匯編常用偽操作總結

ARM匯編常用偽操作總結

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

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

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

  宏定義中的 $label 是一個(gè)可選參數。當宏定義體中用到多個(gè)標號時(shí),可以使用類(lèi)似 $label.$internallabel 的標號命名規則使程序易讀。

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

  使用示例:

  MACRO

  $HandlerLabel HANDLER $HandleLabel ; 宏的名稱(chēng)為 HANDLER ,有 1 個(gè)參數 $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

  ;在程序中調用該宏

  HandlerFIQ HANDLER HandleFIQ ;通過(guò)宏的名稱(chēng) HANDLER 調用宏,其中宏的標號為 HandlerFIQ ,參數為 HandleFIQ

  HandlerIRQ HANDLER HandleIRQ

  HandlerUndef HANDLER HandleUndef

  HandlerSWI HANDLER HandleSWI

  HandlerDabort HANDLER HandleDabort

  HandlerPabort HANDLER HandlePabort

  ;程序被匯編后,宏展開(kāi)的結果

  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 邏輯表達式

  指令序列 1

  ELSE

  指令序列 2

  ENDIF

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

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

  使用示例:

  MACRO

  MOV_PC_LR

  [ THUMBCODE

  bx lr

  |

  mov pc,lr

  ]

  內存操作

  DCD “ & ”(或 DCDU )

  語(yǔ)法格式:

  標號 DCD ( 或 DCDU) 表達式

  用于分配一段字內存單元并用偽操作中指定的表達式初始化 。其中,表達式可以為程序中的標號或數字表達式。

  用 DCD 分配的字存儲單元是字對齊 的,而用 DCDU 分配的字存儲單元并不嚴格字對齊。

  使用示例:

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

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

  MAP ( “ ^ ” )

  語(yǔ)法格式:

  MAP 表達式 { ,基址寄存器 }

  用于定義一個(gè)結構化的內存表的首地址 。

  表達式可以為程序中的標號或數字表達式,基址寄存器為可選項,當基址寄存器選項不存在時(shí),表達式的值即為內存表的首地址,當該選項存在時(shí),內存表的首地址為表達式的值與基址寄存器的和。

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

  使用示例:

  MAP 0x100 , R9 ; 定義結構化內存表首地址的值為 0x100 + R9 。

  FILED ( “ # ” )

  語(yǔ)法格式:

  標號 FIELD 表達式

  用于定義一個(gè)結構化內存表中的數據域 。

  表達式的值為當前數據域在內存表中所占的字節數。

  FIELD 偽操作常與 MAP 偽操作配合使用來(lái)定義結構化的內存表結構。 MAP 偽操作定義內存表的首地址, FIELD 偽操作定義內存表中的各數據域的字節長(cháng)度,并可以為每個(gè)數據域指定一個(gè)標號供其他的指令引用。

  注意 MAP 和 FIELD 偽操作僅用于定義數據結構,并不實(shí)際分配存儲單元。

  示例 1 :

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

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

  consta FIELD 4 ; consta 長(cháng)度為 4 個(gè)字節,相對位置為 0

  constb FIELD 4 ; constb 長(cháng)度為 4 個(gè)字節,相對位置為 5000

  constb FIELD 4 ; constb 長(cháng)度為 4 個(gè)字節,相對位置為 5000

  x FIELD 8 ; x 長(cháng)度為 4 個(gè)字節,相對位置為 5004

  y FIELD 8 ; y 長(cháng)度為 4 個(gè)字節,相對位置為 5012

  string FIELD 256 ; string 長(cháng)度為 256 字節,相對位置為 5020

  ; 在指令中可以這樣引用內存表中的數據域:

  LDR R6 , consta

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

  示例 2 :

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

  MAP 4096 ;內存表的首地址為 0

  consta FIELD 4 ; consta 長(cháng)度為 4 個(gè)字節,相對位置為 0

  constb FIELD 4 ; constb 長(cháng)度為 4 個(gè)字節,相對位置為 4

  x FIELD 8 ; x 長(cháng)度為 4 個(gè)字節,相對位置為 8

  y FIELD 8 ; y 長(cháng)度為 4 個(gè)字節,相對位置為 16

  string FIELD 256 ; string 長(cháng)度為 256 字節,相對位置為 24

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

  MOV R9 , #4096

  LDR R5 , [R9,constb] ;將內存表中數據域 constb 讀取到 R5 中

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


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

關(guān)鍵詞: ARM

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>