ARM學習之ARM指令與彙編 二

2021-09-20 13:30:15 字數 3432 閱讀 7911

偽操作是arm組合語言源程式中的特殊指令助記符,其作用是為了完成匯程式設計序做各種準備工作的,指示匯程式設計序對組合語言源程式的編譯操作。是編譯器執行的指令,而不是arm處理器執行的指令。

(1)用於定義全域性變數的gbla、gbll和gbls。

(2)用於定義區域性變數的lcla、lcll和lcls。

(3)用於對變數賦值的seta、setl和sets。

(4)為通用暫存器列表定義名稱的rlist。

全域性變數定義偽操作gbla、gbll和gbls

gbla   test1	  ;定義乙個全域性的數字變數,變數名為test1

test1 seta 0xaa ;將該變數賦值為0xaa

gbll test2 ;定義乙個全域性的邏輯變數,變數名為test2

test2 setl ;將該變數賦值為真

gbls test3 ;定義乙個全域性的字串變數

test3 sets "testing" ;將該變數賦值為「testing」

區域性變數定義偽操作lcla、lcll和lcls

lcla   test4	  ;宣告乙個區域性的數字變數,變數名為test4

test3 seta 0xaa ;將該變數賦值為0xaa

lcll test5 ;宣告乙個區域性的邏輯變數,變數名為test5

test4 setl ;將該變數賦值為真

lcls test6 ;定義乙個區域性的字串變數

test6 sets "testing" ;將該變數賦值為「testing」

資料定義偽操作一般用於為特定的資料分配儲存單元,同時可完成已分配儲存單元的初始化。

(1)dcb用於分配一片連續的位元組儲存單元並用指定的資料初始化

(2)dcw(dcwu)用於分配一片連續的半字儲存單元並用指定的資料初始化

(3)dcd(dcdu)用於分配一片連續的字儲存單元並用指定的資料初始化

(7)space用於分配一片連續的儲存單元

(8)map用於定義乙個結構化的記憶體表首位址

(9)field用於定義乙個結構化的記憶體表的資料域

dcb

dcb偽操作用於分配一片連續的位元組儲存單元並用偽指令中指定的表示式初始化

str  dcb  "this is a test!"    ;分配一片連續的位元組儲存單元並初始化為指定字串。

c_string dcb "c_string",0 ; 與c中的字串不同,arm彙編中的字串不以null結尾,要想字串以null結尾需要手動在後面新增0

dcw

dcw(或dcwu)偽操作用於分配一片連續的半字儲存單元並用偽指令中指定的表示式初始化。其中,表示式可以為程式標號或數字表示式。用dc分配的字儲存單元是半字對齊的,而用dcu分配的字儲存單元並不嚴格半字對齊。

datatest    dcw   1,2,3   ;分配一片連續的半字儲存單元並初始化

datadcf-255,2*number dcwu nunber+4 ;在指定記憶體單元初始值時可以使用已定義的變數

dcd

dcd(或dcdu)偽操作用於分配一片連續的字儲存單元並用偽指令中指定的表示式初始化。用dcd分配的字儲存單元是字對齊的,而用dcdu分配的字儲存單元並不嚴格字對齊。

datatest dcd 4,5,6    ;分配一片連續的字儲存單元並初始化

datalest dcd nen06+4 ;用程式標號初始化記憶體單元

;在記憶體單元不能字對齊的情況下,使用dcdu偽操作

area mydata,data,readurtte

dcb 255:位元組定義使記憶體單元不能字對齊

data3 dcdu 1,5,20

space

space偽指令用於分配一片連續的儲存區域並初始化為0。

space偽操作常和align一起使用。

dataspace space   100   ;分配連續100位元組的儲存單元並初始化為0,儲存單元的位址為dataspace

;在mydata段的開始可以是255個初始化為0的位元組單元

area mydata,data,readirite

data1 space 255

if、else、endif

while、wend

macro、mend

mexit

align用於使程式當前位置滿足一定的對齊方式。

area用於定義乙個**段或資料段

entry用於指定程式入囗點

end用於指示源程式結束

equ跟c中的巨集定義一致

export或global用於宣告符號可以被其他檔案引用,模擬c中的extern

import用於通知編譯器當前符號不在本檔案中,模擬c中的extern

adr偽指令為小範圍位址讀取偽指令。adr偽指令將基於pc相對偏移位址或基於暫存器相對偏移位址值讀取到暫存器中,當位址值是位元組對齊時,取值範圍為-255-255,當位址值是字對齊時,取值範圍為-1020~1020。當位址值是16位元組對齊時其取值範圍更大

ldr    r4,=data+4*n   ;n是彙編時產生的變數

;code

mov pc,1r

data dcd value0

... ;n-1條dcd偽操作

dcd value7 ; 要裝入r4的值

... ;更多dcd偽操作

當要裝載的常量超出了iov指令或v指令的範圍時,使用ldr指令由ldr指令裝載的位址是絕對位址,即pc相關位址。

ldr r3,= 0xff0   ; r3 = 0xff0,相當於mov r3,#0xff0

ldr r2 ,= 0xfff ;r2 = 0xfff ,相當於ldr r1,[pc,offset]

該指令讓處理器完成乙個空操作,且不會影響cpsr標誌位。

可用於延時,相當於mov r0,r0

ldr r3,= 0xff0   ; r3 = 0xff0,相當於mov r3,#0xff0

;延時3個空操作時間

nop

nopnop

ldr r2 ,= 0xfff ;r2 = 0xfff ,相當於ldr r1,[pc,offset]

ARM彙編指令

b或bl指令引起處理器轉移到 子程式名 也就是位址 處開始執行,這兩個指令都是相對跳轉指令。兩者的不同之處在於bl指令在轉移到子程式執行之前,將其下一條指令的位址拷貝到r14 lr,鏈結暫存器 由於bl指令儲存了下條指令的位址,因此使用指令 mov pc lr 即可實現子程式的返回。而b指令則無法實...

arm彙編指令

一般arm官方風格彙編指令為大寫,windows ads mdk 實際運用一般用gnu風格,為小寫,linux 1 arm採用risc架構,cpu本身不能直接讀取內 存,而需要先將記憶體中內容加載入cpu中通用寄 存器中才能被 cpu處理 ldr loadregister 指令 將記憶體內容加載入通...

ARM彙編指令

1.彙編概述 2.指令分類學習 3.偽指令 4.協處理訪問指令 為什麼要學習使用匯程式設計序?bootloader kernel的初始化和需要執行效率極高的程式中 1.arm標準彙編 2.gnu彙編 section.data 初始化的資料 section.bss 未初始化的資料 section.te...