匯編語言程序設(shè)計(jì)第八章 高級宏匯編語言_第1頁
匯編語言程序設(shè)計(jì)第八章 高級宏匯編語言_第2頁
匯編語言程序設(shè)計(jì)第八章 高級宏匯編語言_第3頁
匯編語言程序設(shè)計(jì)第八章 高級宏匯編語言_第4頁
匯編語言程序設(shè)計(jì)第八章 高級宏匯編語言_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第八章高級宏匯編語言8.1結(jié)構(gòu)

結(jié)構(gòu)就是將邏輯上有一定關(guān)系的一組數(shù)據(jù),以某種方式組合在一起所形成的數(shù)據(jù)形式。

比如,將學(xué)生的學(xué)籍檔案以結(jié)構(gòu)的數(shù)據(jù)形式來表示。每個(gè)學(xué)生的各種數(shù)據(jù),如姓名、學(xué)號、年齡和各科成績等等,組成了一個(gè)結(jié)構(gòu)型數(shù)據(jù)。一、結(jié)構(gòu)的定義結(jié)構(gòu)的定義使用結(jié)構(gòu)偽指令,其格式為:結(jié)構(gòu)名STRUC<數(shù)據(jù)定義語句序列>結(jié)構(gòu)名ENDS1

在一個(gè)源程序中結(jié)構(gòu)名必須是唯一的。數(shù)據(jù)定義語句序列是用DB、DW或DD定義的變量,作為結(jié)構(gòu)中的各字段(Fields),所定義的各變量名稱為結(jié)構(gòu)字段名。例如:STUDENTSTRUCCLASSDB‘26060010’NUMDB?

NAMEDB15DUP(?)

SCOREDB?

STUDENTENDS注意:使用偽指令STRUC/ENDS定義的結(jié)構(gòu)不產(chǎn)生目標(biāo)代碼,而定義的各個(gè)字段也不分配存儲單元。2二、結(jié)構(gòu)的預(yù)置與存儲分配其中:結(jié)構(gòu)名使用STRUC/ENDS定義的結(jié)構(gòu)。結(jié)構(gòu)變量名是結(jié)構(gòu)副本的標(biāo)識符,與其它變量一樣,它也有三個(gè)屬性:段、偏移量和類型屬性。類型屬性表示結(jié)構(gòu)的總字節(jié)數(shù)。結(jié)構(gòu)預(yù)置:用定義的結(jié)構(gòu)預(yù)置副本,設(shè)置結(jié)構(gòu)變量,分配存儲空間。結(jié)構(gòu)變量名結(jié)構(gòu)名<字段值表>結(jié)構(gòu)變量預(yù)置語句的格式為:字段值表是為結(jié)構(gòu)副本中各字段的值進(jìn)行預(yù)置,必須用一對尖括號括起來。3例如:

DATASEGMENT

STU1STUDENT<>;不改變結(jié)構(gòu)定義時(shí)的初值定義

STU2STUDENT<‘25060020’>;只改變第一個(gè)字段的值

STU3STUDENT<,10,‘LIMING’,90>;第一個(gè)字段不變,其余重置

STU4STUDENT10HDUP(<‘27060010’>)

;同時(shí)預(yù)置10H個(gè)副本,每個(gè)副本只修改第一個(gè)字段初值。

DATAENDS三、對結(jié)構(gòu)變量及其字段的操作

結(jié)構(gòu)變量的使用與一般變量一樣,可以作為一條指令的操作數(shù)。注意:TYPE運(yùn)算符作用結(jié)構(gòu)變量,其返回值為該結(jié)構(gòu)變量的總字節(jié)數(shù)。MOVAX,TYPESTU1;AX<=25MOVBH,LENGTHSTU2;BH<=1MOVBL,LENGTHSTU4;BL<=10HMOVCX,SIZESTU3;CX<=25MOVDX,SIZESTU4;DX<=16*25例如:4結(jié)構(gòu)變量的字段的使用與一般變量的使用完全相同。MOVSI,OFFSETSTU1.CLASS;SI<=0MOVDI,OFFSETSTU2.CLASS;DI<=25MOVAX,LENGTHSTU1.NAME;AX<=15MOVBX,OFFSETSTU2

