




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 付國外傭金合同范本
- 化妝品廣告合同范本
- 豐田汽車合同范本
- 光伏運(yùn)營合作合同范本
- 農(nóng)戶辣椒種植合同范本
- 優(yōu)惠倉庫租賃服務(wù)合同范本
- 冷凍海鮮銷售合同范本
- 農(nóng)村購買墳地合同范本
- 中石油員工業(yè)績合同范本
- 會務(wù)定金合同范本
- 人教版高一下英語單詞表
- 2025年中國遠(yuǎn)洋海運(yùn)集團(tuán)限公司中石化中海船舶燃料供應(yīng)限公司招聘26人高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 2025年春季學(xué)期各周國旗下講話安排表+2024-2025學(xué)年度第二學(xué)期主題班會安排表
- 汽車電腦故障解碼器項(xiàng)目可行性研究報(bào)告評審方案設(shè)計(jì)2025年發(fā)改委標(biāo)準(zhǔn)
- 實(shí)驗(yàn)室生物安全培訓(xùn)
- 藥品專業(yè)知識培訓(xùn)考試試題5
- 五年級下冊勞動《日常收納》課件
- 騰訊風(fēng)控師(初級)認(rèn)證考試題庫(附答案)
- 第28課改革開放和社會主義現(xiàn)代化建設(shè)的巨大成就 課件-高一統(tǒng)編版(2019)必修中外歷史綱要上冊
- 豬場消防安全培訓(xùn)
- 2024年中國游戲產(chǎn)業(yè)報(bào)告
評論
0/150
提交評論