微型計算機原理及應(yīng)用-西南民族大學(xué)大學(xué)_第1頁
微型計算機原理及應(yīng)用-西南民族大學(xué)大學(xué)_第2頁
微型計算機原理及應(yīng)用-西南民族大學(xué)大學(xué)_第3頁
微型計算機原理及應(yīng)用-西南民族大學(xué)大學(xué)_第4頁
微型計算機原理及應(yīng)用-西南民族大學(xué)大學(xué)_第5頁
已閱讀5頁,還剩129頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

微型計算機原理及應(yīng)用

西南民族大學(xué)電信學(xué)院

授課教師:杜誠

聯(lián)系方式::

第四章匯編語言及其程序設(shè)計匯編語言:由于匯編語言依賴于機器硬件,通用性和移植性較差常用于編寫系統(tǒng)程序、實時通信程序、實時控制程序高級語言:編程方便快捷,通用性和移植性較好常用于完成大量數(shù)據(jù)處理、人機界面等設(shè)計任務(wù)匯編語言是介于低級語言和高級語言之間的語言,他是采用助記符的方法,用各種符號表示操作和操作對象的!匯編語言:符號化的、面向機器〔CPU〕的程序設(shè)計語言根本特點:依賴于機器,沒有通用性執(zhí)行速度快,目標(biāo)代碼占用內(nèi)存少能夠修改和擴充系統(tǒng)軟件匯編語言與匯編程序匯編語言→匯編語言源程序:用指令助記符表示機器碼;用符號地址表示存儲器地址;用偽指令約束、管理指令匯編程序:將匯編語言程序〔簡稱源程序〕翻譯為機器所能識別的目標(biāo)代碼的系統(tǒng)程序。如MASM.EXE。匯編語言源程序機器語言程序(目標(biāo)代碼)匯編(可由匯編程序完成)高級語言源程序編譯或解釋(可由編譯程序完成)如何由源程序獲得目標(biāo)程序?為了順利完成匯編,必須為匯編程序額外提供有關(guān)的信息,如:程序所使用的變量分別存放在哪些內(nèi)存單元;堆棧、數(shù)據(jù)、代碼段分別存放什么信息、大小如何……偽指令4.1.1匯編語言源程序的結(jié)構(gòu)

匯編語言源程序通常由一個或幾個程序模塊組成,每個模塊一般由三個邏輯段組成:

數(shù)據(jù)段——存放數(shù)據(jù)、變量堆棧段——堆棧區(qū)域代碼段——存放程序指令一個根本的匯編語言程序框架如下:stackSEGMENTPARA‘stack‘DB100DUP(‘stack’)stackENDSdataSEGMENT<數(shù)據(jù)、變量在此定義>dataENDScodeSEGMENTASSUMECS:code,DS:data,ES:datastart:MOVAX,dataMOVDS,AXMOVES,AX<此處參加你自己的程序段>MOVAL,4CHINT21HcodeENDSENDstart堆棧段數(shù)據(jù)段代碼段;――――――――――――――――――――――――――――

段名1 SEGMENT ;段1開始 語句1 語句2 ……

段名1 ENDS ;段1結(jié)束;――――――――――――――――――――――――――――-

段名2 SEGMENT ;段2開始 ……

段名2 ENDS ;段2結(jié)束;――――――――――――――――――――――――――――― …… ;其它段;――――――――――――――――――――――――――――― END ;源程序結(jié)束源程序的組成——段一個源程序由假設(shè)干段組成,如數(shù)據(jù)段、代碼段、堆棧段等;各段由假設(shè)干條語句行組成;指令必須在代碼段中,因此源程序至少有1個段;借助堆棧段,可實現(xiàn)程序正確返回;根據(jù)編程需要,確定是否需要數(shù)據(jù)段、附加段、堆棧段。源程序的組成——語句指令性語句[指令標(biāo)號:]指令助記符[操作數(shù)1[,操作數(shù)2]];注釋指示性語句——偽指令

[名字]偽指令助記符[參數(shù)1[,參數(shù)2,…,參數(shù)n]];注釋宏調(diào)用語句宏名[實參1[,實參2,…,實參n]];注釋與機器碼一一對應(yīng)對源程序進行指示、說明、定義調(diào)用一次,展開為一份對應(yīng)的代碼宏匯編語句中的字段指令[指令標(biāo)號:]指令助記符[操作數(shù)1[,操作數(shù)2]];注釋偽指令

[名字]偽指令助記符[參數(shù)1[,參數(shù)2,…,參數(shù)n]];注釋宏宏名[實參1[,實參2,…,實參n]];注釋操作數(shù)操作符標(biāo)識符標(biāo)識符——由編程人員自行定義的、有特殊意義的字符序列。標(biāo)識符的組成字母a~z〔A~Z〕、數(shù)字0~9、特殊字符〔?@$_.〕不用數(shù)字開頭長度小于32個字符不同于任何保存字標(biāo)識符的作用用作指令的標(biāo)號用作偽指令的名字〔如:段名、過程名、宏名……〕用作變量名*操作符字段保存字——在指令系統(tǒng)和源程序中具有確定意義、不可改動的字符序列。包括:由保存字組成,是語句中不可缺少的局部。指令助記符例:MOV、ADD偽指令助記符例:SEGMENT、ENDS存放器名*例:AX、SP運算符、參數(shù)等*例:OFFSET、PTR操作數(shù)字段表示操作符操作的對象。包括:常量操作數(shù)整數(shù)字符串存放器操作數(shù)如AX等,屬于保存字存儲器操作數(shù)如[0100H]等,可用各種尋址方式表達式操作數(shù)如OFFSETVALUE、WORDPTRNUM1等注釋——以分號開頭,可放在指令后,也可單獨一行。注意注解的寫法。要寫指令〔段〕在程序中的作用,而不要寫指令的操作。例如:以下為同一條指令寫的注釋1〕MOVCX,100;傳送100到CX2〕MOVCX,100;循環(huán)計數(shù)器置初值顯然,第二種寫法要比第一種寫法要好。DATA SEGMENT ;定義數(shù)據(jù)段D1 DB5DUP(?) ;連續(xù)的字節(jié)單元CC EQU$-D1 ;對單元計數(shù)SUM DW0 ;為結(jié)果保存一個字DATA ENDS ;數(shù)據(jù)段定義結(jié)束STACKSEGMENTPARASTACK‘STACK’ ;定義堆棧段 DB100DUP(?) ;100字節(jié)的??臻gSTACK ENDS ;堆棧段定義結(jié)束CODE SEGMENT ;定義代碼段 ASSUMEDS:DATA,SS:STACK,CS:CODE ;對各段進行說明BEGIN:MOVAX,DATA ;DS初始化為DATA MOVDS,AX LEASI,D1 ;預(yù)置源數(shù)據(jù)的指針……;〔以下略〕例多個字節(jié)單元的累加〔關(guān)注程序結(jié)構(gòu)〕定義存儲單元的數(shù)據(jù)偽指令的名字定義堆棧指令的標(biāo)號段名操作符匯編語言的一個實例:hello.asm

