第四章 匯編語言語法和DOS調(diào)用_第1頁
第四章 匯編語言語法和DOS調(diào)用_第2頁
第四章 匯編語言語法和DOS調(diào)用_第3頁
第四章 匯編語言語法和DOS調(diào)用_第4頁
第四章 匯編語言語法和DOS調(diào)用_第5頁
已閱讀5頁,還剩79頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

本章要點匯編語言格式偽指令宏指令系統(tǒng)功能調(diào)用第四章匯編語言語法和DOS功能調(diào)用4.3偽指令4.4宏指令4.5DOS系統(tǒng)功能調(diào)用4.2匯編語言基本語法4.1匯編語言程序基本格式04.1匯編語言程序的格式

一、匯編語言概述

機器語言是計算機能直接識別和執(zhí)行的語言,用一串“0”、“1”數(shù)字代碼表示。

匯編語言是一種符號語言,它用某種容易記憶的英文縮寫去表示機器指令操作碼(指令助記符),用人們熟悉的數(shù)碼及數(shù)學符號等表示操作數(shù)、地址。二、匯編語言源程序和匯編程序用匯編語言編寫的程序稱為匯編語言源程序,或簡稱為源程序。對程序員來講,符號語言簡單直觀、便于記憶,比二進制數(shù)表示的機器語言方便了許多。但計算機只“認識”機器語言而不認識這些文字、數(shù)字、符號,為此人們創(chuàng)造了一種程序,叫匯編程序。如同英漢之間對話需要“翻譯”一樣,匯編程序的作用相當于一個“翻譯員”,自動地把匯編語言源程序翻譯成機器語言。該過程稱為匯編,完成匯編任務(wù)的程序稱為匯編程序,相應(yīng)形成的機器語言程序稱為目標程序。匯編后形成的目標程序雖然是二進制代碼,但還不能直接上機運行,必須經(jīng)過連接程序(LINK)連接,將庫文件或其它目標文件連接到一起形成可執(zhí)行文件后,才能送入計算機執(zhí)行。匯編語言程序從建立到匯編、連接形成可執(zhí)行程序的整個過程如圖所示。

MyProg.ASM匯編程序編輯程序MyProg.OBJ連接程序MyProg.EXE1例4.1試求小于100的所有非零偶數(shù),并把結(jié)果存入以BUFF開始的內(nèi)存區(qū)1MY_DATASEGMENT;定義數(shù)據(jù)段 2BUFFDB50DUP(?);設(shè)置緩沖區(qū)3MY_DATAENDS ;定義數(shù)據(jù)段結(jié)束 4MY_CODESEGMENT;定義代碼段 5ASSUMECS:MY_CODE,DS:MY_DATA;規(guī)定CS和DS的內(nèi)容6START:MOVAX,MY_DATA;DS初始化為MY_DATA 7MOVDS,AX MOVAL,2;置循環(huán)初始值9LEABX,BUFF210LLP:

MOV[BX],AL ;循環(huán)體11INCAL 12INCAL 13CMPAL,100 ;循環(huán)控制14JNZLLP 15INT20H;返回DOS 16MY_CODEENDS ;代碼段結(jié)束17END START

;整個程序結(jié)束

3三、匯編語言的特點1.執(zhí)行速度快2.程序短小3.可以直接控制硬件4.可以方便地編譯5.輔助計算機工作者掌握計算機體系結(jié)構(gòu)(1)段的結(jié)構(gòu)

NAME1 SEGMENT ;段的起始 語句1 ; 語句2 ;n條語句序列構(gòu)成的語句體 ┇ ┇ 語句n ;

NAME1 ENDS ;段的結(jié)束

NAME2 SEGMENT ;段的起始 語句1 ; 語句2 ;m條語句序列構(gòu)成的語句體 ┇ ┇ 語句m ;

NAME2 ENDS ;段的結(jié)束

END ;源程序結(jié)束4(2)語句的結(jié)構(gòu)3種基本語句類型:指令語句偽指令語句宏指令語句語句一般有4個部分組成,即:標號或名字操作碼操作數(shù);注釋標號或名字:這是一個任選部分,在語句之首54.2匯編語言中的基本數(shù)據(jù)

4.2.1常量、變量與標號

1.常量

