大三上學期課程2微機系統(tǒng)全第4章_第1頁
大三上學期課程2微機系統(tǒng)全第4章_第2頁
大三上學期課程2微機系統(tǒng)全第4章_第3頁
大三上學期課程2微機系統(tǒng)全第4章_第4頁
大三上學期課程2微機系統(tǒng)全第4章_第5頁
已閱讀5頁,還剩121頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第四章匯編語言程序設(shè)計一、匯編語言和匯編程序二、8086/8088宏匯編語言程序規(guī)范三、指令及其應(yīng)用四、結(jié)構(gòu)與記錄五、宏指令及其應(yīng)用六、程序設(shè)計的基本步驟七、程序的基本結(jié)構(gòu)及基本程序的設(shè)計八、聲音和動畫設(shè)計九、應(yīng)用程序設(shè)計實例十、在DOS環(huán)境下建立建立和運行匯編語言程序的過程4.1匯編語言和匯編程序一.匯編語言:是一種面向CPU指令的程序設(shè)計語言。用匯編語言編寫的程序稱為匯編語言程序或匯編語言源程序。二.匯編程序匯編程序是用來將匯編語言程序翻譯成機器代碼的系統(tǒng)(工具)程序。匯編語言源程序匯編語言目標程序文件源程序列表.ASM.OBJ.LST翻譯(一)匯編程序的種類

1.自匯編程序和交叉匯編程序

2.基本匯編、小匯編和宏匯編

3.一次掃描和兩次掃描的匯編(二)8086/8088宏匯編程序MASM.EXE

宏匯編程序MASM.EXE5.00以及對應(yīng)的連接程序LINK.EXE4.28086/8088宏匯編語言程序規(guī)范語句類型指令語句:以8086/8088指令為基本部分,必要時加上標號及注釋構(gòu)成。每一條語句產(chǎn)生相對應(yīng)的目標代碼。偽指令語句:為匯編程序和連接程序提供一些必要控制的管理性語句。匯編時,偽指令不產(chǎn)生目標代碼。宏指令語句:由標號、宏指令和注釋構(gòu)成。匯編時,將宏指令展開還原為定義時的多條語句,再逐條匯編。二.匯編語言語句的四個域一個語句行的基本格式為:

[標識符]操作符操作數(shù)1[,操作數(shù)2];[注釋]

1.標識符(名字)?

標識符可由數(shù)字、字母和下劃線等一串字符構(gòu)成,用于一段程序、一組(或一個)數(shù)據(jù)或一個段的開頭。使用時要注意以下3點:?

不能以數(shù)字開頭,數(shù)字可用在非開頭的其它位置;?

其最大長度為31個字符。指令語句中的名字后跟冒號,而偽指令的名字之后不跟冒號。2.操作符

可以是指令、偽指令或宏指令的助記符。3.

操作數(shù):可以是常數(shù)、寄存器名、標號、變量和表達式。

(1)常數(shù)常量就是指令中的一些不變的數(shù)據(jù)。它可以用二進制、十六進制、十進制和八進制表示,也可以用引號引起來的字串。例如:二進制:00011101B

十六進制:0C5AAH

十進制:9856D

八進制:237O

字串:’The2Xmeans2multipleX’

其中的B、H、D和O為數(shù)制的結(jié)尾符。(2)符號

在8086/8088匯編語言的源程序中為了使程序有很好的可讀性和易修改性,通常使用有一定意義的符號來代替某些單元、數(shù)據(jù)或表達式。符號可分為四類:寄存器、變量、標號、數(shù)。如SUM、DATA1。1.寄存器

8086/8088的寄存器是程序中最常出現(xiàn)的符號,它可分為字節(jié)寄存器和字寄存器,如AX為字寄存器,而AL則為字節(jié)寄存器。只有AX、BX、CX、DX可分為字和字節(jié)寄存器。2.變量變量是存放在某些存儲單元中的操作數(shù),使用有一定意義的符號來代表這些單元。所有的變量都有一個固定的地址(用變量名代表),它由段和偏移地址組成;同時還有一個類型,它可以是字節(jié)(BYTE)、字(WORD)或雙字(DWORD)。在程序中,變量可以使用數(shù)據(jù)定義偽指令進行初始化,見偽指令一節(jié)中的數(shù)據(jù)定義部分。3.標號

標號實際上是用符號表示的地址(其指令語句的符號地址),因此它也是由段、偏移地址和類型組成,其類型分為段內(nèi)(NEAR)和段間(FAR)兩種。通過

SEG標號

OFFSET標號可以分別得到標號的段地址和偏移地址。如果是NEAR類型,在程序執(zhí)行時,只取標號的偏移地址,例如在過程調(diào)用(CALL)時,只取IP,而對于FAR類型,則要取段地址和偏移地址,在CALL時要取IP和CS。4.數(shù)在程序設(shè)計中,為了程序有良好的可讀性和可修改性,有些數(shù)據(jù)使用符號來表示,通過偽操作,將數(shù)據(jù)與某些符號相聯(lián)系。(3)表達式