dataSEGMENTHelloDB‘Hello,world!’,0DH,0AH,’$’dataENDSprogSEGMENT

ASSUMECS:prog,DS:datastart:MOVAX,dataMOVDS,AX

LEADX,hello ;取字符串首地址MOVAH,9INT21H ;顯示字符串MOVAH,4CHINT21H ;退回DOSprogENDSENDstart名字標(biāo)號宏匯編語言的標(biāo)記一、可用的字符集二、常量三、變量和符號四、段名和過程名五、表達式與運算符一、可用的字符集字母A~Z或a~z〔源程序不區(qū)分大、小寫字母〕數(shù)字0~9特殊符號+、-、=、/等可見字符回車、換行、空格等不可見字符分界符?、[、]、〔、〕等二、常量整數(shù):必須以數(shù)字開頭!二進制數(shù)——以“B〞結(jié)尾八進制數(shù)——以“O〞或“Q〞結(jié)尾十進制數(shù)——不帶結(jié)尾字母,或以“D〞結(jié)尾十六進制數(shù)——以“H〞結(jié)尾字符串存放ASCII碼的連續(xù)字節(jié)單元。用包括在單引號中的字母表示〔單引號本身不算作字符〕。如‘012345’,對應(yīng)的數(shù)值依次是30H~35H。出現(xiàn)在源程序中指令操作數(shù)的位置,具有固定數(shù)值。三、變量和標(biāo)號段基址:該單元所在段的段存放器值〔16位〕偏移量:該單元在段內(nèi)的偏移量〔即有效地址〕,16位類型:該單元所存放的數(shù)據(jù)長度,可能是Byte、Word或DoubleWord等,對應(yīng)于類型值1、2、4……變量——編程人員為內(nèi)存單元起的名字。3種屬性:標(biāo)號——編程人員為某條指令起的名字,對應(yīng)于該指令的目標(biāo)代碼在代碼段中的地址。也有3種屬性,僅類型與變量不同:類型:Far、Near兩種,類型值分別是-2、-1均為標(biāo)識符增強可讀性四、段名和過程名均屬于標(biāo)識符段名=該段的段基址過程名=該過程的入口地址〔過程中第一條指令在代碼段中的地址〕,有3種屬性〔同標(biāo)號〕五、表達式與運算符表達式——由運算符和操作數(shù)組成的、具有確定結(jié)果的有意義的序列??勺鳛橹噶畹牟僮鲾?shù)。運算符——共有5類:算術(shù)運算符、邏輯運算符、關(guān)系運算符、分析運算符、合成運算符。操作數(shù)——常量、變量和標(biāo)號等均可參與運算。對于地址指針,只能進行加/減算術(shù)運算。運算規(guī)那么——表達式的值由匯編程序在編譯的過程中自動完成計算,所得確定的運算結(jié)果與操作碼一起被編譯成機器碼。運算符

算術(shù)運算符

+、-、*、/、MOD、SHL、SHR

邏輯運算符

AND、OR、NOT、XOR關(guān)系運算符

EQ、NE、LT、GT、LE、GE

分析運算符

SEG、OFFSET、TYPE、SIZE、LENGTH、HIGH、LOW

合成運算符

PTR、THIS、SHORT1.算術(shù)運算符的使用假設(shè)以算術(shù)運算表達式為源操作數(shù),那么整個表達相當(dāng)于立即數(shù);運算結(jié)果〔返回值〕的長度由目操作數(shù)決定乘、除運算不帶符號除法運算的返回值為整數(shù)商表達式的運算不影響標(biāo)志位例:MOVAL,80H+90H相當(dāng)于MOVAL,10H80H+90H=10H由匯編程序完成;指令執(zhí)行后AL=10H,各標(biāo)志位不變。2.邏輯運算符的使用假設(shè)以邏輯運算表達式為源操作數(shù),那么整個表達相當(dāng)于立即數(shù);運算結(jié)果〔返回值〕的長度由目操作數(shù)決定除NOT之外,均為雙目運算符表達式的運算不影響標(biāo)志位例:ANDCX,1F03HAND72B6H相當(dāng)于ANDCX,1202H(1F03HAND72B6H)=1202H由匯編程序完成,各標(biāo)志位不變;(CXAND1202H)在執(zhí)行過程中完成。3.關(guān)系運算符

EQ

相等關(guān)系

NE

不等關(guān)系

LT

小于關(guān)系

GT

大于關(guān)系

LE

小于等于關(guān)系

GE

大于等于關(guān)系進行關(guān)系判斷時,表達式中所有數(shù)均視為無符號數(shù)!關(guān)系運算符的使用關(guān)系運算的返回值:假設(shè)關(guān)系成立,即為真,返回全1〔1個字〕假設(shè)關(guān)系不成立,即為假,返回全0〔1個字〕例:MOVBX,〔PORTLT5〕AND20H假設(shè)PORT=2,〔PORTLT5〕=0FFFFH,為真原式相當(dāng)于MOVBX,0020H;假設(shè)PORT=7,〔PORTLT5〕=0000H,為假原式相當(dāng)于MOVBX,0000H。4.分析運算符

SEG

取變量/標(biāo)號的段基值