⑴數(shù)值常量匯編語言中的數(shù)值常量可以是二進制、八進制、十進制或十六進制數(shù),書寫時用加后綴的方式標明即可,對于十進制數(shù)可以省掉后綴。對于十六進制數(shù),當以A~F開頭時,前面加數(shù)字0,以避免和名字混淆。⑵字符串常量包含在單引號中的若干個字符形成字符串常量,字符串在計算機中存儲的是相應(yīng)字符的ASCII碼。如‘A’的值是41H,‘AB’的值是4142H等。⑶符號常量常量用符號名來代替就是符號常量。用COUNTEQU3或COUNT=3定義后COUNT就是一個符號常量,與數(shù)值常量3等價。

2.變量

變量在數(shù)據(jù)段、附加數(shù)據(jù)段或堆棧段中定義,后面不跟冒號。它也可以用LABEL或EQU偽操作來定義。變量經(jīng)常在操作數(shù)字段出現(xiàn)。它也有段、偏移及類型三種屬性。段屬性:定義變量的段起始地址,此值必須在一個段寄存器中。

偏移屬性:變量的偏移地址是從段的起始地址到定義變量的位置之間的字節(jié)數(shù)。

類型屬性:變量的類型屬性定義該變量所保留的字節(jié)數(shù)。如BYTE(DB,1個字節(jié)長)、WORD(DW,2個字節(jié)長)、DWORD(DD,4個字節(jié)長)、FWORD(DF,6個字節(jié)長)、QWORD(DQ,8個字節(jié)長)、TBYTE(DT,10個字節(jié)長),這一點在數(shù)據(jù)定義偽操作中已作了說明。在同一個程序中,同樣的標號或變量的定義只允許出現(xiàn)一次,否則匯編程序會指示出錯。63.標號

標號在代碼段中定義,后面跟著冒號:,它也可以用LABEL或EQU偽操作來定義。此外,它還可以作為過程名定義。標號經(jīng)常在轉(zhuǎn)移指令或CALL指令的操作數(shù)字段出現(xiàn),用以表示轉(zhuǎn)向地址。標號有3種屬性:段、偏移及類型。

段屬性:定義標號的段起始地址,此值必須在一個段寄存器中,而標號的段則總是在CS寄存器中。

偏移屬性:標號的偏移地址是從段起始地址到定義標號的位置之間的字節(jié)數(shù)。對于16位段是16位無符號數(shù);對于32位段則是32位無符號數(shù)。

類型屬性:用來指出該標號是在本段內(nèi)引用還是在其他段中引用的。如是在段內(nèi)引用的,則稱為NEAR。對于16位段,指針長度為2字節(jié);對于32位段,指針長度為4字節(jié)。如在段外引用,則稱為FAR。對于16位段,指針長度為4字節(jié)(段地址2字節(jié),偏移地址2字節(jié));74.2.2運算符與表達式1.算術(shù)運算符

算術(shù)運算符有:+(加)、-(減)、*(乘)、/(除)、MOD(取余除)。

MOVAL,4*8+5

;數(shù)值表達式

MOVSI,OFFSET BUF+12

;地址表達式2.邏輯運算符

邏輯運算符有:AND(與)、OR(或)、XOR(異或)、NOT(非)。邏輯運算符只能用于數(shù)值表達式中,不能用于地址表達式中。邏輯運算符和邏輯運算指令是有區(qū)別的。邏輯運算符的功能在匯編階段完成,邏輯運算指令的功能在程序執(zhí)行階段完成。在匯編階段,指令A(yù)NDAL,78HAND0FH等價于指令A(yù)NDAL,08H。3.關(guān)系運算符

關(guān)系運算符有:EQ(相等)、LT(小于)、LE(小于等于)、GT(大于)、GE(大于等于)NE(不等于)。關(guān)系運算符要有兩個運算對象。兩個運算對象要么都是數(shù)值、要么都是同一個段內(nèi)的地址。運算結(jié)果為真時,表示為0FFFFH,運算結(jié)果為假時,表示為0000H。指令MOVBX,32EQ45等價于MOVBX,0

指令MOVBX,56GT30等價于MOVBX,0FFFFH

84.取值運算符