表達式由操作數(shù)和運算符組成,如3+2、77AND55、NOT5AH等。1.操作數(shù)操作數(shù)用于代表一個數(shù)據(jù)或一個地址。2.運算符運算符包括算術(shù)、邏輯、關(guān)系、分析、綜合五類運算符。見表4-1表4-18086匯編語言中的運算符算術(shù)運算符邏輯運算符關(guān)系運算符分析運算符綜合運算符+(加法)AND(與)EQ(相等)SEG(求段基址)PTR-(減法)OR(或)NE(不相等)OFFSET段屬性前綴*(乘法)XOR(異或)LT(小于)TYPETHIS/(除法)NOT(非)GT(大于)SHORTMOD(求余)LESIZEHIGHSHL(左移)GELENGTHLOWSHR(右移)①算術(shù)運算符包括+、-、*、/、MOD

參加運算的內(nèi)容可以是數(shù)據(jù),也可以是地址,但在一個算術(shù)運算符的兩邊不能都是地址。例:算術(shù)運算符的用法。

DATASEGMENTVR DB1,3,5,6DATAENDSCODE SEGMENT…MOVAH,VR+2;AH=5 MOVAL,3*10-20 MOVBH,10MOD3 MOVBL,01010BSHL4

邏輯運算符包括

AND、OR、NOT、XOR

邏輯運算符對其操作數(shù)進行按位運算,且要求操作數(shù)為數(shù)值表達式。例:邏輯運算符運用。

MOVAX,0F00FHAND253BH;AX=200BH

MOVAC,0F00FHOR253BH;AX=F53FHMOVAC,0F00FHXOR253BH;AX=D534H③關(guān)系運算符包括相等:EQ

大于:GT

不等:NE

小于或等于:LE

小于:LT

大于或等于:GE

關(guān)系運算結(jié)果只有兩個——真、假。

如果關(guān)系是真,則結(jié)果為0FFH(0FFFFH);如果關(guān)系是假,則結(jié)果為0。例如:MOVBX,DATA1LT0010HMOVBX,0FFFFH

MOVBX,DATA1LT0010HMOVBX,0當DATA1<0010H時

當DATA1>0010H時

④分析運算符

分析運算在匯編語言程序設(shè)計中很重要。

存儲器地址操作數(shù)(變量和標號)具有段、偏移量及類型三種屬性,分析運算符用來分離出一個存儲器地址操作數(shù)的這三種屬性,并用數(shù)值的方法表達出來。它包括:取存儲單元偏移:OFFSET

取存儲單元段:

SEG

取類型:TYPE

取字節(jié)數(shù):

SIZE

按類型取長度:LENGTH求存儲器地址操作數(shù)的三個屬性求變量的字節(jié)數(shù)和長度表4-2存儲器操作數(shù)的類型值

存儲器操作數(shù)類型值

字節(jié)數(shù)據(jù)(DB定義)1

字型數(shù)據(jù)(DW定義)2

雙字數(shù)據(jù)(DD定義)4NEAR指令單元-1FAR指令單元-2例1:

設(shè)有數(shù)據(jù)段中使用

DATA1DB05H,A2H,0,10H,85H則

MOVAL,DATA1可將DATA1中的數(shù)傳送到AL中,AL=05HMOVAX,SEGDATA1可將DATA1的所在段地址傳到AX中,AX=2000HMOVAX,OFFSETDATA1可將DATA1的偏移地址傳入AX中,AX=1500H例2:

設(shè)有數(shù)據(jù)段中使用

DATA2DW100DUP(?)定義了100個字單元,則

MOVAX,TYPEDATA2;AX=2MOVAX,SIZEDATA2;AX=200MOVAX,LENGTHDATA2;AX=10005A2001085DSCSDATA12000:1500例:分析運算符應(yīng)用舉例下面定義的數(shù)據(jù)段DATA,設(shè)段基址從40000H開始。DATA SEGMENTV1 DB2AH,3FHV2 DW2A3FH,3040HV3 DD12345678H,12ABCDEFHV4 DW20DUP(1)DATA ENDS① MOVAX,SEGV1 ;AX=4000H MOVBX,SEGV2 ;BX=4000H MOVCX,SEGV3 ;CX=4000H② MOVAX,OFFSETV1 ;AX=0 MOVBX,OFFSETV2;BX=2 MOVCX,OFFSETV3 ;CX=62A3F3F2A403078563412EFCDAB1201000100……010040000HV1V2V3V440個字節(jié)③ MOVAX,TYPEV1 ;AX=1 MOVBX,TYPEV2 ;BX=2 MOVCX,TYPEV3 ;CX=4④ MOVAX,LENGTHV4 ;AX=20 MOVBX,SIZEV4 ;BX=40而:

MOVAH,LENGTHV1 ;AH=1 MOVAL,SIZEV1 ;AL=1 MOVBH,LENGTHV2 ;BH=1 MOVBL,SIZEV2 ;BL=2 MOVCH,LENGTHV3 ;CH=1 MOVCL,SIZEV3 ;CL=4注:對于形如V1、V2、V3格式定義的變量,運算符LENGTH和SIZE只對DB、DW和DQ定義的多項逗號分開的數(shù)據(jù)項的第一項有效。注意!