MOV[BX].SCORE,80;將STU2的SCORE字段賦值80訪問結(jié)構(gòu)變量中的字段要使用結(jié)構(gòu)字段運(yùn)算符“.”結(jié)構(gòu)變量名.結(jié)構(gòu)字段名其使用格式為:例如:5四、程序舉例BLOCKSTRUCFB1DB?FB2DB?FB3DW10HDUP(?)BLOCKENDSDATASEGMENTSTRU_VARBLOCK20DUP(<>)DATAENDS要求在20個(gè)結(jié)構(gòu)變量的FB1字段中依次存入字母A、B、C、D.......,在FB2字段中依次存入字母Z、Y、X、W、V、........。主要程序段編制如下:例1現(xiàn)有結(jié)構(gòu)定義和預(yù)置如下:MOVDI,OFFSETSTRU_VAR;取結(jié)構(gòu)變量首址

MOVAL,'A';取初始化字段內(nèi)容

MOVAH,'Z'MOVCX,LENGTHSTRU_VAR;取結(jié)構(gòu)變量個(gè)數(shù)LOP:MOV[DI].FB1,AL;依次向字段送字母

MOV[DI].FB2,AHINCAL;修改字段內(nèi)容

DECAHADDDI,TYPESTRU_VAR;修改指針

LOOPLOP6例2設(shè)學(xué)生學(xué)籍結(jié)構(gòu)為SC1~SC7是7個(gè)連續(xù)字段,分別記載每個(gè)學(xué)生的7門課程的成績;AVERAGE字段是該學(xué)生的平均成績。在數(shù)據(jù)段預(yù)置了30位學(xué)生的結(jié)構(gòu)副本。另有程序已完成30位學(xué)生的成績錄入。要求編制一子程序計(jì)算30位學(xué)生7門課程的平均成績并送入相應(yīng)的AVERAGE字段中。結(jié)構(gòu)定義和數(shù)據(jù)段中結(jié)構(gòu)預(yù)置如下:STUD_SCORSTRUC::SC1DB0SC2DB0SC3DB0SC4DB0SC5DB0SC6DB0SC7DB0AVERAGEDB0STUD_SCORENDS:CLA_SCORSTUD_SCOR30DUP(<>)7SCOREPROCLEABX,CLA_SCOR;取第一個(gè)結(jié)構(gòu)副本首址送BXMOVCX,30;計(jì)算平均成績的總?cè)藬?shù)LOP1:XORAX,AXPUSHCXLEASI,[BX].SC1;SI<=一位學(xué)生SC1字段偏移量

MOVCX,07HLOP2:ADDAL,[SI];計(jì)算一位學(xué)生的總成績

ADCAH,0;由于[SI]是字節(jié)單元,不直接使用AXINCSILOOPLOP2MOVCL,07HDIVCL;計(jì)算平均成績

MOV[BX].AVERAGE,AL;存放平均成績

ADDBX,TYPECLA_SCOR;指向下一個(gè)結(jié)構(gòu)副本

POPCXLOOPLOP1RETSCOREENDP88.2記錄

記錄與結(jié)構(gòu)相似,也是一組數(shù)據(jù)定義的組合。所不同的是,結(jié)構(gòu)是以字節(jié)為基本單位構(gòu)成字段,而記錄是以二進(jìn)制數(shù)位(BIT)為基本單位構(gòu)成字段。一、記錄的定義記錄名RECORD字段名:寬度[=表達(dá)式],字段名:寬度[=表達(dá)式].......記錄與結(jié)構(gòu)在定義格式上的區(qū)別:記錄的定義只是一個(gè)語句,而結(jié)構(gòu)的定義要使用多個(gè)語句。

寬度是定義該字段所需要的二進(jìn)制位數(shù)。表達(dá)式是賦予字段的初值,其值不能超過寬度所能表示的正整數(shù),為可選項(xiàng)。一個(gè)記錄所有字段寬度之和應(yīng)≤16。當(dāng)字段寬度之和>8時(shí),匯編程序自動將記錄定義為字(16位),否則定義為字節(jié)(8位)。9根據(jù)字段定義的順序,先定義的在高位,最后定義的字段在最低位。如果各字段之和<8或<16,則未定義的高位以“0”填充。REC1RECORDF1:4,F2:2,F3:6,F4:4REC2RECORDFE1:2,FE2:4,FE3:1,FE4:1REC3RECORDFF1:3,FF2:4,FF3:3,FF4:3REC4RECORDFD1:3=100B,FD2:2=2,FD3:1=1例如:上述定義的各記錄的字段分配如下圖所示。

1514131211109876543210REC1F1F2F3F476543210REC2FE1FE2FE3FE410

1514131211109876543210REC3未用FF1FF2FF3FF476543210REC4未用FD1FD2FD3記錄定義時(shí)不分配存儲單元,只有當(dāng)預(yù)置了記錄時(shí),才分配存儲空間。二、記錄的預(yù)置與存儲分配其中記錄變量名是可選項(xiàng),如果選用,它就是記錄副本的標(biāo)識符。記錄變量預(yù)置語句的格式:記錄變量名記錄名〈字段值表〉11例如:DA1REC1<0AH,3,25H,6>DA2REC2<1,8,0,1>DA3REC35DUP(<3,7,6,2>)DA4REC4<3,3,0>DA5REC4<,3>DA6REC410HDUP(<>)

上述各記錄預(yù)置后,按字節(jié)或字分配存儲單元。例如對記錄變量DA3分配存儲單元如下:未用FF1FF2FF3FF4

15141312111098765432101111111100000000在字段值表中未指定初值的字段,用逗號表示,它將使用定義的初值,若定義時(shí)未指定值,則用0填入。12三、記錄運(yùn)算符在宏匯編中有幾個(gè)運(yùn)算符是專門用于對記錄進(jìn)行操作。1、記錄寬度運(yùn)算符(WIDTH)WIDTH運(yùn)算作用于記錄名或記錄字段名。其運(yùn)算結(jié)果是返回該記錄或記錄字段的寬度(二進(jìn)制數(shù)的位數(shù))。NF1EQUWIDTHREC1;NF1=10HNF2EQUWIDTHF3;NF2=06HNF3EQUWIDTHF4;NF3=04HMOVAH,WIDTHREC2;(AH)=08HMOVAL,WIDTHFE1;(AL)=02HMOVBH,WIDTHREC3;(BH)=0DHMOVBL,WIDTHFF2;(BL)=04H例如:132.移位值運(yùn)算MOVBL,F(xiàn)1;(BL)=0CH

MOVBH,F(xiàn)2;(BH)=0AH

MOVCL,F(xiàn)3;(CL)=04H

MOVCH,F(xiàn)4;(CH)=00H在語句中如果直接將記錄字段名作為一個(gè)操作數(shù)引用,則表示取該字段的最低位移到所在記錄的最低位所需的移位次數(shù)。例如:3、記錄屏蔽運(yùn)算符

在記錄字段名前加上MASK運(yùn)算符,將返回該記錄字段在記錄中的屏蔽碼。所謂屏蔽碼是指該字段的各位為1其余各字段全為0,所構(gòu)成的編碼。例如:MOVAX,MASKF1;(AX)=0F000HMOVBL,MASKFE2;(BL)=3CHMOVCX,MASKFF3;(CX)=38HMOVBH,MASKFD1;(BH)=38H14四、對記錄及其字段的操作1、對記錄變量的操作MOVAX,DA1;取出DA1記錄變量的值0AE56H送AX

MOVBL,DA2;BL<=61H

MOVDA3+4,CX;將CX內(nèi)容送DA3的第三個(gè)記錄變量對預(yù)置的記錄變量,就可以象普通變量一樣進(jìn)行存取。例如:2、對記錄操作數(shù)的操作

在程序中,可以直接將已經(jīng)定義的記錄名作操作數(shù)使用,它被作為一個(gè)常數(shù)使用,即尋址方式為立即數(shù)尋址。使用時(shí),記錄名后必須有一對尖括號。如果括號中無內(nèi)容,表示使用記錄定義時(shí)的初值。也可以為各字段重新指定值。15MOVAX,REC1<0BH,2,3AH,7>;對記錄REC1的各字段賦值后,其值0BBA7H送AXMOVBL,REC4<,0,0>;將記錄REC4的FD2和FD3字段清零后,其值20H送BLMOVBH,REC4<>;將記錄REC4的原來值送BH,注意未定義的位用0填充MOVCL,REC4<,0,0>+REC4<>;將20H+25H的值45H送CL3、對記錄字段的操作

由于一個(gè)記錄字段是一個(gè)字節(jié)或一個(gè)字中的某幾位,在處理時(shí),需要將記錄變量作為一個(gè)整體進(jìn)行操作。例如下面的程序段是將記錄變量DA1的F2字段取出,并將其移位到最右邊。MOVAX,DA1;取記錄變量ANDAX,MASKF2;用屏蔽碼分離出F2字段MOVCL,F2;取F2的移位值送CLSHRAX,CL如果要修改記錄變量的字段,可先取出,修改后再存回記錄變量中。例如:168.3宏指令

在匯編源程序設(shè)計(jì)中,如果要多次重復(fù)使用某一個(gè)程序段,這些程序段雖然出現(xiàn)位置不同,但功能完全相同,或者只是修改某些操作數(shù)字段。這時(shí)可使用宏指令來實(shí)現(xiàn)。一.宏功能的使用過程宏功能的使用過程包括:宏定義,宏調(diào)用和宏展開使用宏指令可以使源程序更加清晰,易于閱讀,簡化重復(fù)程序的編寫。1.宏定義

宏定義使用一對偽指令MACRO和ENDM。宏定義格式有兩種。17(1)不帶參數(shù)的宏定義(2)帶參數(shù)的宏定義宏名MACRO

::

ENDM宏體宏名MACRO形參1,形參2,…..

::

ENDM宏體注意:宏定義本身不生成任何目標(biāo)代碼。2.宏調(diào)用宏調(diào)用就是在源程序的任意位置直接引用已經(jīng)定義的宏名。所構(gòu)成的語句稱為宏指令語句。(1)無參數(shù)宏調(diào)用:宏名(2)帶參數(shù)宏調(diào)用:宏名實(shí)參1,實(shí)參2,…….宏調(diào)用分為無參數(shù)調(diào)用和帶參數(shù)調(diào)用,其格式分別為:18INPUTMACRO;定義宏INPUTMOVAH,01HINT21HANDAL,0FHENDMEXCHANGEMACROBY1,BY2;定義宏EXCHANGEPUSHAXMOVAL,BY1XCHGAL,BY2MOVBY1,ALPOPAXENDM:INPUT;調(diào)用宏INPUT::EXCHANGEDA_BY1,DA_BY2;調(diào)用宏EXCHANGE:例如:

帶參數(shù)宏調(diào)用時(shí),實(shí)參與形參的排列順序應(yīng)一致。如果實(shí)參的個(gè)數(shù)比形參多,則多余的實(shí)參將被略去。如果實(shí)參的個(gè)數(shù)比形參少,則未指定的形參將用“空白串”替代。193.宏展開

宏展開是指匯編程序在匯編源程序過程中,當(dāng)掃描到宏指令語句時(shí),將用宏定義中的宏體的程序段目標(biāo)代碼替代宏指令語句。對于帶參數(shù)的宏調(diào)用,將同時(shí)用相應(yīng)的實(shí)參替代宏體中對應(yīng)的形參。二.連接符&和帶空格或逗號的實(shí)參

在宏定義時(shí),可以將形參作為一個(gè)字符串中的一部分,這時(shí)需要使用連接符&。在宏調(diào)用時(shí),可以在實(shí)參中包含空格和逗號字符,這時(shí)需要用“<>”將實(shí)參括起來。20SHIFTMACROVAR,REG,SHF,NUM,DESTMOVREG,VARMOVCL,NUMS&SHFREG,CL;SHF為形參

MOVDEST,REGENDM:SHIFTDA_WORD,AX,AR,CONT+1,<WORDPTRDES

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論