變量和標號具有段屬性、偏移屬性和類型屬性等,要從變量和標號中析出它們的段地址、偏移地址,變量的類型、元素的個數(shù)和占用內(nèi)存的大小等,就要使用取值運算符(又稱分析運算符)。這些運算符是SEG、OFFSET、TYPE、LENGTH、SIZE。例如:SCOREDW30DUP(0)定義了一個變量,TYPESCORE為2,LENGTHSCORE是30,而SIZESCORE是60。95.合成運算符也稱為修改屬性運算符,它能修改變量或標號的原有的類型屬性并賦予新的類型。這類運算符是PTR和THIS。

①PTR的格式:

類型PTR表達式其中類型可以是BYTE、WORD、DWORD、NEAR、FAR,表達式是被修改的變量或標號。例如NUM語句

NUMDB1,3,5,7

定義為字節(jié)類型,若要將NUM開始兩個字節(jié)的數(shù)據(jù)裝入AX,指令應(yīng)為

MOVAX,WORDPTRNUM②THIS的格式:

新符號名EQUTHIS類型原符號名類型參數(shù),…THIS的功能與PTR相同,只是格式不同。THIS語句中建立一個新的符號名并指定它有THIS后的類型,而新符號名指向下一語句的原符號名的內(nèi)存地址。例如前面用PTR修改NUM類型可用下面的THIS語句代替。

DNUMEQUTHISWORDNUMDB1,3,5,7

其中DNUM是字型并指向NUM所指的內(nèi)存單元,DNUM的存取以字為單位,而NUM仍是字節(jié)類型。101.數(shù)據(jù)定義偽指令格式:

[變量]助記符操作數(shù),…,操作數(shù)[;注釋]助記符字段說明所用偽指令的助記符,也即偽指令,說明所定義的數(shù)據(jù)類型。常用的有以下幾種:

DB

偽指令用來定義字節(jié),其后的每個操作數(shù)都占有一個字節(jié)(8位)。

DW

偽指令用來定義字,其后的每個操作數(shù)占有一個字(16位,其低位字節(jié)在第一個字節(jié)地址中,高位字節(jié)在第二個字節(jié)地址中)。

DD

偽指令用來定義雙字,其后的每個操作數(shù)占有兩個字(32位)。

DF

偽指令用來定義6個字節(jié)的字,其后的每個操作數(shù)占有48位,可用來存放遠地址。這一偽指令只能用于386及其后繼機型中。

DQ

偽指令用來定義4字,其后的每個操作數(shù)占有4個字(64位),可用來存放雙精度浮點數(shù)。

DT

偽指令用來定義10個字節(jié),其后的每個操作數(shù)占有10個字節(jié),形成壓縮的BCD碼。4.3偽指令語句11例4.2操作數(shù)是常數(shù)、表達式、字符串數(shù)據(jù)的定義

DATA1DB10H,52H DATA2DW1122H,34HDATA3DD5*20H,0FFEEHDATA4DB‘HELLO’例4.3操作數(shù)用“?”定義不確定值的變量,用DUP來定義重復變量,不確定值的變量一般用作保留存儲空間,以便存放運算結(jié)果。

DATA1DB?

DATA2DW0D55H,?

DATA3 DB5DUP(0)

DATA4DW10DUP(?)

DATA5DB4DUP(1,2DUP(20)

1210H52H22H11H34H00HA0H00H00H00HEEHFFH00H00H48H45H4CH4CH4FHDATA1DATA2DATA3DATA4圖4.1例4.2的匯編結(jié)果圖4.2例4.3的匯編結(jié)果?55H0DH00H00H00H00H00H??┇┇??01H14H14HDATA1DATA2DATA3DATA4DATA5重復4次,共12個字節(jié)共20個字節(jié)??圖4.3例4.4的匯編結(jié)果00H01H00H02H00H03H00H30HDATA1DATA2DATA3ONE的偏移地址TWO的偏移地址THREE的偏移地址THREE的段地址13例4.4當前已有變量ONE,標號TWO和THREE,用這些地址表達式定義新變量

DATA1DWONE DATA2DWTWO DATA3DDTHREE

142.標識符賦值與解除偽指令

⑴等值偽指令EQU

格式:<符號名>EQU<表達式>

例如:

CONSTANT EQU 256 ;將數(shù)256賦以符號名

B EQU [BP+8] ;變址引用賦以符號名B⑵等號偽指令

=

(與EQU類似,但=允許重復定義)

例如:EMP=6或EMPEQU6

⑶定義符號名偽指令LABEL:LABEL偽指令可以定義變量或標號的類型。格式:<符號名>LABEL<類型>;⑷解除定義偽指令PURGE:解除指定符號的定義。格式:PURGE<符號1,符號2,…,符號N>

解除符號定義后,可用EQU重新定義。

例如:

Y1 EQU 7 ;定義Y1的值為7PURGE Y1 ;解除Y1的定義

Y1 EQU 36 ;重新定義Y1的值為36153.段定義偽指令⑴SEGMENT和ENDS

段定義偽指令。該指令能對程序分段。其格式為:

段名SEGMENT[定位類型][組合類型][‘類別’]┇

段名ENDS⑵ASSUME

段寄存器指派偽指令。格式為:

ASSUME段寄存器:段名[,段寄存器:段名……]

例如:ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK⑶ORG

移動地址指針的偽指令。其格式為:

ORG常量表達式

例如:ORG2000H4.過程定義偽指令PROC和ENDP

過程名PROC[NEAR/FAR]┇RET

過程名ENDP

功能:定義一個由主程序可以用CALL指令調(diào)用的過程。165、

程序開始與結(jié)束偽指令語句共有4條偽指令語句:NAME、TITLE、ORG和END。1)目標模塊命名偽指令語句格式:NAME程序名

TITLE文本名功能:為源程序目標模塊賦一個程序名172)定位偽指令語句格式:ORG表達式例4.8用ORG指定數(shù)據(jù)段和代碼段地址。

DATASEGMENTX1DW20H,60H,

ORG100HX2DB10H,20H,30HORG200HX3DW1234H,4321HDATAENDS

CODESEGMENTORG100HASSUMECS:CODE,DS:DATASTART:MOVAX,DATA┋CODEENDS183)程序結(jié)束偽指令語句格式:END標號名例4.9程序結(jié)束偽指令語句的應(yīng)用

CODESEGMENTSTART:MOVAX,BXMOVCX,12H┋CODEENDSENDSTART196、

方式定義偽指令語句格式:.8086.3867、結(jié)構(gòu)定義偽指令語句有三條語句:結(jié)構(gòu)定義偽指令,結(jié)構(gòu)存儲分配和預(yù)置偽指令及 結(jié)構(gòu)使用偽指令。

1)結(jié)構(gòu)定義偽指令語句格式:結(jié)構(gòu)名STRUC

數(shù)據(jù)變量序列結(jié)構(gòu)名ENDS20例4.10定義一個數(shù)據(jù)表格TAB的結(jié)構(gòu)

TABSTRUCDA1DB‘ABCD’DA2DW?

DA3DWSEGLISDA4DW2DUP(0)

DA5DW1234H,4321HTABENDS212)結(jié)構(gòu)存儲分配和預(yù)置偽指令語句格式:結(jié)構(gòu)變量名結(jié)構(gòu)名<元素值,元素值…>結(jié)構(gòu)變量名結(jié)構(gòu)名NDUP(<元素值,元素值…>)例4.11對例4.10中的TAB結(jié)構(gòu)進行存儲空間分配和預(yù)置,形成4個結(jié)構(gòu)變量。DATA1TAB<>DATA2TAB<’1234’>DATA3TAB<,34H,SEGPLT>DATA4TAB5DUP(<‘WXYZ’,22H>)

223)結(jié)構(gòu)使用偽指令語句格式:結(jié)構(gòu)變量名·字段變量設(shè)當前數(shù)據(jù)段基址為1000H,結(jié)構(gòu)變量DATA1的偏移地址為100H,則例4.11中的4個結(jié)構(gòu)變量在存儲器中的地址分配如圖4-4所示。23(a)DATA1TAB<>(c)DATA3TAB<,34H,SEGPLT>(b)DATA2TAB<’1234’>(d)DATA4TAB5DUP(<‘WXYZ’,22H>)‘A’‘B’‘C’‘D’??SEGLIS低SEGLIS高00H00H00H00H34H12H21H43H10100H(a)‘1’‘2’‘3’‘4’??SEGLIS低SEGLIS高00H00H00H00H34H12H21H43H10110H(b)‘A’‘B’‘C’‘D’34H00HSEGPLT低SEGPLT高00H00H00H00H34H12H21H43H10120H(c)‘W’‘X’‘Y’‘Z’22H00HSEGLIS低SEGLIS高00H00H00H00H34H12H21H43H10130H(d)重復5次圖4.4例4.10中的4個結(jié)構(gòu)變量的存儲分配和預(yù)置248、分組偽指令語句格式:組名GROUP段1,段2,……例4.12┋GROUP1GROUPSEG1,SEG2,SEG3ASSUMEDS:GROUP1MOVAX,GROUP1MOVDS,AXMOVBX,GRPUP1:VAR1┋259、其它偽指令語句(l)外部偽指令語句格式:

PUBLIC名稱1,名稱2,…

EXTRN名稱1:類型,名稱2:類型,…例4.13用EXTRN和PUBLIC語句實現(xiàn)模塊間標識符的交叉訪問模塊1EXTRNDATA2:BYTE,SUBTR1:NEARPUBLICTABLE,DATA1DSEGSEGMENTTABLEDB100DUP(?)

DATA1DW?

CODESEGMENT

26DSEGENDSCODESEGMENT

ASSUMECS:CODE,DS:DSEG┇MOVAX,DSEGMOVDS,AX

MOVAL,DATA1CALLSUBTR1

MOVAX,SEGDATA2MOVES,AX

MOVBX,ES:DATA2┇CODEENDSEND27模塊2EXTRNTABLE:BYTEPUBLICSUBTR1,DATA2DSEGSEGMENTDATA2DB?┇

DSEGENDSCODESEGMENT┇SUBTR1:┇┇

CODEENDSEND28(2)對準偽指令語句格式:EVEN

例4.14EVEN直接放在某一語句前,匯編程序匯編時就會完成將地址調(diào)整在偶地址上。DATASEGMENTORG100HA1

DB0DHEVENA2DW100DUP(?)DATAENDS

29(3)條件匯編偽指令語句一般格式是:

IF;如果條件成立

[ELSE];[否則]

ENDIF;結(jié)束條件匯編語句IF有多種形式,它們是:IF操作數(shù)IFE操作數(shù)IFDEF標號或變量IFNDEF標號或變量IFB<變量>IFNB<變量>IFIDN<操作數(shù)l>,<操作數(shù)2>IFDIF<操作數(shù)1>,<操作數(shù)2>IF1IF2304.4匯編語言中的表達式表達式------運算對象和運算符組成。匯編語言中有6類運算符,即:①算術(shù)運算符;②邏輯運算符;③關(guān)系運算符;④分析運算符;⑤修改屬性運算符;⑥

其它運算符。311、算術(shù)運算符算術(shù)運算符有:加(+)、減(-)、乘(*)、除(/)、取模運算(MOD)、左移(SHL)和右移(SHR)。取模運算是取兩數(shù)相除的余數(shù),對象必須為正整數(shù)。例如

92MOD16結(jié)果為12(相當于取低4位的值)

97HMOD20H結(jié)果為23(相當于取低5位的值)

32例4.15包含乘法和減法算術(shù)運算符的表達式

DATASEGMENTARRAY

DB1,2,3,4,5,6TRY

DB 20DATAENDSCODESEGMENTMOV BX,30*5MOV CX,(TRY-ARRAY) ┇CODEENDS33例4.16源程序包含除法、減法、模運算和移位運算的表達式DATASEGMENTKA EQU 800DATAENDSCODESEGMENT MOV BX,KA-80 MOV AX,KAMOD100 MOV CX,KA/100 MOV DH,01100100BSHR2┇CODEENDS342、邏輯運算符邏輯運算符有:與(AND)、或(OR)、非(NOT)和異或 (XOR)

例4.17AND、OR、NOT、XOR邏輯運算的表達式DATASEGMENTPORTEQU 81HDATAENDSCODESEGMENTMOVAL,NOT0FFHMOVBL,8CHAND73H

MOVAH,8CHOR73HMOVCH,8CHXOR73H

35

INAL,PORTANDDX,PORTAND0FEHOUTDX,AX┇CODEENDS363、關(guān)系運算符關(guān)系運算符有:相等EQ、不等NE、小于LT、大于GT、小于 或等于LE、大于或等于。