上述表達式中運算符的求值的操作不是在程序執(zhí)行的時候完成,而是在對源程序進行匯編(編譯)的時候完成.⑤綜合運算符綜合運算符包括兩個地址操作符PTR和THIS。PTR——改變存儲器地址操作數(shù)的操作類型,但其段地址和偏移地址不變。格式為:類型

PTR存儲器地址表達式作用:PTR將其左邊的類型指定給其右邊的地址。其中:類型可取BYTE、WOTD、DWORD、NEAR或FAR

PTR運算符在一已知的存儲器地址操作數(shù)的基礎(chǔ)上生成一個段基址和偏移量均不變,而只是類型改變的一個新的存儲器地址操作數(shù)。則語句MOVAL,DATA2;錯而應(yīng)為:MOVAL,BYTEPTRDATA205A2001085DSDATA2例:DATA1DB05H,A2H,0,10H,85HDATA2EQUWORDPTRDATA1

則DATA2和DATA1的段基址和偏移量均相同,但類型不同,DATA1是BYTE型,而DATA2是WORD型。DATA1THIS——用來建立新的存儲器地址操作數(shù),但不分配存儲單元。新的操作數(shù)類型在THIS中指定,而其段地址和偏移量就是匯編時的當前值。用THIS的變量與下一個變量有相同的段基址和偏移量,但兩者類型不同。格式為:

變量/標量EQUTHIS類型例如:V11EQUTHISWORD V1 DB 20H,30H

則:變量V11與V1具有相同的段和偏移量,但V11是WORD型變量,而V1是BYTE型變量。

例:

DATA1SEGMENTWBUFFER EQUTHISWORDBUFFERDB12H,34H,00H,91H

DATA1ENDSCODE1 SEGMENTASSUMECS:CODE1,DS:DATA1START:MOVAX,DATA1MOVDS,AX

MOVAL,BUFFERMOVBX,WBUFFER

……

CODE1ENDSENDSTART12340091DSBUFFERWBUFFERAL=12HBX=3412H4.注釋

注釋是用于使程序易于理解的句子,用來表示某行或某段語句的作用或與其它部分的關(guān)系,一般寫在某語句的后面或某段的開始處,注釋的前面由“;”前導,表示后面的內(nèi)容為注釋。如果一行寫不下,換行后也要使用“;”前導。三.匯編語言程序的結(jié)構(gòu)匯編語言程序也是分段編寫的,每段最長64K。

8088匯編語言的源程序是由多個段組成的,一個可執(zhí)行的匯編程序一般至少有一個代碼段,其中包含可執(zhí)行的語句。其基本格式如以下例題:例:一個簡單的匯編程序05A2001085array1array2DSCSmy_datasegmentagain:Moval,[si]array1db05,a2H,00,10H,85HIncsinequ5Cmpal,50array2dbndup(?)Jbenext

my_dataendsMov[di],almy_codesegmentIncdi

assumecs:my_codenext:deccxassumeds:my_datajnzagainbegin:movax,my_datamovah,4chmovds,axint21hLeasi,array1

my_codeends

Leadi,array2endbeginMovcx,n4.3偽指令及其應(yīng)用

在8086/8088匯編語言中偽指令是用于諸如數(shù)據(jù)定義、存儲區(qū)分配等功能。所謂偽指令是非機器指令,它是在匯編期間進行操作的。(1)符號定義語句EQU和=

為了使程序便于閱讀和修改,我們有時使用一個符號來代表一個數(shù),而符號代表了一定的意義,在程序中使用一個符號代表一個數(shù)進行操作,其格式為:

符號名EQU/=表達式作用:將該指令右邊的數(shù)值或符號等價地賦予它左邊的符號。

表達式可以是一個常數(shù),或一個可以求出常數(shù)值的表達式,或一個寄存器名,或一個指令助記符。例如:

PORTEQU3F8H在程序中可使用

MOVDX,PORT

則等效于MOVDX,3F8H

又如:

STAT_PORTEQUPORT+2CNEQUCXBEQUDS:[BP+20]=號操作:

對符號的賦值還可使用“=”操作,格式為:符號名=表達式它與EQU的區(qū)別是“=”操作可以重復定義,而EQU則不能重復定義。如:

X=3Y=6Y=Y*Y-X……MOVAX,Y

通過上述操作,最后使Y=33,后面的MOV語句中,當生成目標代碼時將用33取代Y。即

MOVAX,21H(33D)(2)數(shù)據(jù)定義語句

數(shù)據(jù)定義語句用于為數(shù)據(jù)分配相應(yīng)的存儲單元。用一個符號名代表一個或一些單元,并可為這個或這些單元提供初始值。定義數(shù)據(jù)的操作符有:

字節(jié)定義——DB(每一數(shù)據(jù)項占一個字節(jié))字定義——DW(每一數(shù)據(jù)項占二個字節(jié))雙字定義——DD(每一數(shù)據(jù)項占四個字節(jié))四字定義——DQ(每一數(shù)據(jù)項占八個字節(jié))十字節(jié)定義——DT(每一數(shù)據(jù)項占十個字節(jié))重復定義——mDUP(n)(重復m次個數(shù)據(jù)n)

與數(shù)據(jù)相聯(lián)系的符號名稱為變量。

數(shù)據(jù)定義語句的格式為:

變量名操作符數(shù)據(jù)項表其中:數(shù)據(jù)項表由逗號分隔的表達式組成。例:通過下列定義,在存儲器中將產(chǎn)生如圖所示的結(jié)果,以DATA1到DATA5為例:

DATA1DB?;不置初值,為隨 機值

DATA2DW1000HDATA3DD3000A455HDATA4DB10,10HDATA5DW100,0240H,0360H

DS隨機001055A400300A10640040026003DATA1DATA2DATA3DATA4DATA5DSEFCDAB907856341243443132414242413433例:DATA6DQ1234567890ABCDEFHDATA7DB‘CD12’,‘AB’DATA8DW‘AB’,’34’DATA6CD12ABBA43

注意:1.用DW語句定義的字符串只允許包含兩個字符,若不是兩個字符,須用DB語句來定義。1:數(shù)據(jù)定義語句在存儲器中占有相應(yīng)的單元,而EQU只是定義了一個數(shù)據(jù),在匯編后以實際數(shù)據(jù)的形式體現(xiàn)在程序中。也就是說,EQU語句不會占有存儲單元。2:EQU可以用在指令中,而數(shù)據(jù)定義語句不可以。DATA7DATA8例:重復操作符DUP的應(yīng)用。格式:DB/DW/DD/DQ/DT<表達式>DUP(表達式)其中:DUP左邊的表達式表示重復的次數(shù),右邊的括號中的表達式表示要重復的內(nèi)容,括號中的表達式可以是:一個問號,表示不置初值,為隨機值;一個數(shù)據(jù)表,將相應(yīng)單元初始化;例:DATASEGMENTARRAY1DB2DUP(0,1,?)

ARRAY2DW100DUP(?)

ARRAY3DB20DUP(1,3DUP(2),5)

DATAENDS100個空出的字單元0001-0001--……-0102020205…0102020205ARRAY1ARRAY2ARRAY3重復20次共100個字節(jié)(3)標號定義偽指令LABEL作用:用來在某一變量或標號的基礎(chǔ)上定義一個新的類型不同的變量或標號。格式:變量名或標號名LABEL類型其中:變量的類型可用BYTE、WORD和DWORD;標號的類型有NEAR和FAR。例:VAR1LABELWORDVAR2DB20DUP(1)變量VAR1與VAR2有相同的段基址和偏移量,但類型不同。又如:L1LABELFARL2:MOVAX,1000H

標號L1與L2均為指令MOVAX,1000H的符號地址,但類型不同,L1具有FAR類型,L2卻是NEAR類型。(4)段定義語句

在段定義中,SEGMENT和ENDS總是成對使用的,它們將數(shù)據(jù)和程序分為多個段,如數(shù)據(jù)段、堆棧段和代碼段。

ASSUME是匯編時進行操作的,它用于在匯編時告訴匯編器,哪個是數(shù)據(jù)段,哪個是代碼段,哪個是堆棧段。

Segnamesegment[align_type];定位類型

[combine_type];組合類型

[‘class’];類別Segnameends其中:Segname:編程者給該段取的名字。定位類型:

para:指定段的起始地址必須從節(jié)的邊界開始,即段地址的最后1位(十六進制)必須為0。(為系統(tǒng)缺省值)

byte:該段可以從任何地址開始。Segment的類型及屬性說明——在需要用連接程序?qū)⒈境绦蚺c其它模塊相連接時,需要使用這些說明。word:該段必須從字的邊界開始,即段地址必須是偶數(shù)。

page:該段必須從頁的邊界開始,即段地址的最后2位(十六進制)必須為0。組合類型:

public:該段在連接時將與其它同名同類別的段相鄰地連接在一起。

common:該段在連接時與其它同名同類別的段有相同的起始地址(會產(chǎn)生覆蓋)。

atexpression:使段的起始地址是表達式所指定的16位段地址,但不能指定代碼段。

stack:指定該段在運行時為堆棧段的一部分。

none:該段獨立,與其他段無關(guān)。(為系統(tǒng)缺省值)類別:

連接時用于組成段組的名字。常用的類別有‘STACK’,‘CODE’,‘DATA’等。

ASSUME偽指令格式:ASSUME段寄存器:段名[,段寄存器:段名,…]其中:段寄存器:為CS、DS、ES、SS之一段名:為程序中由SEGMENT定義的段之名。注意:每一個匯編源程序必須使用ASSUME偽指令,且ASSUME語句應(yīng)安排在代碼段的開始,但ASSUME偽指令并不實際給段寄存器賦值,必須在程序中用指令的實際操作來給段寄存器賦值,例如:

MOVAX,DATAMOVDS,AX注意:①SEGMENT和ENDS前面必須有標號,而且在相互配對的段,它們前面要使用相同的標號。對于不同的段定義標號,盡管這些標號可以是任意字串,但為了程序的可讀性,應(yīng)使其有一定的意義。②ASSUME語句可使匯編器知道CS、DS、SS指向哪個段,但它只在匯編時起作用,在運行時CPU并不知道除CS外的其它段地址,所以必須在程序中用指令進行賦值。③首條被執(zhí)行的語句有一個標號,用以標出這個程序的開始執(zhí)行處。(在程序的結(jié)尾處使用END后跟這個標號)。例:求出兩個16位數(shù)M1和M2的積

