天天看點

常用彙編僞指令

彙編語言中,指令語句在源程式彙編時會産生可供計算機執行的指令代碼,即目标代碼。彙程式設計式除指令語句外,還需要提供一些指令,用于輔助源程式的彙編。比如指定程式或資料存放的起始位址,為資料配置設定一段連續的記憶體單元等。這些指令在彙編時并不生成目标代碼,不影響程式執行,是以稱之為僞指令。本文簡單總結了常用的僞指令,如下。

1、EQU(Equate)

一般格式為: 标号: EQU 操作數

指令功能為将操作數賦予标号,兩邊的值完全相等。使用EQU僞指令給一個标号指派後,此标号在整個源檔案中值固定。

AREA: EQU 1000H ;将标号AREA指派為1000H

2、ORG(Origin)

一般格式為: ORG xxxxH(絕對位址或标号)

XxxxH決定此語句後第一條指令(或資料)的位址。該段源程式或資料被連續存放在此後的位址内,直到下一條ORG指令為止。

ORG 8000H ;此後目标代碼存儲在存儲器中以0x8000h開始的位址空間中。

ADD R1, #1

MOV R2, #2

3、DB(Define Byte)

一般格式為: 标号: DB 位元組常數或字元或表達式

标号字段可有可無,位元組常數或字元是指一個位元組資料。此僞指令的功能是把位元組常數或位元組串存放至記憶體連續的位址空間中。

ORG 8000H

DATA1: DB 43H,09H,08H

DATA2: DB 07H

僞指令DB指定了43H,09H,08H 順序存放在8000H開始的存儲單元中,DATA2中的07H緊挨着DATA1的位址空間存放,即07H存放在8003H單元中。

注:DW(Define Word)指令定義與DB類似,差別在于DW定義一個字,DB定義一個位元組。

4、END

一般格式為: 标号: END 位址或标号

位址或标号可以忽略。此僞指令用于訓示彙編語言程式段結束。是以一個源程式中僅有一個END,且一般放在程式最後。若END放在程式中間,則END後面的語句将不再被彙編。

5、AREA

一般格式為: 标号 sectionname{,attr}{,attr}……

Sectionname指定節的名稱。節是不可分的已命名獨立代碼子產品或資料子產品,由連接配接器進行處理。

Attr則是一個或多個用逗号分隔的節的屬性。屬性有多種,比如:

ALIGN=expression。預設條件下節以四位元組邊界對齊。Expression取值範圍為0-31.表征的對齊邊界是2的expression平方。

CODE 包含機器指令。預設值為READONLY

DATA 包含資料但不包含指令。預設值為READWRITE

READONLY 訓示此節隻讀。代碼區域預設值。

READWRITE 訓示此節可讀可寫。資料區域預設值。

AREA Example, DATA, READWRITE

;data
           

以上代碼定義了名為Example的可讀寫資料節。

6、PUBLIC

一般格式為: PUBLIC 辨別符1,辨別符2……

在開發較為複雜的應用程式時,其執行檔案的生成一般由多個目标檔案連結而成。多個目标檔案之間一般存在資料互動,彙編語言中通過僞指令PUBLIC及EXTRN來解決子產品之間的聯系。PUBLIC用來說明目前子產品中可被其他子產品所引用的公共辨別符。

PUBLIC _STARTUP

聲明辨別符_STARTUP可被其他子產品所引用。

7、EXTRN或EXTERN

一般格式為: EXTRN 辨別符1:類型1,辨別符2:類型2…….

表明辨別符1、2是外部辨別符,其已經在其他子產品中被定義為類型1、類型2等。在一個子產品中,可用多條EXTRN來說明本子產品中所引用的外部辨別符。實質為彙編器提供一個并未在目前彙編檔案中定義的名稱。

注:EXTRN所聲明的辨別符必須在其定義的子產品中被PUBLIC聲明為公共辨別符,且聲明的辨別符類型需與該辨別符定義類型一緻。

類似:EXPORT或GLOBAL

聲明一個符号,連結器可以使用此符号解析不同對象和庫檔案中的符号引用。即,可使其他檔案中的代碼能夠通路目前檔案中的符号。

8、PROC

一般格式為: <過程名> PROC [類型]

此指令為過程定義指令。過程即子程式,一個過程可以被其他程式調用(CALL指令)。

<過程名> PROC [類型]

…….

               …….



ENDP
           

注:PROC和ENDP必須成對出現。

9、SPACE

一般格式為: 标号 SPACE 表達式

此指令用于配置設定一片連續的存儲區域并初始化為0。表達式為要配置設定的位元組數。SPACE可用“%”來代替。

DataSpace SPACE 1000 ;配置設定連續1000個位元組的存儲單元DataSpace并初始化為0。

10、ENTRY

此指令用于聲明程式的入口點。一個程式至少有一個入口點。

AREA TEST, CODE, READONLY

ENTRY ;程式入口點。

11、PRESERVE8

一般格式為: PRESERVE8 {bool}

PRESERVE8指令指定目前檔案需保持堆棧八位元組對齊方式。其通過設定PRES8編譯屬性通知連接配接器。

PRESERVE8 ;保持代碼堆棧八位元組對齊。

PRESERVE8 {FALSE} ;不保持代碼堆棧八位元組對齊。

12、CODE16、CODE32

一般格式為: CODE16(或CODE32)

CODE16通知編譯器,其後的指令序列為16位的Thumb指令。

CODE32通知編譯器,其後的指令序列為32位的ARM指令。

在實用ARM指令和Thumb指令混合程式設計的代碼裡,可使用這兩天指令進行切換。注:指令隻能通知編譯器其後的指令類型,并不能對處理器進行狀态的切換。

12、IMPORT

此指令類似于EXTERN。用于通知編譯器即将使用的标号在其他源檔案中定義。無論目前源檔案是否引用該标号,該标号均會被加入到目前源檔案的符号表中。

一般格式為: IMPORT 标号 {[WEAK]}

标号在程式中區分大小寫,[WEAK]表示當所有源檔案中均找不到此标号時,編譯器也不會顯示錯誤資訊。

AREA INIT, CODE, READONLY

IMPORT Main ;通知編譯器目前檔案要引用标号Main,但其定義在其他源檔案中。

END

Hope you enjoy!

繼續閱讀