4、分析運算符分析運算符有:OFFSET、SEG、TYPE、LENGTH、SIZE(1)OFFSET

格式:OFFSET變量或標號

37例4.18用OFFSET返回標號或變量偏移地址值的表達式DATASEGMENT┇DAT1DB 81HDATAENDSCODESEGMENTMOVSI,OFFSETLAB1┇

LAB1:MOVBX,OFFSETDAT1┇CODEENDS38(2)SEG

格式:SEG變量或標號(3)TYPE

格式:TYPE變量或標號表4-1TYPE運算符返回值變量標號類型DBDWDDDQDTNEARFAR返回值124810-1-239例4.19TYPE加在變量和標號前的表達式DATASEGMENTAA1DB20H,30HAA2DW0438HAA3DD?DATAENDSCODESEGMENTLL1:MOVAH,TYPEAA1MOVBH,TYPEAA2ADDAL,TYPEAA3MOVBL,TYPELL1CODEENDS40(4)LENGTH格式:LENGTH變量例4.20LENGTH加變量的表達式DATASEGMENTBB1DW100DUP(?)BB2DW1,2,3BB3DB‘ABCD’DATAENDSCODESEGMENTMOVCX,LENGTHBB1MOVBL,LENGTHBB2MOVAL,LENGTHBB3CODEENDS41(5)SIZE格式:SIZE變量把例4.20中含有LENGTH表達式改為SIZE表達式,即:

MOVCX,SIZEBB1MOVBL,SIZEBB2MOVAL,SIZEBB3425、修改屬性運算符(綜合運算符)修改屬性運算符有:段操作符、PTR、THIS、HIGH、LOW、

SHORT

(1)段操作符格式:段前綴:變量或地址表達式(2)PTR

格式:類型PTR變量距離PTR標號43例4.21帶PTR表達式的變量DATASEGMENTCC1DB16H,36HCC2DW1122H,3344HDATAENDSCODESEGMENTLL1:

MOVAX,WORDPTRCC1MOVBL,BYTEPTRCC2MOVBYTEPTR[BX],10HMOVWORDPTR[BX],10H┇JMPFARPTRLL1┇CODEENDS44(3)THIS格式:變量EQUTHIS類型標號EQUTHIS距離例如:

DATA1EQUTHISBYTETABLEDW200DUP(?)又如:

LL1EQUTHISFARMOVAX,100

45(4)SHORT

格式:SHORT標號(5)HIGH和LOW它們稱為字節(jié)分離運算符格式:HIGH變量或標號

LOW變量或標號46

例4.22帶HIGH和LOW表達式的變量DATASEGMENTBB1EQU1234HBB2EQU0A0B0HDATAENDSCODESEGMENTMOVAH,HIGHBB1MOVBL,LOWBB2CODEENDS476、其它運算符7、注意點:(1)注意表達式中各運算符和操作符的優(yōu)先級(2)注意數(shù)制統(tǒng)一

484.5指令語句指令語句的格式:標號:前綴指令助記符操作數(shù);(注釋)(1)立即尋址和直接尋址的表示形式例4.23立即尋址和直接尋址在表示形式上的區(qū)別DATASEGMENTBB1EQU1234HBB2DW0A0B0HDATAENDSCODESEGMENTMOVAX,BB1MOVBX,BB2MOVCX,[BB1]CODEENDS

49(2)基址寄存器加變址寄存器尋址的表示形式有兩種表示形式:

MOVAX,[BX][SI]MOVAX,[BX+SI](3)相對寄存器尋址的表示形式50例4.24相對寄存器尋址的兩種表示形式DATASEGMENTMYDATDB100DUP(?)DATAENDSCODESEGMENT┇MOVAX,MYDAT[BX]MOVAX,[MYDAT+BX]MOVCX,MYDAT[BX][SI]MOVCX,[MYDAT+BX+SI]CODEENDS514.6宏指令語句及其使用宏指令—將源程序中多次重復使用的程序段用宏指令來代替1.宏指令定義

宏指令名 MACRO[形式參數(shù)1,形式參數(shù)2,…形式參數(shù)N]┇;宏指令體(宏體)

ENDM2.宏調(diào)用

宏指令名實際參數(shù)1,實際參數(shù)2,…實際參數(shù)N3.宏展開