DATA_SEGSEGMENT

M1DW0058HM2DW012AHM3DW?M4DW?

DATA_SEGENDS

STACK_SEGSEGMENT

S_DATADB100DUP(?)TOPEQULENGTHS_DATA

STACK_SEGENDS

CODE_SEGSEGMENT

ASSUMECS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEG

58002A01DSM1M2M3M4START:MOVAX,DATA_SEGMOVDS,AXMOVAX,STACK_SEGMOVSS,AXMOVAX,TOPMOVSP,AXMOVBX,OFFSETM1MOVAX,[BX]MOVDX,0MOVBX,OFFSETM2MUL[BX]MOVBX,OFFSETM3MOV[BX],AX

MOVBX,OFFSETM4MOV[BX],DX

MOVAH,4CHINT21HCODE_SEGENDS

ENDSTART(5)過程定義語句PROC/ENDP

和其它程序設(shè)計一樣,8086/8088匯編程序設(shè)計有過程或子程序的設(shè)計方法。8086/8066匯編程序的過程從運行位置上分為近過程(NEAR)和遠過程(FAR),其定義如下:

過程名PROC[NEAR]/FAR……RET

過程名ENDP

其中:過程名由編程者任取;如果在過程定義中沒有寫明是NEAR過程或FAR過程,則匯編器將這個過程默認為NEAR過程。

例:

PROC_NAME1PROCFAR……RETPROC_NAME1ENDP

過程和其它程序可定義在同一個段中,也可定義在不同的段中。對過程的調(diào)用要使用CALL語句,如:

CALLPROC_NAME1

過程內(nèi)部至少要設(shè)置一條返回指令(RET)作為過程的出口。允許過程中設(shè)置多條返回指令,即具有多個出口。(6)程序開始和結(jié)束語句

在程序的開始可以用NAME或TITLE為程序取名字。

格式為:NAME程序名

TITLE程序名

整個程序的結(jié)束使用END標出,當匯編器讀到END時,它認為程序到此就結(jié)束了。(通常使用END后跟程序開始處的標號。)注:NAME、TITLE操作不是必須的。

END則必不可少。(7)程序計數(shù)器$和ORG偽指令1.程序計數(shù)器$作用:字符$的值為程序下一個所分配的存儲單元的偏移地址。例:

DATA SEGMENTB1DB16DUP(?)A1 DB10H,20H,30HC EQU$-A1DATA ENDS

則$-A1=13H-10H=03H102030A12.ORG偽指令

作用:用來指定某條語句或某個變量偏移地址。格式為:ORG數(shù)值表達式則此數(shù)值表達式的值將作為下一條指令語句或變量的偏移地址。例:DATA SEGMENT ORG2VAR1 DB 2,3,4 ORG $+3;此時$=05HVAR2DW 1234HDATA ENDS0203043412VAR1028VAR2ORG用于指定目標程序存放單元的起始偏移地址,通常寫在第一條源程序的前面,用于指定這段程序的首地址。如使用了:

ORG100則程序執(zhí)行時就從CS:100處開始執(zhí)行其后面的程序。3.4結(jié)構(gòu)與記錄一.結(jié)構(gòu)是8086/8088宏匯編支持的一種數(shù)據(jù)結(jié)構(gòu),由多個相關(guān)聯(lián)的字段組成,每一個字段可包括多個存儲單元。1.結(jié)構(gòu)的定義格式為:

結(jié)構(gòu)名STRUC<數(shù)據(jù)定義語句序列>

結(jié)構(gòu)名ENDS其中:結(jié)構(gòu)名由編程者自取數(shù)據(jù)定義語句序列組成結(jié)構(gòu)的各個字段。例:STUDENTSTRUCNADB‘CHAN’NO DB?ENGDB?MATDB?PHYDB?STUDENTENDS結(jié)構(gòu)STUDENT共有NA、NO、ENG、MAT、PHY五個字段,NA:為四個字節(jié),初始化為字符串常數(shù)‘CHAN’,其他字段各包含一個未初始化的字節(jié),整個結(jié)構(gòu)由八個字節(jié)構(gòu)成。2.結(jié)構(gòu)的預置結(jié)構(gòu)為:結(jié)構(gòu)變量名結(jié)構(gòu)名<字段值表>其中:結(jié)構(gòu)變量名是程序中具體使用的結(jié)構(gòu)型變量名結(jié)構(gòu)名是預置前已定義過的結(jié)構(gòu)名字段值表用來對結(jié)構(gòu)變量中相應(yīng)字段置初值,若某字段的初值與定義這種結(jié)構(gòu)時給出的初值相等,則用逗號空出相應(yīng)位置。例:S1STUDENT<‘WANG’,10,72,85,90>S2STUDENT<,21,80,83,76>S3STUDENT<‘LI’,20,56,78,80>

若不在預置語句中放入初值,而在程序運行時置入數(shù)據(jù),則也應(yīng)預置結(jié)構(gòu)變量,可采用如下形式:S1STUDENT<>S2STUDENT<>S3STUDENT<>或者:SSTUDENT3DUP(<>)3.結(jié)構(gòu)的引用

