《匯編第六章》ppt課件_第1頁
《匯編第六章》ppt課件_第2頁
《匯編第六章》ppt課件_第3頁
《匯編第六章》ppt課件_第4頁
《匯編第六章》ppt課件_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第6章 構(gòu)造與記錄 6.1 構(gòu)造 6.2記錄 6.1 構(gòu)造611構(gòu)造的概念 邏輯上互相關(guān)聯(lián)的一組數(shù)據(jù)以某種形式組合在一起就是構(gòu)造。在程序中,假設(shè)要屢次使用一樣的一組數(shù)據(jù)格式,就可以把這一組數(shù)據(jù)格式定義為一個(gè)構(gòu)造。構(gòu)造定義僅僅是一種對存儲形式的描繪,并不真正分配存儲空間。構(gòu)造一經(jīng)定義就可以以此構(gòu)造如同DB、DW、DD一樣用來預(yù)置和分配變量的存儲空間。 612 構(gòu)造的定義 在一個(gè)程序中,使用構(gòu)造前必須用構(gòu)造偽指令STRUC/ENDS先定義。構(gòu)造偽指令的使用格式如下: 構(gòu)造名 STRUC 構(gòu)造名 ENDS 其中構(gòu)造名是標(biāo)識符,不能缺省,且在一源程序中必須是唯一的。數(shù)據(jù)定義語句序列是用DB,DW或DD

2、定義構(gòu)造中各字段Fields,這些語句中的變量名叫構(gòu)造字段名。 每一個(gè)構(gòu)造字段名有部分偏移量及類型的屬性。部分偏移量是指構(gòu)造字段的第一個(gè)字節(jié)與構(gòu)造起點(diǎn)之間的字節(jié)數(shù),類型仍然是指字節(jié)、字或雙字。例如定義一個(gè)構(gòu)造: STUDENT STRUCNAME DB 0123456789ABCDEFSEX DB 0CITY DB 20H DUP?ID DW ?FACE DB ? STUDENT END 上述構(gòu)造中NAME、SEX、CITY、ID、FACE分別是構(gòu)造STUDENT的字段名,它們的部分偏移量分別是0,l0H,11H,31H,33H。構(gòu)造中各字段可以指定詳細(xì)的數(shù)值或字符作為構(gòu)造字段的初值。用偽指令

3、STRUCENDS定義的構(gòu)造,不產(chǎn)生任何目的代碼,因此也不分配存儲單元。 注意標(biāo)記一個(gè)構(gòu)造類型完畢的偽指令與標(biāo)記一個(gè)段完畢的偽指令用一樣的助記符ENDS,匯編程序通過上下文理解ENDS的含義,因此要確保每一SEGMENT偽指令和每一STRUC偽指令有各自對應(yīng)的ENDS偽指令。613 構(gòu)造的預(yù)置與存儲分配 當(dāng)構(gòu)造定義后,我們可在程序中直接引用構(gòu)造名,為構(gòu)造預(yù)置副本,定義構(gòu)造變量,分配存存儲空間。構(gòu)造變量定義格式為: 構(gòu)造變量名 構(gòu)造名 其中,構(gòu)造名是用STRUCENDS偽指令定義構(gòu)造時(shí)的構(gòu)造名。構(gòu)造變量名是當(dāng)前定義的構(gòu)造變量的名稱,它同其他變量一樣有三個(gè)屬性:段、偏移量和類型屬性。段、偏移量表示

4、構(gòu)造變量的地址,類型表示構(gòu)造的總字節(jié)數(shù)。字段值表為構(gòu)造變量中各字段進(jìn)展預(yù)置,其中各字段值的排列順序及類型應(yīng)與構(gòu)造定義時(shí)各字段相一致,中間以逗號分隔。假如某個(gè)字段采用在說明構(gòu)造時(shí)所給定缺省的初值,那么可簡單地用逗號表示;假如構(gòu)造變量的所有字段均如此,那么可省去字段值表,但尖括號不能省略。 例如,假設(shè)已說明了上述構(gòu)造STUDENT ,那么可定義如下構(gòu)造變量:DATASEGMENT STD1 STUDENT STD2 STUDENT STD3 STUDENT STD4 STUDENT 10H DUPDATAENDS 在上述構(gòu)造預(yù)置中,構(gòu)造變量STDl對構(gòu)造中所有字段不加修改,保存各字段的初值。構(gòu)造變