52例4.25無形式參數(shù)的宏定義、宏調(diào)用及宏展開宏定義:PUSHABMACROPUSHAXPUSHBXENDM宏調(diào)用:PUSHAB宏展開:+PUSHAX+PUSHBX53例4.26帶形式參數(shù)的宏定義、宏調(diào)用及宏展開宏定義:

LDSFMACROPR,VAR,N,REG,CCMOVPR,VARMOVAX,[PR]MOVCL,NS&CCREG,CLENDM宏調(diào)用1:LDSFSI,WVAR1,4,AX,AR宏調(diào)用2:LDSFDI,WVAR2,3,BX,AL宏展開1:+MOVSI,WVAR1+MOVAX,[SI]+MOVCL,4+SARAX,CL宏展開2:+MOVDI,WVAR2+MOVAX,[DI]+MOVCL,3+SALBX,CL

544、宏嵌套(1)宏定義中使用宏調(diào)用例2.27設(shè)在程序的數(shù)據(jù)段已經(jīng)定義了變量X,Y,Z,試計算X+Y→Z,并要求保護所有使用的寄存器。宏定義:DBFMACROP,QMOVBX,PMOVAX,QADDAX,BXENDMDBFSMACROX1,X2,X3PUSHAX55

PUSHBXDBFX1,X2MOVX3,AXPOPBXPOPAXENDM宏調(diào)用:DBFSX,Y,Z宏展開:+PUSHAX+PUSHBX +MOVBX,X+MOVAX,Y+ADDAX,BX+MOVZ,AX+POPBX+POPAX56(2)宏定義中包含宏定義例2.28設(shè)在程序的數(shù)據(jù)段已經(jīng)定義了變量X,Y,Z,試共用一個宏定義,計算X+Y→Z、X-Y→Z、XANDY→Z,并要求保護所有使用的寄存器。宏定義:DEFMMACROMACN,OPENMACNMACROA,B,CPUSHAXMOVAX,AOPENAX,BMOVC,AXPOPAXENDMENDM57宏調(diào)用定義加法:

DEFMADDIT,ADD宏展開:+ADDITMACROA,B,CPUSHAXMOVAX,AADDAX,BMOVC,AXPOPAXENDM宏調(diào)用定義減法:

DEFMSUBT,SUB宏展開:+SUBTMACROA,B,CPUSHAXMOVAX,ASUBAX,B

58

MOVC,AXPOPAXENDM宏調(diào)用定義邏輯“與”:

DEFMANDT,AND宏展開:+ANDTMACROA,B,CPUSHAXMOVAX,AANDAX,BMOVC,AXPOPAXENDM宏調(diào)用實現(xiàn)X+Y→Z:

ADDITX,Y,Z宏展開:+PUSHAX59

+MOVAX,X+ADDAX,Y+MOVZ,AX+POPAX宏調(diào)用實現(xiàn)X-Y→Z:

SUBTX,Y,Z宏展開:+PUSHAX+MOVAX,X+SUBAX,Y+MOVZ,AX+POPAX宏調(diào)用實現(xiàn)XANDY→Z:

ANDTX,Y,Z60宏展開:+PUSHAX+MOVAX,X+ANDAX,Y+MOVZ,AX+POPAX5、宏定義中的標號與變量

定義局部標號的格式:

LOCAL參數(shù)1、參數(shù)2、……參數(shù)n

例4.29延時宏指令語句

61宏定義:

DELAYMACROVALUE1,VALUE2LOCALAGAIN1,AGAIN2PUSHAXPUSHCXMOVCX,VALUE1AGAIN1:MOVAX,VALUE2AGAIN2:DECAXJNZAGAIN2LOOPAGAIN1POPCXPOPAXENDM宏調(diào)用1:DELAY1234H,5678H62宏調(diào)用2:DELAY9ABCH,0DEF0H宏展開1:DELAY1234H,5678H

+PUSHAX

+PUSHCX

+MOVCX,1234H

+??0000:MOVAX,5678H

+??0001:DECAX

+JNZ??0001

+LOOP??0000

+POPCX

+POPAX宏展開2:DELAY9ABCH,0DEF0H

+PUSHAX

+PUSHCX63+MOVCX,09ABCH

+??0002:MOVAX,0DEF0H

+??0003:DECAX

+JNZ??0003

+LOOP??0002

+POPCX

+POPAX6、其它宏指令語句(1)取消宏指令語句格式:PURGE宏指令名1,宏指令名2……宏指令名n64(2)重復執(zhí)行宏指令語句格式:REPT表達式宏體

ENDM例4.30將1到10分配給連續(xù)的10個存儲單元,

X=0

REPT10

X=X+1

DB

X

ENDM宏展開后:+DB1

+DB2┇

+DB1065(3)帶參數(shù)的重復執(zhí)行宏指令格式:LRP形式參數(shù)〈參數(shù)表〉宏體ENDM

例如:

LRP REG 〈AX,BX,CX,DX〉

PUSH

REG

ENDM宏展開后: +PUSH

AX

+PUSH

BX

+PUSH

CX

+PUSH

DX66(4)帶字符串重復執(zhí)行宏指令

格式:LRPC形式參數(shù)〈字符串〉宏體

ENDM例如:

LRPC

X,〈HELLO〉

DB X

ENDM宏展開后: +DB 48H

+DB 45H

+DB 4CH

+DB 4CH

+DB 4FH677、宏指令與子程序的區(qū)別主要區(qū)別在以下幾個方面:(1)宏指令調(diào)用比子程序調(diào)用執(zhí)行速度快。(2)過程調(diào)用使用CALL語句實現(xiàn),在CPU執(zhí)行時進行處理,而宏指令調(diào)用由宏匯編軟件MASM中的宏處理程序來處理。(3)子程序比宏指令節(jié)省內(nèi)存空間。(4)宏指令比子程序靈活。684.7DOS系統(tǒng)功能調(diào)用1、常用的DOS軟中斷(1)程序結(jié)束軟中斷①INT20H調(diào)用格式舉例:INT20H②INT21H該軟中斷又有三種情況:無返回程序結(jié)束、程序結(jié)束并駐留和帶 返回程序結(jié)束。無返回程序結(jié)束的調(diào)用格式:MOVAH,0INT21H69程序結(jié)束并駐留的調(diào)用格式舉例:MOVAH,31HMOVAL,1MOVDX,400HINT21H

帶返回程序結(jié)束的調(diào)用格式舉例:MOVAH,4CHMOVAL,1INT21H

70③

INT27H調(diào)用格式舉例:MOVDX,XXINT27H(2)磁盤扇區(qū)讀與寫調(diào)用格式舉例:

MOVAL,0MOVCX,3MOVDX,4MOVBX,2000HINT25H712、DOS系統(tǒng)功能調(diào)用DOS系統(tǒng)功能可分為三個方面:設(shè)備管理、文件管理和目錄管理設(shè)備管理包括:鍵盤輸入、顯示輸出、設(shè)置磁盤緩沖器、選擇當 前盤等功能調(diào)用;文件管理包括:建立文件、打開文件、讀/寫文件、刪除文件等 功能調(diào)用;目錄管理包括:查找目錄項、更改目錄項、建立子目錄、刪除子 目錄等功能調(diào)用。

72表4-2常用的DOS軟中斷

軟中斷指令功能入口參數(shù)出口參數(shù)INT21H程序正常退出無無INT21H系統(tǒng)功能調(diào)用AH=功能號,相應(yīng)入口號相應(yīng)出口號INT22H結(jié)束退出INT23HCtrl+Break處理INT24H出錯退出INT25H讀磁盤AL=驅(qū)動器號CX=讀入扇區(qū)數(shù)DX=起始邏輯扇區(qū)號DS:BX=內(nèi)存緩沖區(qū)地址CF=0成功CF=1出錯INT26H寫磁盤AL=驅(qū)動器號CX=寫入扇區(qū)數(shù)DX=起始邏輯扇區(qū)號DS:BX=內(nèi)存緩沖區(qū)地址CF=0成功CF=1出錯INT27H駐留下退出DS:BX=程序長度73(1)顯示功能調(diào)用①單字符顯示調(diào)用格式舉例:

MOVDL,‘*’

MOVAH,2INT21H②

字符串顯示調(diào)用格式舉例:在屏幕上顯示‘HOWAREYOU?’字符串74DATA

SEGMENTCR

EQU0DHLF

EQU0AHDAT1DB‘HOWAREYOU?’,CR,LF,‘$’DATAENDSCODE

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論