可直接使用結(jié)構(gòu)變量名。若要引用結(jié)構(gòu)變量中的某一字段,則格式如下:

結(jié)構(gòu)變量名.結(jié)構(gòu)字段名或者,先將結(jié)構(gòu)變量的起始地址的偏移量送某個地址寄存器,再用如下形式引用字段:

[地址寄存器].結(jié)構(gòu)字段名例:若要引用結(jié)構(gòu)變量S1中的MAT字段①MOVAL,S1.MAT②MOVBX,OFFSETS1MOVAL,[BX].MAT4.結(jié)構(gòu)應(yīng)用舉例——學生成績管理例:有三個學生的姓名、學號及英語成績用結(jié)構(gòu)的形式存入內(nèi)存中,試編程對英語不及格的學生進行統(tǒng)計。DATA SEGMENTSTUDENT STRUCMANE1 DB‘ABCE’NO DB?ENGLISH DB?STUDENT ENDSS1STUDENT<‘ZHAN’,10,80>S2STUDENT<‘WANG’,20,73>S3STUDENT<‘LI’,23,56>DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATASTARTPROCFAR PUSHDS MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AX MOVCX,0 MOVDH,3 MOVBX,OFFSETS1BEGIN:MOVAL,[BX].ENGLISH CMPAL,60 JGENOCOUNT INCCXNOCOUNT:ADDBX,6 DECDH JNZBEGIN RETSTARTENDPCODEENDS ENDSTART二.記錄是8086/8088宏匯編支持的另一種數(shù)據(jù)結(jié)構(gòu),一個記錄可由一個字節(jié)或二個字節(jié)組成1.記錄的定義格式:記錄名RECORD<字段名>:寬度[=表達式][,…]其中:記錄名由編程者自取;字段名由編程者自定義的,寬度是指該字段占據(jù)的二進制位數(shù),方括號中的表達式是給該字段賦的初值。用逗號隔開對各字段的定義。例:將某位學生的簡單情況用一個記錄來描述。定義為:STUDENTRECODENA:3,SEX:1,AD:3,STAU:1記錄STUDENT占用一個字節(jié),其字段分配情況如圖所示:××××××××NAADSTAUSEX各字段均未初始化,故用×表示。2.記錄的預置格式為:

記錄變量名記錄名<字段值表>例:用已定義過的記錄STUDENT,預置給記錄變量S1、S2。

S1STUDENT<101B,1B,110B,1B>S2STUDENT<111B,0B,101B,1B>3.記錄運算符(1)WIDTH運算符作用:求出記錄或記錄字段所占的位數(shù)。格式:

WIDTH 記錄名/記錄變量名 例:對于STUDENT記錄:

MOVAL,WIDTHSTUDENT;AL=8MOVAH,WIDTHNA;AH=3(2)MASK運算符作用:求出的結(jié)果標識一個記錄字段在記錄中占有哪幾位。格式:

MASK記錄字段名例:對于STUDENT記錄有:MOVBL,MASKNA;BL=11100000MOVBH,MASKAD;BH=00001110MOVCL,MASKSEX;BL=00010000MOVCH,MASKSTAU;CH=00000001(3)記錄字段名當記錄字段名作為一個獨立的操作數(shù)出現(xiàn)在程序中時,并不直接代表訪字段的值,而是表示訪字段移位到該記錄的最右邊所需要的移位次數(shù)。例:對記錄STUDENT有:MOVDL,NA;DL=5MOVDH,AD;DH=1MOVDH,STAU;DH=0MOVDL,SEX;DL=4注:以上三種關(guān)于記錄的運算符的優(yōu)先級參考表4-3。4.記錄及其字段的使用例:已知三個學生的簡要情況分別存放在記錄變量S1、S2和S3中,試編程對其中男同學進行計數(shù)。DATA SEGMENTSTUDENT RECORDNA:3,SEX:1,AD:3,STAU:1S1 STUDENT<111B,1B,110B,1B>S2 STUDENT<001B,0B,100B,1B>S3 STUDENT<100B,1B,101B,1B>DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART PROCFAR PUSHDS MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AX MOVCL,3 MOVCH,0 MOVBX,OFFSETS1BEGIN:MOVAL,[BX] TESTAL,MASKSEX JZCOUNT INCCHCOUNT:INCBX DECCL JNZBEGIN RETSTARTENDPCODEENDS ENDSTART3.5宏指令及其應(yīng)用一.宏指令的定義由標號、宏指令和注釋構(gòu)成。由編程者根據(jù)宏指令定義規(guī)則,將一組指令或偽指令集中定義為一條“宏大”的指令,即可以用一條已定義的宏指令代替多條語句。宏指令定義格式:宏指令名MACRO[<形式參數(shù)1>,<形式參數(shù)2>,…]<語句組>;宏體

ENDM其中:宏指令名由編程者任?。恍问絽?shù)在調(diào)用宏指令時用實在參數(shù)來替代,也可以不設(shè)參數(shù)。例:將對某一寄存器的移位操作定義為一個宏指令。(1)SHIFTMACROMOVCL,4 SHLAX,CL ENDM宏指令

SHIFT