5、量STD2僅修改第一個(gè)字段,其余各字段保存其初值。構(gòu)造變量STD3除第三個(gè)字段字段名為CITY外,其余各字段均作修改。按照上述構(gòu)造變量的定義,變量STDl,STD2和STD3的存儲空間分配情況如以下圖所示。 019STD1.NAMESTD1.SEX0不定不定不定STD1.CITYSTD1.IDSTD1.FACE20H個(gè)字節(jié)2個(gè)字節(jié)(a) STD1 ZHNSTD1.NAMESTD1.SEX0不定不定不定STD1.CITYSTD1.IDSTD1.FACE20H個(gè)字節(jié)2個(gè)字節(jié)(b) STD220H個(gè)字節(jié)LIISTD1.NAMESTD1.SEX1不定34H12H2STD1.CITYSTD1.IDSTD

6、1.FACE(c) STD3 對構(gòu)造字段初值的修改,并非所有字段的初值都可以修改,只有簡單構(gòu)造字段和字符串字段初值才可以修改。所謂簡單構(gòu)造字段就是由偽指令DB,DW或DD定義的單項(xiàng)變量,如構(gòu)造STUDENT中SEX,ID,FACE就是只有單項(xiàng)的簡單構(gòu)造字段。而NAME是用DB偽指令定義的字符串,也可以用其他字符串進(jìn)展修改。而多項(xiàng)多重變量的構(gòu)造字段初值如CITY不能修改。例如下面就是多項(xiàng)多重的構(gòu)造字段: DB 10H DUP? DW 1234H,5678H,0ABCDH DB ABCD,EFGH DW BUF,CUT 構(gòu)造變量名STD4同時(shí)預(yù)置10H個(gè)構(gòu)造副本,每一個(gè)副本中都是僅修改第二個(gè)字段初

7、值,其余保存不變。這10H個(gè)構(gòu)造數(shù)據(jù)在分配存儲空間時(shí),依次存放。 614 構(gòu)造變量及其字段的訪問 通過構(gòu)造變量名可直接存取構(gòu)造變量,假如要訪問構(gòu)造變量中的某一字段,需使用構(gòu)造字段運(yùn)算符“.,該運(yùn)算符使用格式如下: 構(gòu)造變量名構(gòu)造字段名 例如: STDl.NAME ;表示構(gòu)造變量STDl中的NAME字段 STD2.ID ;表示構(gòu)造變量STD2中的ID字段STD3.SEX ;表示構(gòu)造變量STD3中的SEX字段 在構(gòu)造變量字段名前加運(yùn)算符與一般變量名前加運(yùn)算符有一樣意義。例如:MOV DI,OFFSET STD1.NAMEl3 ;DI34HMOV CX,TYPE STD2.ID ;CX2MOV CX

8、,TYPE STD3.FACE ;CX1為傳送構(gòu)造變量STD1的 NAME字段的第個(gè)字符給AL,可以用: MOV BX,OFFSET STD1 MOV AL,BX.NAME 或者 MOV AL,STD2.NAME 假設(shè)要取出構(gòu)造變量STD4中的第五個(gè)副本的NAME字段的第5個(gè)字符,可用下面的指令序列: MOV BX,OFFSET STD4 ADD BX,TYPE STD4 MOV AL,BXNAME4 與一般變量一樣,構(gòu)造變量也可作為一條指令的操作數(shù),不過使用某些運(yùn)算符時(shí)有不同的意義。當(dāng)構(gòu)造變量前面使用運(yùn)算符時(shí),運(yùn)算符TYPE所表示的是構(gòu)造所占的總字節(jié)數(shù)。其他運(yùn)算符如OFFSET,LENGTH

9、,SIZE等所表示的意義與一般變量的使用一樣。例如: MOV AX,TYPE STD3 ;BX34H MOV CX,LENGTH STD4 ;CX10H MOV DX,SIZE STDl ;DX34HMOV BX,OFFSET STDl ;BX0MOV BX,OFFSET STD2 ;BX34H 615 程序舉例 例61 下面定義一學(xué)生的成績構(gòu)造,其中SClSC5是五個(gè)連續(xù)字段,分別存儲每個(gè)學(xué)生五門課程的成績;AVER字段記錄該學(xué)生的平均成績。在數(shù)據(jù)段中已預(yù)置20位學(xué)生的構(gòu)造副本。另有程序已完成20位學(xué)生成績的錄入?,F(xiàn)要求編制一子程序計(jì)算每位學(xué)生五門課程的平均成績并送入相應(yīng)的AVER字段中。構(gòu)

10、造定義及數(shù)據(jù)段中構(gòu)造預(yù)置如下: STD_SCOR STRUC : :SC1 DB ?SC2 DB ?SC3 DB ?SC4 DB ?SC5 DB ?AVER DB 0: :STD_SCOR ENDS : CLASS_SCOR STD_SCOR 30 DUP 由于記錄每位學(xué)生五門課程成績的字段是連續(xù)的,因此只需要用一個(gè)地址指針如DI指向一位學(xué)生的SCl字段,然后依次遞增這個(gè)地址指針DI,便可找到其它成績字段。如何尋找一位學(xué)生的SCl字段呢? 首先用存放器BXBX是構(gòu)造副本地址指針依次指向每一個(gè)構(gòu)造副本即一位學(xué)生的成績首地址,再加上構(gòu)造字段SCl的部分偏移量,便是SCl在數(shù)據(jù)段中的偏移量。在計(jì)算完

11、平均成績后,就可以存入AVER字段中。為了簡化程序,平均成績僅取整數(shù)部分。子程序編制如下: AVE_SCOR PROC LEA BX,CLASS_SCOR ;第一個(gè)構(gòu)造副本首地址送BX MOV CX,20 ;計(jì)算平均成績的總?cè)藬?shù) LOPl:MOV AX,0 PUSH CX LEA DI,BX.SCl ;一位學(xué)生SCl字段偏移量送DI MOV CX,5 LOP2:ADD AL,DI ;計(jì)算一位學(xué)生成績總分 ADC AH,0 INC DI LOOP LOP2MOV DL,5 ;計(jì)算于均成績DIV DLMOV BX.AVER,DL ;存儲平均成績ADD BX,TYPE CLASS_SCOR ;指向下

12、一個(gè)構(gòu)造副本首地址POP CXLOOP LOP1 AVE_SCOR ENDP 62 記錄 記錄和構(gòu)造一樣是用來定義一種存儲形式,只不過構(gòu)造是以字節(jié)為根本單位組成字段,而記錄是以二進(jìn)制數(shù)位為根本單位組成字段。在程序中,對記錄的應(yīng)用與構(gòu)造樣,首先定義記錄,然后對記錄變量進(jìn)展預(yù)置和存儲分配,而后就可以訪問記錄變量及其字段。 621 記錄的定義 記錄定義格式如下: 記錄名 RECORD 字段名:寬度表達(dá)式,字段名:寬度表達(dá)式, 其中,RECORD為偽指令用來定義記錄,記錄名由用戶定義,不能缺省,在記錄變量進(jìn)展預(yù)置時(shí),它是已定義記錄引用的符號名,且它應(yīng)是程序中唯一的符號名。記錄名和字段名由程序設(shè)計(jì)人員自

13、己選定,且必須唯一性。寬度是所在字段所需要的二進(jìn)制位數(shù)。表達(dá)式是對字段設(shè)置的初值,它是任選項(xiàng),但必須是該字段寬度所能表達(dá)的正整數(shù)。假如寬度7,表達(dá)式可以使用單引號括起來的字符。一個(gè)記錄可以由假設(shè)干個(gè)字段構(gòu)成,但是所有字段寬度之和應(yīng)16。假設(shè)所有字段寬度之和大于8,那么匯編程序會(huì)給對應(yīng)的記錄變量分配兩個(gè)字節(jié),否那么僅給定義對應(yīng)的記錄變量分配一個(gè)字節(jié)。第一個(gè)字段放在記錄左邊的較高有效位,隨后定義的各字段依次向較低位安排。假設(shè)各字段寬度之和8或16,那么將字節(jié)或字的各字段向右對齊即最低位對齊,剩余未用的數(shù)位安排在高位,并置o。例如:REC1 RECORD F1:2,F(xiàn)2:3,F(xiàn)3:3 REC2 RE

14、CORD F4:5,F(xiàn)5:4=8,F(xiàn)6:3,F(xiàn)7:4=0 REC3RECORDF8:3,F(xiàn)9:4,F(xiàn)10:5 上述三個(gè)記錄中各字段所占用各位如以下圖所示: 89101112131415F9F8(c) REC301234567F10未 用01234567F1F3F2(a) REC189101112131415F5F4(b) REC201234567F7F6 622 記錄的預(yù)置和存儲分配 同構(gòu)造定義一樣,記錄定義并不分配存儲空間,僅當(dāng)定義記錄變量時(shí),才分配存儲空間,并對它進(jìn)展預(yù)置。記錄變量定義格式如下: 記錄 變量名 記錄名 其中,記錄變量名與一般變量名一樣,是任選的,它同樣有一般變量的三個(gè)屬性段

15、、偏移量和類型。字段值表用來給記錄變量的各字段賦初值,各字段值的排列順序及大小應(yīng)與記錄定義時(shí)的各字段一致,中間以逗號分隔。假如某個(gè)字段采用在定義記錄時(shí)所給定的缺省初值,那么可簡單地用逗號表示;假如記錄變量的所有字段都如此,那么可省去字段值表,但尖括號不能省略。例如: R1 REC1 R2REC1 R3REC2 R4REC2 R5REC3 R6REC3 10H DUP 623 記錄專用運(yùn)算符 一、記錄寬度運(yùn)算符 格式: WIDTH記錄名 或 WIDTH記錄字段名 功能:返回該記錄或記錄字段的寬度二進(jìn)制位數(shù)。 例如: W F l E Q U W I D T H RECl ;WF1=7 W F 2

16、E Q U W I D T H F5 ;WF2=4 MOV CH,WIDTH REC2 ;AH=16 MOV CL,WIDTH F7 ;AL=4 二、移位值運(yùn)算 在語句中,把記錄字段名作為一個(gè)操作數(shù)直接引用,這時(shí)便返回個(gè)常數(shù)。這個(gè)常數(shù)表示該字段右移到所在記錄的最右邊的移位次數(shù)。它也表示該字段在記錄中的起始位置自右至左015。如以下各語句直接引用記錄RCE2中各記錄字段名的結(jié)果: MOV BL,F4 ;BL=0BH MOV BH,F5 ;BH=07H MOV CL,F6 ;CL=04HMOV CH,F7 ;CH=00H 三、記錄屏蔽運(yùn)算符格式 MASK 記錄字段名功能:得到該記錄字段在記錄中的屏

17、蔽碼,即該字段各位均為1,而記錄中其他各位均為0的代碼。例如:MOV AL,MASK F1 ;AL=0C0HMOV BL,MASK F3 ;BL=07HMOV CX,MASK F5 ;CX=0780HMOV BX,MASK F7 ;BX=000FH 624 記錄及其字段的訪問 一、記錄操作數(shù)的訪問 在程序中,直接引用已定義的記錄名就象使用常數(shù)一樣,整個(gè)記錄作為一個(gè)字節(jié)或字常數(shù)。使用記錄操作數(shù)時(shí)可以指定各字段的新值,也可以使用字段的初值。例如: MOV DL,RECl ;常數(shù)0ACH送入DL MOV AX,REC2;常數(shù)0B08AH送入AX。 M O V C X , R E C 3 +REC3

18、;把6A9H+0B34H值送入CX 二、錄變量的訪問 定義記錄變量后,如同一般變量的存取,記錄變量可以在程序中進(jìn)展任意存取操作。如: MOV AL,R1 ;取出記錄變量Rl中的內(nèi)容0ACH送AL MOV BX,R3 ;取出記錄變量R3中的內(nèi)容0B08AH送BX MOV R6+5,CX ;把CX內(nèi)容送入R6的第五個(gè)記錄變量 三、記錄字段的訪問 由于記錄變量中的字段是由字節(jié)或字中的二進(jìn)制位構(gòu)成的,所以字段不能獨(dú)立存取。記錄變量中字段的存取是通過對記錄變量的存取來實(shí)現(xiàn),為便于對字段處理,通常把取出的字段放在存放器或存儲單元的最右邊。例如要把記錄變量R3中的字段F4和F5取出,可用如下兩個(gè)程序段: 程序段1提取字段F4: MOV BX,R3 ;取出記錄變量 MOV CL,F(xiàn)5 ;字段F4移位值送CL SHR BX,CL ;字段移F4至最右邊 程序段2提取字段F5: MOV DX,R3 ;取出記錄變量 AND DX,MASK F6 ;用F5屏蔽碼別離出字段F5 MOV CL,F(xiàn)5 ;字段F5移位值送CL SHR DX,CL ;字段F5

溫馨提示

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

提交評論