OFFSET

取變量/標(biāo)號的段內(nèi)偏移量

TYPE

取變量/標(biāo)號的類型值

LENGTH

取以DUP定義的變量的重復(fù)次數(shù)

SIZE

取以DUP定義的變量的總字節(jié)數(shù)

HIGH

取字?jǐn)?shù)據(jù)中的高字節(jié)

LOW

取字?jǐn)?shù)據(jù)中的低字節(jié)應(yīng)用舉例段基址為0200H段內(nèi)偏移量從0000H開始已定義字節(jié)變量VAR1、字變量VAR2、雙字變量VAR3:

VAR1DB20H,30HVAR2DW2000H,3000HVAR3DD22003300H20H30H00H20H00H30H00H33H00H22H段基址=0200H0000H0002H0006HVAR1VAR2VAR3MOVBX,SEGVAR1;〔BX〕=0200HMOVBX,SEGVAR2;〔BX〕=0200HMOVBX,SEGVAR3;〔BX〕=0200HMOVBX,OFFSETVAR1;〔BX〕=0000HMOVBX,OFFSETVAR2;〔BX〕=0002HMOVBX,OFFSETVAR3;〔BX〕=0006HTYPE對變量,返回數(shù)據(jù)的長度MOVBL,TYPEVAR1;〔BL〕=1MOVBL,TYPEVAR2;〔BL〕=2MOVBL,TYPEVAR3;〔BL〕=4對標(biāo)號,返回標(biāo)號的類型屬性NEAR、FAR標(biāo)號的屬性值分別是-1、-2LENGTH和SIZE已有變量定義:VAR1DW100DUP〔?〕VAR2DB?,?,?,?

運算符功能MOVAX,LENGTHVAR1;〔AX〕=100MOVBX,SIZEVAR1;〔BX〕=200MOVCX,LENGTHVAR2;〔CX〕=1MOVDX,SIZEVAR2;〔DX〕=1HIGH、LOW運算符HIGH——取得常數(shù)或表達式〔字〕的高字節(jié)LOW——取得常數(shù)或表達式〔字〕的低字節(jié)

應(yīng)用舉例:MOVAL,HIGH2A3BH ;AL=2AHMOVAH,LOW2A3BH ;AH=3BH5.合成運算符

PTR

生成新的操作數(shù)類型

THIS

生成新的操作數(shù)類型

SHORT

定義段內(nèi)短標(biāo)號PTR運算符PTR的使用類型PTR變量、內(nèi)存單元或標(biāo)號作用給原有的操作數(shù)重新賦定類型結(jié)果返回一個與原有操作數(shù)有相同段基址和偏移量、不同類型的新操作數(shù),但并不另分配新的存儲單元!可用的類型名稱〔均屬于保存字〕變量或內(nèi)存單元——BYTE、WORD、DWORD標(biāo)號——NEAR、FARPTR應(yīng)用舉例

生成新變量

VAR1DW? ;已定義VAR1為字變量

XORBYTEPTRVAR1,0FH

近轉(zhuǎn)移

JMPWORDPTR[BX]CALLNEARPTRSUBP

遠(yuǎn)轉(zhuǎn)移

JMPDWORDPTR[2000H]CALLFARPTRSUBPTHIS與PTR的比較

PTR—原操作數(shù)寫在PTR之后,與新操作數(shù)有相同的段基址和偏移量:

VAR1DW2030HVAR2EQUBYTEPTRVAR1

THIS—同樣生成新的操作數(shù)類型,但原操作數(shù)不出現(xiàn)在表達式中,段基址、偏移量由THIS出現(xiàn)的位置決定:

VAR2EQUTHISBYTEVAR1DW2030H例:MOVAX,VAR1 ;執(zhí)行后AX=2030HMOVAL,VAR2 ;執(zhí)行后AL=30H

30H20HVAR1VAR2SHORT運算符SHORT的使用SHORT標(biāo)號作用將已有標(biāo)號說明為短標(biāo)號,便于條件轉(zhuǎn)移指令使用。應(yīng)用AGAINEQUTHISNEAR ;AGAIN為NEAR標(biāo)號AGAIN:……JBESHORTAGAGIN;短轉(zhuǎn)移6.運算符的優(yōu)先級別優(yōu)先級別運算符高↑低()LENGTHSIZEPTRTHISOFFSETSEGTYPE段超越前綴HIGHLOW*/MODSHLSHR+-EQNEGTGELTLENOTANDORXORSHORT同一表達式內(nèi)可進行多種運算沒有括號時,按優(yōu)先級別進行運算同一優(yōu)先級的運算,按從左到右的順序進行8086宏匯編語言常用偽指令一、符號定義偽指令EQU、PURGE、=格式符號名EQU表達式、標(biāo)識符或保存字符號名=表達式PURGE用EQU定義的符號名用EQU、=定義的符號不占存儲空間用=定義過的符號能夠重復(fù)定義,如X=X+1;用EQU定義過的符號不能重復(fù)定義,除非先用PURGE解除。EQU的應(yīng)用特點DATASEGMENT ARE1DB20H ARE2EQU

