8086匯編偽指令小結


同一個程序中,標號或變量只能定義一次.

標號有三種屬性:段、偏移、類型(NEAR PTR,WORD PTR,FAR PRT,DWORD PTR)

   

一。數值回送操作符:TYPE、LEGNTH、SIZE、OFFSET、SEG

1. TYPE    expression_r(or label)

如果表達式是變量,則回送該變量以字節數表示的類型:DB為 1, DW為 2, DD為 4...

如果表達式是標號,則回送該標號類型的數值:NEAR為 -1, FAR為 -2.

如果表達式是常量,則回送0.

array  DW A110H,B02CH,C322H   

ADD    AX, TYPE  array  等價於 ADD    AX, 2

2. LENGTH    variable    對於變量使用DUP的情況,將回送分配給該變量的單元數; 對其它情況則回送1.

fees  DW 100 DUP(?)          

MOV  CX, LEGNTH  fees  等價於MOV  CX, 100

3. SIZE    variable    回送分配給該變量的字節數

MOV    CX, SIZE  fees 等價於 MOV CX, 200

4. OFFSET    variable (or lable)        回送變量或標號的偏移地址.

MOV    BX,OFFSET OPER_ONE 等價於 LEA BX,OPER_ONE 語句 ,將OPER_ONE的偏移地址送入BX

5. SEG    variable(or lable)       回送變量或標號的段地址.

若OPER_ONE是DATA_SEG數據段中的一個變量,下面語句取得DATA_SEG段首地址

MOV    DS , SEG OPER_ONE  等價於

MOV    AX , DATA_SEG      MOV    DS , AX

二。屬性操作符:PTR、THIS、HIGH、LOW、HIGHWORD、LOWWORD

1. type    PTR    expression        用來給已分配的存儲地址賦予另一種屬性,使該地址具有另一種類型.

表示按expression表達式尋址,按指定的類型type看待.

即PTR是給后面的expression操作數賦予新的數據類型或地址類型.

MOV    BYTE PTR[BX] , 5        //存入字節(Byte)單元

MOV    WORD PTR[BX] , 5       //存入字(Word)單元

2. THIS    type    指定與當前地址計數器相等的一個地址單元的類型.type是NEAR、FAR、PROC,也可以是BYPE、WORD...

first_type    EQU    THIS  BYTE

word_table    DW    100 DUP(?)    此時,first_type的偏移地址與word_table完全相同,但它是字節類型

3. HIGH (LOW)    express   字節分離操作符, HIGH取高位字節, LOW取低位字節.

HIGHWORD (LOWWORD)    express    字分離操作符, HIGHWORD取高位字, LOWWORD取低位字.

CONST    EQU    0ABCDH  ,      MOV    AH, HIGH CONST 等價於

MOV    AH,0ABH

三。數據定義語句:variable_name    Mnemonic     oper1, oper2.....

常用的助記符Mnemonic有:

 DB 定義字節,表示其后每個操作數占有一個字節(1Byte)單元

 DW 定義字,表示表示其后每個操作數占有一個字(2Byte)單元

 DD 定義雙字,表示表示其后每個操作數占有兩個字(4Byte)單元

 DQ 定義四個字,表示表示其后每個操作數占有四個字(8Byte)單元

 DT 定義十個字節,表示表示其后每個操作數占有十個字(10Byte)單元,形成壓縮BCD碼.

data_byte     DB      10 , 4 , 10H , ?        //共定義了4個字節,其中 '?' 是保留單元

data_word    DW    100,?,100H            //共定義了3個字(6Byte)

str_aa            DB     'ABCDEFG'            //定義和初始化多於兩個能上能下字符的字符串時,只能使用DB偽指令.

四。符號定義語句(即常量)

name    EQU    expression                //定義

PURGE    name1,name2...               //解除

CONSTANT     EQU    256       //表示CONSTANT的值為256

五。段定義語句:SEGMENT ... ENDS、ASSUME、ORG

segmnet_name    SEGMENT    [align_type] [combine_type] [use_type] [class]

...

segment_name    ENDS    //SEGMENT和ENDS成對使用,把匯編語句分成段