將AX左移4次。(2)SHIFTMACROCNMOVCL,CN SHLAX,CL ENDM則SHIFT4

;將AX左移4次。

SHIFT5

;將AX左移5次。不設(shè)參數(shù)設(shè)一個參數(shù)(3)SHIFTMACROCN,RMOVCL,CN SHLR,CL ENDM則SHIFT4,AX

;將AX左移4次。

SHIFT2,BX

;將BX左移2次。(4)SHIFTMACROCN,R,SDMOVCL,CN S&SDR,CL;用&將參數(shù)標注出來,以便替換

ENDM則SHIFT4,AX,HL

;將AX左移4次。

SHIFT2,BX,HR

;將BX右移2次。設(shè)二個參數(shù)設(shè)三個參數(shù)二.宏指令的使用使用宏指令時需要將形式參數(shù)用一一對應(yīng)的實在參數(shù)替代。當實在參數(shù)個數(shù)多于形式參數(shù),忽略多余的形式參數(shù)。當實在參數(shù)個數(shù)少于形式參數(shù),多余的形式參數(shù)設(shè)為空白。宏指令中的參數(shù)可以為:常數(shù)、寄存器、存儲單元名、地址表達式以及指令的助記符或助記符的一部分。例: SHIFT MACROR,CN MOVCL,CN SHLR,CL ENDM DATA SEGMENT X DB08H DATA ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATAMAINPROCFAR PUSHDS MOVAX,0 PUSH AX MOV AX,DATA MOVDS,AX MOVBX,OFFSETX MOVAL,[BX]

SHIFTAL,4 RETMAIN ENDPCODEENDS ENDMAIN四.取消宏指令偽指令PURGE

宏指令一經(jīng)定義,在整個程序中有效,若宏指令名與指令或偽指令助記符相同,則宏指令優(yōu)先級更高。若出現(xiàn)了這種情況,應(yīng)在一定時取消宏指令,使失效的指令或偽指令恢復功能。格式如下:

PURGE<宏指令名1>,<宏指令名2>,…五.定義局部標號偽指令LOCAL

在定義宏指令時,宏體中有可能出現(xiàn)標號。當宏指令多次被調(diào)用時,則會出錯。此時,可以用LOCAL偽指令將宏體中的標號定義為局部標號,格式為:

LOCAL標號1,標號2,…例:用一條宏指令完成延時。

DELAY MACROX

LOCAL DELAY1,WAIT1 MOVBL,XDELAY1:MOVCX,2942WAIT1:LOOPWAIT1 DECBL JNZDELAY1 ENDM… DELAY100+ MOVBL,100+??0000:MOVCX,2942

+??0001: LOOP??0001 DELBL JNZ??0000… DELAY10+ MOVBL,10+??0002:MOVCX,2942+??0003:LOOP??0003 DECBL JNZ??0002

注:此程序為.LST文件,以“+“開頭的語句行為宏指令的展開還原部分。4.6匯編語言程序設(shè)計基礎(chǔ)

匯編語言程序設(shè)計與其它語言的程序設(shè)計一樣,都要有良好的數(shù)據(jù)結(jié)構(gòu)和算法,對每個要解決的問題要經(jīng)過如下步驟:①根據(jù)問題提出相應(yīng)的算法或邏輯過程;②根據(jù)已確定的算法或邏輯過程畫出程序流程圖,把解題的思路和邏輯順序以圖示的方法表示出來。③分配工作單元和寄存器。當然,在8086/8088匯編程序設(shè)計中,由于可用資源相對其它一些CPU和計算機系統(tǒng)較多,所以這項工作也可在程序編制中進行。④編寫程序代碼。

在程序設(shè)計中,程序的效率是程序設(shè)計好壞的重要指標,特別是在匯編程序設(shè)計中,其特點要求我們對程序運行的效率加以重點關(guān)注。對于匯編語言程序我們可以考慮以下幾方面作為程序運行效率的衡量標準:①

程序的執(zhí)行時間。每一條語句都有自己的執(zhí)行時間,在8086/8088指令手冊中每條指令的運行時間都有明確的定義。根據(jù)這些時間,我們可算出程序的運行時間。②程序所占有的字節(jié)數(shù)。有一些計算機系統(tǒng),可能應(yīng)用于工業(yè)控制或工業(yè)過程檢測,不需要過多的硬件資源,比如存儲單元,所以就要求我們的程序有盡可能少的字節(jié)數(shù),以滿足縮減硬件資源的要求。③程序的語句行數(shù)。

另外,在程序設(shè)計中對語句的使用要有靈活性。例1:將一個字節(jié)乘以128例2:數(shù)AL中的“1”的個數(shù)。例1:將一個字節(jié)乘以128我們可以通過:

MOVAL,DATAMOVBL,128MULBL也可以通過

MOVAL,DATAMOVCL,7SHLAL,CL來完成。

從運行時間上,后一個要快于前一個程序。

例2:數(shù)AL中的“1”的個數(shù):程序1:

MOVAH,0MOVCX,8AGAIN:SHLAL,1JCADD1JMPNEXTADD1:INCAHNEXT:LOOPAGAINHLT程序2:

MOVAH,0CLC;CF置0AGAIN:SHLAL,1ADCAH,0ORAL,ALJNZAGAINHLT顯然,程序2在運行效率和程序行數(shù)上都優(yōu)于程序1。4.7程序的基本結(jié)構(gòu)及基本程序的設(shè)計任何程序都可以由以下三種基本結(jié)構(gòu)程序構(gòu)成結(jié)構(gòu)化程序:順序結(jié)構(gòu)、條件結(jié)構(gòu)(分支結(jié)構(gòu))和循環(huán)結(jié)構(gòu)。一、

直線程序(順序結(jié)構(gòu))

直線程序設(shè)計是程序設(shè)計中最簡單的設(shè)計方法,它是將確定好的算法或邏輯關(guān)系以正確的語句和正確的邏輯關(guān)系有序地編寫出來,形成程序。例4-1:表達式程序編程計算Z=(x*x-3y)/2。設(shè)X、Y為單字節(jié)正整數(shù),結(jié)果Z用二個字節(jié)來存放。DATA SEGMENTX DB 25Y DB 32Z DW ?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATAEXPRE PROC FARSTART: PUSHDS SUBAX,AX PUSHAX MOVAX,DATA MOVDS,AX

MOVAL,X MUL AL;x*xAX MOV BL,Y ADD BL,BL;2yBL ADDBL,Y SUB AX,BX;x*x+3yAX SHR AX,1;/2 MOV Z,AX RETEXPRE ENDPCODE ENDS ENDSTART2.查表程序

利用查表法求Y=X*X*X。設(shè)X為0-6之間的數(shù),存放在XVZL單元,結(jié)果Y存入YVAL單元,立方表從TABLE單元開始存放。DATA SEGMENTTABLE DB0,1,8,27,64,125,216XVAL DB6YVAL DB?DATA ENDSSTACK SEGMENTPARASTACK‘STACK’ DB50DUP(?)STACK ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKSTART:PROCFAR PUSHDS MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AX MOVBX,OFFSETTABLE MOVAH,0 MOVAL,XVAL ADDBX,AX

MOVAL,[BX]MOVYVAL,AL RETSTARTENDPCODEENDS ENDSTART二、分支程序

在很多實際問題中,通常要根據(jù)不同的情況,執(zhí)行不同的程序塊或語句,這就需要在設(shè)計程序時使用運算后的結(jié)果,依據(jù)一定的條件進行相應(yīng)的判斷,根據(jù)判斷結(jié)果的真或假,去運行相應(yīng)的程序或語句。例2:有一數(shù)學函數(shù)如下:

1x>0y=f(x)=0x=0-1x<0

X取值范圍:-128~+127要求寫出程序完成上述計算。X=0X>0Y=0

Y=1

Y=-1YYNN開始框圖如下:DATASEGMENTXDB –3Y DB ?DATAENDS

CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV AL,X CMP AL,0JGE BIGERMOVAL,0FFH MOV Y,ALJMP

NEXT在上面的程序中,要特別注意其中的兩處JMPNEXT的使用,從而保證每個分支的完整性。BIGER:JE EQUL MOVAL,1MOV Y,AL JMP NEXTEQUL:MOV Y,ALNEXT: MOVAH,4CHINT 21HCODEENDSENDSTART三、循環(huán)程序

對于程序中多次、有規(guī)律執(zhí)行的部分,我們通常使用循環(huán)結(jié)構(gòu)重復運行這些部分,使程序有較高的運行效率和可讀性。循環(huán)結(jié)構(gòu)主要由三部分組成,它們是:

1.循環(huán)體:重復運行的部分,其中還包含了工作部分和循環(huán)控制部分。工作部分進行相應(yīng)的操作,而循環(huán)控制部分則保證在不滿足循環(huán)條件時,跳出循環(huán)。

2.循環(huán)結(jié)束條件:在循環(huán)體中包括了循環(huán)結(jié)束條件運算部分。每循環(huán)一次除了工作部分進行相應(yīng)的操作外,循環(huán)條件部分還要通過運算,得出當前循環(huán)的狀態(tài),以便在適當?shù)臈l件下結(jié)束循環(huán)。

3.循環(huán)初值:用于設(shè)置開始循環(huán)時,循環(huán)體所處的初始狀態(tài),如循環(huán)變量初值,循環(huán)體中用到的數(shù)據(jù)和地址指針等。DATASEGMENTSUMDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFARBEGIN:

PUSHDSXORAX,AXPUSHAX;標準程序前綴

MOVAX,DATAMOVDS,AXMOVCX,10

該程序是一個以計數(shù)器為循環(huán)條件的循環(huán)結(jié)構(gòu),是循環(huán)中常見的結(jié)構(gòu)之一。例3:求1-10的累加和。 MOVAX,0AGAIN:ADDAX,CXLOOPAGAINMOVSUM,AX

RETSTARTENDPCODEENDSENDBEGINDATASEGMENTSTRDB‘PLEASEINPUTYOURNAME$’LENDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFARBEGIN:

PUSHDSMOVAX,0PUSHAX

MOVAX,DATAMOVDS,AXMOVCX,0LEABX,STR上述程序是一個以控制條件為循環(huán)條件的循環(huán)結(jié)構(gòu)。AGAIN:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論