20H ARE3DW4142HDATAENDS20H42H41HARE1ARE30000H0001H0002HMOVAL,ARE1 ;源操作數(shù)為直接尋址方式MOVAL,ARE2 ;源操作數(shù)為立即數(shù)尋址方式二、數(shù)據(jù)定義偽指令DB——變量為字節(jié)數(shù)據(jù)類型〔8位〕DW——變量為字?jǐn)?shù)據(jù)類型〔16位〕DD——變量為雙字?jǐn)?shù)據(jù)類型〔32位〕DQ——變量為4字?jǐn)?shù)據(jù)類型〔64位〕DT——變量為5字?jǐn)?shù)據(jù)類型〔80位〕數(shù)據(jù)定義偽指令的使用使用[變量名]變量定義偽指令初值(表);為變量賦初值[變量名]變量定義偽指令? ;保存空間常量、表達式均可作為初值DB的特殊用法[變量名]DB字符串例: DATA1 DW 7C00H DATA2 DD ? DB 3FH,66H,70H,TYPEDATA1 DATA3 DB ‘H72b9&!’DW、DD的特殊用法已有字節(jié)變量的定義:AVR1DB?可用DW為16位地址指針賦值:DWAVRDWAVR1〔字變量DWAVR的值為AVR1的16位段內(nèi)偏移量〕可用DD為32位地址指針賦值:DDAVRDDAVR1〔雙字變量DDAVR的值為AVR1的邏輯地址〕變量復(fù)制語句DUP()DUP的使用[變量名]變量定義偽指令復(fù)制次數(shù)DUP(復(fù)制內(nèi)容)應(yīng)用VARDW20HDUP(?) ;保存20H個字空間XA DD3DUP(0) ;將連續(xù)3個雙字單元清0XB DB2DUP(0FFH,?,4,‘4’)TYPEVAR=2LENGTHVAR=20HSIZEVAR=40HTYPEXA=4LENGTHXA=3SIZEXA=12TYPEXB=1LENGTHXB=2SIZEXB=8三、段定義偽指令SEGMENT、ENDS段名SEGMENT[相關(guān)參數(shù)] ;段起始〔段內(nèi)語句〕

段名ENDS ;段結(jié)束數(shù)據(jù)段、附加段、堆棧段、代碼段的定義方式相同,只是需要不同的段名。段定義語句SEGMENT/ENDS用于對DS、ES、SS、CS段的定義語句格式:

段名SEGMENT[定位選擇][鏈接類型][‘類別標(biāo)識符’]

……

段名ENDSENDS必須與SEGMENT成對出現(xiàn),且段名必須一致。段定義的相關(guān)約定組合類型:表示與其它段的關(guān)系,為連接程序提供信息,可以有6種選擇:定位類型:規(guī)定段的起始邊界,有4種選擇:PAGE:段起始地址的最低8位必須為0。PARA:段起始地址的最低4位必須為0。WORD:段起始地址的最低1位必須為0,即從偶地址開始。BYTE:段起始地址為任意值,即從任何地址開始都行。缺省類型為PARA。NONE:本段與其它段邏輯上不發(fā)生關(guān)系,每段都有自己的基地址(缺省選擇)。PUBLIC:連接程序首先將本段與其它同名同類別的段相鄰地連接在一起,然后為所有這些PUBLIC段指定一個共同的段基址。連接的先后次序由連接命令指定。STACK:與PUBLIC同樣處理,但此段作為堆棧段,SS指向第一個STACK段。COMMON:本段與其它同名同類別段重疊,段基址與最后定義的相同,長度為同名段中最大段的長度。AT表達式:連接程序把本段裝在表達式值所指定的段地址〔此方式不能指定代碼段〕。MEMORY:同PUBLIC連接程序?qū)⒈径味ㄎ辉诒贿B接在一起的其它所有段之上。類別:給各段的名字信息,連接程序?qū)㈩悇e名相同的段組成一個段組用它們共同的名字作為這個段組的名字。類別必須用單引號括起來。例:STACK SEGMENTPARASTACK‘STACK’段說明偽指令A(yù)SSUMEASSUME偽指令僅用在代碼段首行代碼段名SEGMENT[相關(guān)約定]

ASSUME

CS:段名,DS:段名,…〈代碼段內(nèi)定義,指令集合〉代碼段名ENDS例:ASSUMEDS:DATA,SS:STACK,CS:CODE五、過程定義偽指令PROCFAR、ENDP——定義遠(yuǎn)過程PROC[NEAR]、ENDP——定義近過程過程名PROC[NEAR] ;定義一個近過程〔過程指令〕RET過程名ENDP過程定義必須在代碼段內(nèi)。用PROCFAR定義遠(yuǎn)過程,PROC或PROCNEAR定義近過程。例過程在代碼段中的安排COD1 SEGMENT ASSUMECS:COD1,…… …… ;代碼段中的其它語句〔主程序〕CALLSUB1 ;主程序調(diào)用過程CALLSUB2……SUB1 PROCFAR ;名為SUB1的FAR過程開始 … RET ;返回SUB1 ENDP ;SUB1結(jié)束SUB2 PROC ;名為SUB2的NEAR過程開始 … RET ;返回SUB2 ENDP ;SUB2結(jié)束…… ;可能定義的其它過程COD1 ENDS ;代碼段結(jié)束六、地址計數(shù)器$$代表所在位置的地址指針值:

SORTDSEGMENTARRAYDB25,46,3,75,5COUNTEQU$-ARRAYSORTDENDS

ARRAY的偏移地址值為0000H$所在處的偏移地址值為0005HCOUNT=0005H–0000H=525463755ARRAY0000H0005H$七、段內(nèi)定位偽指令ORG段內(nèi)偏移量〔16位常數(shù)〕

用于指示當(dāng)前段內(nèi)數(shù)據(jù)的起點:DATASEGMENTORG2VAR1DB2,3,4ORG$+3VAR2DW1234HDATAENDS23434H12HVAR1VAR20002H0008H$八、匯編結(jié)束偽指令END的使用

END第一條指令的標(biāo)號或主過程名作用:表示匯編到此結(jié)束位于源程序的最后一行。END之后的語句不會被匯編程序翻譯九、宏定義偽指令MACRO、ENDM

宏定義

宏名MACRO[形參]

宏體

ENDM

宏調(diào)用宏名[實參]結(jié)構(gòu)定義偽指令STRUC、ENDS結(jié)構(gòu)定義 結(jié)構(gòu)名標(biāo)識符STRUC ………… 結(jié)構(gòu)名標(biāo)識符ENDS 注:結(jié)構(gòu)定義在數(shù) 據(jù)段定義中完成結(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)變量名.結(jié)構(gòu)字段名結(jié)構(gòu)變量名指針.結(jié)構(gòu)字段名宏定義與宏調(diào)用舉例宏定義如下:SVREGMACROOP1,OP2,R1,R2,R3,R4 OP1R1 OP1R2 OP2R3 OP2R4

ENDM宏調(diào)用:

SVREGPUSH,POP,AX,BX,AX,BX宏展開:……宏定義語句MACRO/ENDM宏取消語句PURGE宏標(biāo)號定義語句LOCAL重復(fù)匯編語句RETP、IRP、IRPC過程調(diào)用與宏調(diào)用

相同處

均應(yīng)先定義,后調(diào)用

不同處

過程:節(jié)省代碼存儲空間、浪費執(zhí)行時間宏:節(jié)省執(zhí)行時間、浪費代碼存儲空間練習(xí):請用示意圖說明該數(shù)據(jù)段的分配情況DSEGSEGMENT ORG 6 VAR1 DB 2,18 ORG $+2 VAR2 DW 5778H,7 VAR3 DB ‘AB’ DW ‘CD’ CONT EQUVAR3-VAR1 VAR4 DW VAR2 VAR5 DW 2DUP(2,?,2DUP(6,CONT))DSEG ENDS AT 1000HVAR4DDVAR24.58086宏匯編語言程序設(shè)計技術(shù)與絕大多數(shù)高級語言相同的是:匯編語言是結(jié)構(gòu)化的語言。一個大的匯編源程序可以由多個“模塊〞組成,而每個模塊那么由一個或多個“段〞構(gòu)成。與高級語言不同,使用匯編語言編程時設(shè)計者需同時使用指令和偽指令。匯編源程序的根本結(jié)構(gòu)形式模塊和段一個匯編“模塊〞可以包含一個或幾個長度小于64KB的“段〞8086只有4個段存放器〔CS、DS、SS和ES〕CS:程序段DS:數(shù)據(jù)段SS:堆棧段ES:附加段(可選)DATA SEGMENT ;定義數(shù)據(jù)段D1 DB5DUP〔?〕 ;連續(xù)的字節(jié)單元CC EQU$-D1 ;對單元計數(shù)SUM DW0 ;為結(jié)果保存一個字DATA ENDS ;數(shù)據(jù)段定義結(jié)束STACKSEGMENTPARASTACK‘STACK’ ;定義堆棧段 DB100DUP〔?〕 ;100字節(jié)的??臻gSTACK ENDS ;堆棧段定義結(jié)束CODE SEGMENT ;定義代碼段 ASSUMEDS:DATA,SS:STACK,CS:CODE;對各段進行說明BEGIN:MOVAX,DATA ;DS初始化為DATA MOVDS,AX LEASI,D1 ;預(yù)置源數(shù)據(jù)的指針定義存儲單元的數(shù)據(jù)偽指令定義堆棧段定義語句指令 MOVCX,CC ;預(yù)置次數(shù) LODSBYTEPTR[SI] ;取一個數(shù)并修改指針 MOVAH,0 ;清AX的高字節(jié) CLC ;清CF位AGAN:ADCSUM,AX ;累加 LODSBYTEPTR[SI] ;再取數(shù)并修改指針 LOOPAGAN ;控制循環(huán) MOVAH,4CH ;完成,返回DOS INT21HCODE ENDS ;代碼段結(jié)束

END BEGIN ;整個程序結(jié)束段定義匯編程序結(jié)束關(guān)于返回DOS在DOS環(huán)境下運行MASM-86匯編語言程序,如不能正確返回DOS,那么會出現(xiàn)死循環(huán)或死機。經(jīng)典方法: MOVAH,4CH INT21H匯編源程序的設(shè)計步驟分析問題,建立數(shù)學(xué)模型確定最正確算法合理分配存儲單元和存放器繪制流程圖編寫程序調(diào)試程序源程序的根本結(jié)構(gòu)形式主過程〔代碼段〕的一般寫法——CODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFAR ;START為遠(yuǎn)過程名PUSHDS ;標(biāo)準(zhǔn)序列,為返回DOS做準(zhǔn)備MOVAX,0PUSHAXMOVAX,DATAMOVDS,AX ;固定寫法……(指令集合,略) ;程序正文RET ;過程返回〔至DOS〕STARTENDP ;過程結(jié)束CODEENDS ;代碼段結(jié)束ENDSTART ;匯編結(jié)束代碼段的一般寫法〔續(xù)〕

CODESEGMENTASSUMECS:CODE,DS:DATA

MAIN:MOVAX,DATAMOVDS,AX…… ;程序正文,略

MOVAH,4CHINT21H

;返回DOS

CODEENDS

;代碼段結(jié)束

ENDMAIN

;匯編結(jié)束模塊化設(shè)計方法模塊化設(shè)計方法“自頂向下,逐步細(xì)化〞結(jié)構(gòu)化編碼方法順序、分支、循環(huán)三種根本結(jié)構(gòu)順序程序設(shè)計 指令指針I(yè)P值線性增加條件程序設(shè)計 IP值受標(biāo)志位的影響而跳變循環(huán)程序設(shè)計 IP值受計數(shù)器CX中的值不為零而循環(huán)順序結(jié)構(gòu)〔直線型結(jié)構(gòu)〕例:編程計算表達式Z=X2-Y/5的值,其中A、B為帶符號字節(jié)整數(shù),Z為帶符號字整數(shù)。(BX)<=X*X(AX)<=Y/5Z<=(BX)-(AX)開始結(jié)束PUSH DSSUB AX,AXPUSH AXMOV AX,DAT

MOV DS,AXMOV AL,XIMUL

ALMOV BX,AXMOV AL,YCBW MOV CL,5IDIV CL

CBWSUB BX,AXMOV Z,BXRET程序;--數(shù)據(jù)段定義 DAT SEGMENT X DB 10 Y DB -20 Z DW ? DAT ENDS;--代碼段定義COD SEGMENT

ASSUMEDS:DAT,CS:COD MAIN PROC FARPUSH DS ;保存返回地址SUB AX,AXPUSH AXMOV AX,DATMOV DS,AX ;初始化DS

;MOV AL,XIMUL ALMOV BX,AX ;〔BX〕<=X*X;MOV AL,YCBW ;將被除數(shù)擴展為字?jǐn)?shù)據(jù)MOV CL,5IDIV CL CBW ;〔AX〕<=Y/5;SUB BX,AXMOV Z,BX ;Z<=〔BX〕-〔AX〕; RET ;返回DOS MAIN ENDP COD ENDS END MAIN

分支結(jié)構(gòu)例編程實現(xiàn)以下函數(shù)的功能,其中X、Y為無符號字節(jié)數(shù)流程圖(AL)<=X(BL)<=Y開始(AL)=(BL)?Z<=0YZ<=1Y(AL)>(BL)?NZ<=-1N結(jié)束PUSH DSSUB AX,AXPUSH AXMOV AX,DAT

MOV DS,AXCMP AL,BLJE

C1

JA

C2EXT: MOVZ,AL

RETMOV AL,X MOV BL,YC1:MOV AL,0

JMP

EXTC2:MOV AL,1

JMP

EXTMOVAL,-1程序;--數(shù)據(jù)段定義

DAT SEGMENT X DB 242 Y DB 67 Z DB ?

DAT ENDS

;--代碼段定義

COD SEGMENT

ASSUMEDS:DAT,CS:COD

MAIN

PROC FARPUSH DS ;保存返回地址SUB AX,AXPUSH AXMOV AX,DATMOV DS,AX ;初始化DS; MOV AL,X MOV BL,Y CMP AL,BL JE C1 ;(AL)=(BL)那么跳轉(zhuǎn)至C1,否那么繼續(xù)執(zhí)行 JA C2 ;(AL)>(BL)那么跳轉(zhuǎn)至C2,否那么繼續(xù)執(zhí)行 MOV AL,-1EXT: MOV Z,AL RET ;返回DOSC1: MOV AL,0 JMP EXTC2: MOV AL,1 JMP EXT; MAIN ENDP COD ENDS END MAIN循環(huán)結(jié)構(gòu)計算累加和

S=∑i100i=1流程圖和單元清0→AX計數(shù)初值100→CX

(AX)=(AX)+(CX)(CX)=(CX)-1(CX)=0?SUM=(AX)YN循環(huán)程序設(shè)計舉例循環(huán)程序舉例:求累加和源程序數(shù)據(jù)段、代碼段定義——

DATASEGMENTSUMDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAIN:MOVAX,DATAMOVDS,AXMOVAX,0 ;和清零MOVCX,100 ;賦計數(shù)初值〔接上頁〕AGAIN:ADDAX,CX;累加DECCX;計數(shù)器減1JNZAGAIN;循環(huán)控制MOVSUM,AXMOVAH,4CH;DOS調(diào)用號送AHINT21H;返回DOSCODEENDS;結(jié)束代碼段ENDMAIN;結(jié)束匯編例:統(tǒng)計一個字符串對應(yīng)的ASCII碼串中二進制“1〞的個數(shù)。該程序具有雙重循環(huán)結(jié)構(gòu):內(nèi)循環(huán)控制完成對一個字符的處理,外循環(huán)控制完成字符串中CNT個字符的處理。流程圖外循環(huán)初始化:計數(shù)結(jié)果清0;預(yù)置取字符指針;預(yù)置外循環(huán)次數(shù)

開始外循環(huán)次數(shù)減1:(CL)<=(CL)-1外循環(huán)條件判斷:(CL)≠0?NNPUSH DSSUB AX,AXPUSH AXMOV AX,DAT

MOV DS,AXLOP2:

CMPAL,0

JE

LOP3EXT:

RETMOVAL,0 MOVNUM,ALMOVSI,OFFSETSTR1MOVCL,CNTSHL AL,1JNC LOP2INC NUMJMP LOP2LOP3:DECCL內(nèi)循環(huán)初始化:取一個字符送入AL內(nèi)循環(huán)條件判斷:(AL)≠0?

LOP1:LODSB(CF)=1?

累計“1”的個數(shù):NUM<=NUM+1Y(CF)<=(AL)左移一位

Y更新取字符指針:(SI)<=(SI)+1Y結(jié)束NJNZLOP1;--數(shù)據(jù)段定義DAT SEGMENT STR1 DB ‘ABCDEFG’ ;定義字符串(最長不超過32個字符) CNT EQU $-STR1 ;統(tǒng)計字符串中字符個數(shù) NUM DB ? ;存放統(tǒng)計結(jié)果(‘1’的總個數(shù)<256)DAT ENDS;代碼段定義COD

SEGMENT

ASSUMEDS:DAT,CS:COD

MAIN PROC FARPUSH DS ;保存返回地址SUB AX,AXPUSH AXMOV AX,DATMOV DS,AX ;初始化DS;外循環(huán)開始MOV AL,0 ;外循環(huán)初始化MOV NUM,ALMOV SI,OFFSETSTR1MOV CL,CNT;內(nèi)循環(huán)開始LOP1: LODSB ;內(nèi)循環(huán)初始化,取字符同時更新指針LOP2: CMP AL,0 ;內(nèi)循環(huán)控制 JE LOP3 ;(AL)=0,不滿足循環(huán)條件,退出內(nèi)循環(huán) SHL AL,1 ;內(nèi)循環(huán)體〔同時修改循環(huán)控制條件〕 JNC LOP2 ;當(dāng)前位不為“1〞,進入下一次內(nèi)循環(huán) INC NUM ;當(dāng)前位為“1〞,計數(shù)值加1 JMP LOP2 ;進入下一次內(nèi)循環(huán);內(nèi)循環(huán)結(jié)束LOP3: DEC CL ;外循環(huán)控制 JNZ LOP1 ;(CL)≠0,滿足循環(huán)條件,進入下一次外循環(huán);外循環(huán)結(jié)束EXT: RETMAIN ENDPCOD ENDS END MAINDOS及BIOS功能調(diào)用DOS功能調(diào)用類型號中斷功能類型號中斷功能20H程序結(jié)束21H請求DOS功能調(diào)用22H結(jié)束地址23H中止(Ctrl-Break)處理24H關(guān)鍵性錯誤處理25H磁盤順序讀26H磁盤順序?qū)?7H程序結(jié)束且駐留內(nèi)存28HDOS內(nèi)部使用29~2EHDOS內(nèi)部保留2FHDOS內(nèi)部使用30~3FHDOS內(nèi)部保留常用的DOS功能調(diào)用作用通過中斷指令,調(diào)用DOS管理的系統(tǒng)功能〔公用子程序〕。如輸入/輸出管理,時間、文件管理……DOS功能調(diào)用方法〔入口參數(shù)賦值〕MOVAH,DOS功能調(diào)用號INT21HAH01H02H09H0AH4CH功能輸入單個字符,帶回顯輸出單個字符輸出字符串輸入字符串,帶回顯結(jié)束程序,返回DOS

常用功能DOS功能調(diào)用:輸入單個字符調(diào)用方式 MOVAH,01H INT21H …… ;輸入字符〔ASCII碼〕在AL中應(yīng)用舉例 MOVAH,01H INT21H ;等待鍵盤輸入 CMPAL,‘0’ JBOTH CMPAL,‘9’ JAOTH ANDAL,0FH ;假設(shè)是數(shù)字鍵,那么取其對應(yīng)的數(shù)OTH: …… ;不是數(shù)字鍵的處理DOS功能調(diào)用:輸出單個字符調(diào)用方式 MOVDL,待輸出字符的ASCII碼

MOVAH,02H

INT21H應(yīng)用舉例 MOVDL,‘@’ MOVAH,02H INT21H ;向屏幕送顯 MOVDL,0AH MOVAH,02H INT21H MOVDL,0DH MOVAH,02H INT21H ;光標(biāo)換行、回車DOS功能調(diào)用:輸出字符串調(diào)用方式變量名DB待顯示的字符串;必須在數(shù)據(jù)段中,且以$為結(jié)束符〔不顯示$〕…… MOVDX,待輸出字符串的首址〔即變量名〕 MOVAH,09H INT21H應(yīng)用舉例STR1DB‘Welcome!$’ ;在數(shù)據(jù)段中…… LEADX,STR1 MOVAH,09H INT21H ;向屏幕送顯輸出DOS功能調(diào)用:輸入字符串調(diào)用方式變量名DB最大串長,?,最大串長DUP(?);必須定義在數(shù)據(jù)段中。保存的單個單元用于存放實際的串長度值…… MOVDX,接收緩沖區(qū)首址〔即變量名〕 MOVAH,0AH INT21H ;等待輸入字符串〔以回車結(jié)束〕,并填在已;定義的緩沖區(qū)中,將實際長度填入串長單元應(yīng)用舉例STR2DB10,?,10DUP(?)……LEADX,STR2 MOVAH,0AH INT21H;如果鍵盤輸入“123〞并回車,以STR2為首址的緩沖區(qū)的內(nèi)容依次是:;0AH,03H,31H,32H,33H,0DH,00H,00H,00H,00H,00H,00H ;調(diào)用DOS功能輸入以回車鍵結(jié)尾的字符串

MOV DX,OFFSETSTRIN MOV AH,0AH INT 21H

;調(diào)用DOS功能輸出回車、換行符以顯示加密后的字符串

MOV DL,0AH

;換行符的ASCII碼為0AH

MOV AH,02H INT 21H

MOV DL,0DH

;回車符的ASCII碼為0DH

MOV AH,02H INT 21H

BIOS功能調(diào)用11H設(shè)備檢測19H引導(dǎo)12H存儲容量1AH日時鐘13H磁盤I/O1BHCtrl-Break14H通信I/O1CH定時器報時15H盒式磁帶I/O1DH顯示器參數(shù)16H鍵盤I/O1EH軟盤參數(shù)17H打印機I/O1FH圖形字符擴展18HROMBASIC10H顯示器類型碼中斷功能類型碼中斷功能BIOS功能調(diào)用與DOS功能調(diào)用區(qū)別:與BIOS有關(guān)的程序固化在PC機內(nèi)存的ROM區(qū)中,而DOS功能調(diào)用由OS管理,程序在磁盤中DOS調(diào)用占用的中斷類型號為20H~3FH,BIOS調(diào)用占用的中斷類型號為10H~1FHBIOS在更低層次上為用戶提供系統(tǒng)效勞聯(lián)系:BIOS、DOS功能調(diào)用方法相似用戶也可以通過DOS功能調(diào)用BIOS功能實用程序設(shè)計例程

例:設(shè)有兩長為8字節(jié)無符號數(shù)分別存在以NUM1、NUM2為首址的連續(xù)內(nèi)存單元中,將兩數(shù)相加,結(jié)果存入SUM內(nèi)存單元。

循環(huán)初始化:

令BX指向無符號數(shù)NUM1的最低單元;令SI指向無符號數(shù)NUM2的最低單元;令DI指向結(jié)果單元SUM的最低單元;循環(huán)次數(shù)寄存器(CX)<=運算數(shù)據(jù)的字長度;(CX)=0?NY開始結(jié)束無符號字加法:((DI))<=((BX))+((SI))循環(huán)次數(shù)減:(CX)<=(CX)-1修改指針:(BX),(SI),(DI)加2程序 ;--數(shù)據(jù)段定義DATA SEGMENT NUM1 DQ 00120030FC218B4AH ;數(shù)1 NUM2 DQ 3E8144E96D701155H ;數(shù)2 SUM DQ ? ;結(jié)果單元DATA ENDS;--代碼段定義CODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX;--循環(huán)初始化 LEA BX,NUM1 ;BX指向數(shù)1的最低一個字 LEA SI,NUM2 ;SI指向數(shù)2的最低一個字 LEA DI,SUM ;DI指向結(jié)果單元的最低一個字 MOV CX,4 ;循環(huán)次數(shù)〔4個字相加〕 CLC ;清進位位 程序AGAIN: MOV AX,[BX] ;字相加 ADC AX,[SI] MOV [DI],AX ;存和 INC BX ;指針調(diào)整 INC BX INC SI INC SI INC DI INC DI LOOP AGAIN

;循環(huán)控制; MOV AH,4CH ;返回DOS INT 21HCODE ENDS END

START邏輯運算程序例:用軟件模擬以下圖所示的邏輯電路的功能。A⊕+BCDENOT AMOV AL,BOR AL,AMOV BL,CAND BL,DXOR AL,BLNOT ALMOV E,AL程序

;--數(shù)據(jù)段定義

DD1 SEGMENT A DB 82H B DB 0FH C DB 0C5H D DB 17H E DB ?

DD1 ENDS

;--堆棧段定義

ST1 SEGMENTPARASTACK‘STACK’ DB 100DUP(?) TOP EQU $-ST1

ST1 ENDS

;--代碼段定義

CC SEGMENT

ASSUME

CS:CC,DS:

DD1,SS:ST1BEGIN: MOV AX,DD1 ;內(nèi)務(wù)操作 MOV DS,AX MOV AX,ST1 MOV SS,AX MOV SP,TOP;邏輯運算 NOT A MOV AL,B OR AL,A ;〔AL〕=A+B MOV BL,C AND BL,D ;〔BL〕=C·D XOR AL,BL NOT AL MOV E,AL ;結(jié)果在E中〔85H〕; MOV AH,4CH ;返回DOS INT 21H CC ENDS END BEGIN舉例:將一個組合BCD碼轉(zhuǎn)換成二進制數(shù)。

二進制數(shù)值=[〔千位×1000〕+〔百位×100〕+〔十位×10〕]+個位DSEGSEGMENT BCD DW2021H ;組合BCD碼 BIN DW0 ;二進制結(jié)果單元 BUF DW4DUP(?) ;暫存中間結(jié)果DSEGENDS;SSEGSEGMENTPARASTACK‘STACK’ DB100DUP〔?〕SSEG ENDS;CSEGSEGMENT‘CODE’ ASSUMECS:CSEG,SS:SSEG,DS:DSEG,ES:DSEGSTART: MOV AX,DSEG MOV DS,AX MOV ES,AX MOV AX,BCDAND AX,0F000H ;取BCD碼的最高位(千位)MOV CL,12 SHR AX,CL ;左移12位,千位在AX中 MOV BX,1000 MUL BX ;(千位×1000)在AX中

LEA DI,BUF CLD STOS WORDPTRBUF MOV AX,BCD AND AX,0F00H ;取BCD碼百位 MOV CL,8 SHR AX,CL ;左移8位,百位在AL中 MOV BL,100 MUL BL ;(百位×100)在AX中

STOS WORDPTRBUF MOV AX,BCD AND AX,0F0H ;BCD

碼十位 MOV CL,4 SHR AL,CL ;左移4位,十位在AL中 MOV BL,10 MUL BL ;(十位×10)在AX中 STOS WORDPTRBUF MOV AX,BCD AND AX,000FH ;取BCD碼的個位 STOS WORDPTRBUF

MOV CX,4 ;循環(huán)次數(shù)

CLD

;DF=0,自動增量 CLC

LEA SI,BUFCYL:LODSWORDPTRBUF ;取中間結(jié)果至AX ADD BIN,AX ;中間結(jié)果加,和在BIN中 LOOPCYL

MOVAH,4CH ;返回DOS INT 21HCSEG ENDS END START主過程子過程1CALL子過程1斷點1子過程2①②③④⑤RETRETCALL子過程2斷點2⑥⑦⑧⑨子程序是實現(xiàn)模塊化程序設(shè)計的重要技巧子程序設(shè)計方法子過程及其嵌套DTOHEXSEGMENT ;定義代碼段ASSUMECS:DECTOHEX

MAINPROCFAR……

MAINENDP

KEYDTOBPROCNEAR……

KEYDTOBENDP

BTOHSCRPROCNEAR……

BTOHSCRENDP

CRLFPROCNEAR……

CRLFENDPDTOHEXENDS ;結(jié)束代碼段ENDMAIN ;結(jié)束匯編;主過程MAIN;子程序KEYDTOB;子程序BTOHSCR;子程序CRLF源程序結(jié)構(gòu)主過程MAIN

MAINPROCFAR

;主過程名為MAINREPEAT:CALLKEYDTOB

CALLCRLF

CALLBTOHSCR

CALLCRLF

;調(diào)用子程序JMPREPEATMAINENDP

注:此例的主流程是一個死循環(huán),按Ctrl-break退出

KEYDTOB子程序功能程序功能:接收從鍵盤輸入的4個數(shù)字鍵〔ASCII碼〕,并分別轉(zhuǎn)換為對應(yīng)的數(shù)字值;將輸入數(shù)字依次作為十進制數(shù)的不同權(quán)位,轉(zhuǎn)換為等價的二進制值。出口參數(shù):轉(zhuǎn)換后的二進制數(shù)→BXKEYDTOB子程序代碼KEYDTOBPROCNEAR;定義近過程KEYDTOBMOVBX,0;BX賦初值MOVCX,4;循環(huán)次數(shù)KEYIN:MOVAH,01HINT21H;鍵入字符〔在AL中〕CMPAL,‘0’JBEXIT;鍵入小于0的字符,退出CMPAL,‘9’JAEXIT;鍵入大于9的字符,退出SUBAL,30H;將ASCII碼轉(zhuǎn)換為數(shù)字0~9MOVAH,0KEYDTOB子程序代碼〔續(xù)〕〔接上頁〕XCHGAX,BXMOVSI,10MULSI;完成(AX)=(AX)*10ADDAX,BXMOVBX,AXLOOPKEYINEXIT:RETKEYDTOBENDP;KEYDTOB過程結(jié)束BTOHSCR子程序功能程序功能

將BX中的數(shù)轉(zhuǎn)換為十六進制數(shù)所對應(yīng)的4個ASCII碼,并送到顯示器輸出。入口參數(shù)

BX出口參數(shù)無CRLF子程序功能程序功能輸出回車、換行符,即光標(biāo)回到下行首入口參數(shù)無出口參數(shù)無CRLF子程序的代碼CRLFPROCNEAR;定義近過程CRLFMOVDL,0DH;0DH:回車符的ASCII碼MOVAH,02HINT21HMOVDL,0AH;0AH:換行符的ASCII碼MOVAH,02HINT21HRETCRLFENDP;CRLF過程結(jié)束BTOHSCR子程序的代碼BTOHSCRPROCNEAR;定義近過程BTOHSCRMOVCH,4;BX中含4個十六進制數(shù)ROTATE:MOVCL,4;移位次數(shù)ROL

溫馨提示

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

最新文檔

評論

0/150

提交評論