對於數據段、附加段和堆棧段,一般是存儲單元定義、初始化數據、分配單元等偽指令.

對於代碼段,主要是指令序列和偽指令.

可選項說明:詳細信息 

定位類型align_type:說明段的起始地址就有怎有怎樣的邊界值.

        PARA    缺省項.  指定段的起始地址須從小段邊界開始,即以16進表示地址時最低位必須為0.

        BYTE     可從任何地址開始.

        WORD    必須從字的邊界開始,即段地址必須是偶數..

        DWORD  必須從雙字的邊界開始,即以16進制表示地址時最低位必須是4的倍數.

        PAGE     必須從頁的邊界開始,即以16時制表示地址時最低兩位必須為00.(能被256整除)

組合類型combine_type:說明程序連接的段合並方法.

        PRIVATE    缺省項.為私有段,連接時不與其他模塊中的同名分段合並.

        PUBLIC       將與相同名字的其它分段合並.

        COMMON  將與相同名字的其它分段合並且會產生覆蓋.

        MEMORY   同PUBLIC.

        STACK        指定該段在運行時為堆棧的一部分.

使用類型use_type:只適用386及其后繼機型,用來說明是USE16(16位尋址)還是USE32(32位尋址).

類別class:用引號中給出連接時組成段組的類型名.

ASSUME使匯編程序在匯編指令時,能知道各段寄存器的值.

ASSUEM    segment_registername : segment_name , segment_registername : segment_name...

任何對存存儲器或堆棧的訪問的指令,都將使用CS、DS、ES和SS段寄存器的值才能形成真正的物理地址.

ASSUME只指定某個段分配給某個寄存器,並不能把段地址裝入段寄存器.

所以,DS、ES、SS段寄存器的值必須通過MOV指令來賦予,CS段寄存器在程序初始化時自動完成.

為了給存儲單元設置起始偏移地址,可以用ORG偽指令.

ORG    表達式    //表達式的值范圍必須在0 ~ +65535

偽指令ORG可設置於代碼段、數據段的任何地方.

mydata    SEGMENT            //段定義,段名為mydata

ORG     100H                     //置mydata段的起始偏移地址為100H

 X    DB    12H , ? , 30H     //數據定義,X 的偏移地址為0100H, X+1=0101H, X+2=0102H

    Z    DD    9C56H               //Z的偏移地址為0103H

mydata    ENDS

mycode    SEGMENT

    ASSUME    CS : mycode ,  DS : mydata    //用ASSUME偽指令分配段寄存器

    start:     MOV AX , mydata  //等價於MOV AX , SEG X語句, 將mydata段的起始地址裝入到DS

                  MOV DS , AX

    ...

mycode    ENDS

    END     start      //源程序結束指令END, 其中start為lable

六。過程定義語句:PROC ... ENDP

procedure_name    PROC    [ NEAR | FAR ]  //要說明是NEAR過程或FAR過程.

...

RET        //RET 返回指令必須與[ NEAR  |  FAR ] 對應

procedure_name    ENDP        //PROC 和ENDP必須有名字,兩者成對出現.

七。宏指令語句:MACRO...ENDM

macro_name    MACRO    [ parameter_list ]    //形參 parameter_list 可選,有多個參數時,中間用逗號隔開.

...

ENDM

MULTIPLY    MACRO    OPR1 , OPR2 , RESULT    //宏定義,宏名MULTIPLY,形參為OPR1,OPR2和RESULT

        PUSH    DX

        PUSH    AX

        MOV    AX , OPR1

        IMUL    OPR2

        MOV    RESULT , AX

        POP    AX

        POP    DX

ENDM

MULTIPLY    240 , BX , SAVE    //宏調用,實參為240 , BX , SAVE

宏指令與子程序的區別:

子程序產生目標代碼少,占用內存少,但執行時間長,速度慢.

宏指令產生目標代碼長,占用內存多,但執行時間短,速度快.

八。程序開始和結束語句:NAME | TITLE、END

模塊名:NAME    moudle_name

標題名:TITLE    text

源程序結束指令:END    [ lable ]

   

來自 <http://blog.sina.com.cn/s/blog_4a92ce12010006m2.html>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM