




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
數(shù)據(jù)傳送程式4.1數(shù)據(jù)的傳送4.1.1
MOV指令(傳送位元組或字)格式:MOV目的運(yùn)算元,源運(yùn)算元通用寄存器,記憶體,段寄存器,(CS除外),不能為立即數(shù)。通用寄存器,段寄存器,記憶體或立即運(yùn)算元通用寄存器,段寄存器。記憶體或立即運(yùn)算元MOV指令所能完成的功能:1.寄存器與寄存器間的數(shù)據(jù)傳送
注意:當(dāng)源運(yùn)算元是立即運(yùn)算元時,目的運(yùn)算元不能是段寄存器,目的運(yùn)算元和源運(yùn)算元不能同時為記憶體。注意:1.代碼段基址寄存器CS和指令指針I(yè)P不能作為目的運(yùn)算元。
2.段寄存器間不能直接傳送。例如:MOV
AX,BXMOVDI,BXMOVAL,DHMOVDS,AX4.1數(shù)據(jù)的傳送4.1.1
MOV指令(傳送位元組或字)格式:MOV目的運(yùn)算元,源運(yùn)算元通用寄存器,段寄存器。記憶體或立即運(yùn)算元MOV指令所能完成的功能:1.寄存器與寄存器間的數(shù)據(jù)傳送
MOV
AX,BX2.立即數(shù)送到通用寄存器即給AX,BX,CX,DX,
BP,SP,SI,DI賦值。例:MOV
AH,02H
MOV
SI,0
MOV
CX,5MOVAH,4CH4.1數(shù)據(jù)的傳送3.寄存器與記憶體之間的傳送。例:MOV
AL,DATA1
MOV
SI,[BX]
MOV
AX,S2[DI]
MOV[BX][SI],AX
MOV
AX,[BX+SI+4]4.立即數(shù)送到記憶體例:MOV
DATA1,34H
MOV
BYTEPTR[SI],00H4.1.2各種尋址方式編制數(shù)據(jù)塊傳送程式例4.1將以SS1為起始地址的30個字元依次傳送到同數(shù)據(jù)段的以SS2為起始地址的一塊記憶體區(qū)域中。方法一:數(shù)據(jù)塊是用DB定義的一個字串。DATASEGMENT SS1DB'1234567890ABCDEFGHIJKLMNOPQRST’SS2DB30DUP(?) DATAENDS CODESEGMENTASSUMECS:CODE,DS:DATA START:MOVAX,DATAMOVDS,AX LOOPNEXT;(CX)-1=>CX,若(CX)≠0,則轉(zhuǎn)NEXT,實際上本句與MOVCX,30共同完成了將LOOP與標(biāo)號NEXT之間的指令迴圈執(zhí)行30次的功能
MOVAH,4CHINT21HCODEENDSENDSTARTMOVSI,OFFSETSS1;SS1的位移量=>SI MOVDI,OFFSETSS2;SS2的位移量=>DI MOVAL,[SI] MOV[DI],AL INCSI;(SI)+1=>SI INCDI;(DI)+1=>DI MOVCX,30;迴圈次數(shù)30=>CX NEXT:方法二:用DB定義30個位元組的字元數(shù)據(jù)表的方法來定義的數(shù)據(jù)塊SS1.DATASEGMENTSS1DB’1’,’2’,’3',’4’,’5’,’6’,’7’,’8’,’9’,’0’,'A’,’B’,’,C’,’D’,’E’,’F’
DB’G’,’H’,’I’,’J’,’K’,’L’,’M’,’N’,’O’,’P’,’Q’,’R’,’S’,’T’SS2DB30DUP(?) DATAENDS
這種定義和方法一定義的存儲方式完全相同.採用變址尋址,用變址寄存器SI來尋址SS1和SS2。這裏SI是相對位移量,相當(dāng)於高級語言數(shù)組的下標(biāo),可以用SS1[SI],SS2[SI]來訪問SS1、SS2中的各位元組。因此,SI的值應(yīng)從0~29,每迴圈一次,SI加1。用CX寄存器控制迴圈30次。1:選定準(zhǔn)備定位的圖示2:打開“修改”菜單下的“圖示”/“屬性”對話框3:在“設(shè)計”項定位:“位置”欄選定“在預(yù)定區(qū)域內(nèi)”“可移動性”欄中選定“在預(yù)定區(qū)域內(nèi)”點擊“起點”欄後再點擊對象/最後點擊“終點”欄後再點擊對象4:點擊“確定”退出CODESEGMENT ASSUMECS:CODE,DS:DATA START:MOVAX,DATA MOVDS,AX MOVSI,0 MOVCX,30;迴圈次數(shù)30=>CX NEXT:MOVAL,SS1[SI] MOVSS2[SI],AL
INCSI;(SI)+1=>SI LOOPNEXT;(CX)-1=>CX,若(CX)≠0,則轉(zhuǎn)NEXT;
MOVAH,4CH
INT21H CODEENDS
ENDSTART
方法三:基址尋址DATASEGMENT
SS1DB'1234567890ABCDEFGHIJKLMNOPQRST‘
SS2DB30DUP(?)
DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATA START:MOVAX,DATAMOVDS,AX MOVBX,OFFSETSS1;SS1的位移量=>SI
MOVCX,30 NEXT:MOVAL,[BX] MOV[BX+30],AL INCBX LOOPNEXT
方法四:基址+變址尋址
MOVSI,0
MOVBX,OFFSETSS1
MOVCX,30NEXT:MOVAL,[BX+SI]
MOV[BX+SI+30],AL
INCSI
LOOPNEXT
方法五:數(shù)據(jù)塊採用DW偽指令定義15個字的數(shù)據(jù)表,每次分配兩個字元
DATASEGMENT SS1 DW'21’,’43’,’65’,’87’,’09’,’BA’,’DC’,’FE’,DW’HG’,’JI’,’LK’,’NM’, ’PO’,’RQ’,’TS' SS2 DW15DUP(?) DATAENDS 方法五:數(shù)據(jù)塊採用DW偽指令定義15個字的數(shù)據(jù)表,每次分配兩個字元
MOVSI,0 MOVBX,OFFSETSS1
MOVCX,15;迴圈次數(shù)是15次 NEXT:MOVAX,[BX+SI] MOV[BX+SI+30],AX
INCSI;因為是對字(兩個位元組)操作,所以SI需加2INCSI
LOOPNEXT
4.2數(shù)據(jù)的輸入和輸出4.2.1常用DOS功能調(diào)用1、字元的輸入從鍵盤輸入一個字元的方法:發(fā)中斷21H來請求DOS的功能調(diào)用,將AH中送上功能調(diào)用號,鍵盤輸入一個字元的功能調(diào)用號是1。在程式中需要輸入一個字元的地方寫上指令:
MOVAH,01HINT21H鍵入的數(shù)據(jù)都是一個字元的ASCII碼。假如你按數(shù)字鍵4,則在AL裏得到的不是數(shù)值而是字元4的ASCII碼34H。2、字元的輸出
顯示一個字元的功能調(diào)用號為02H,發(fā)21H類中斷,就會在螢?zāi)簧系漠?dāng)前位置顯示寄存器DL中的一個字元。因此,事先必須將要顯示的字元的ASCII碼送入DL。例如:要想顯示輸出字元‘B’,需要寫指令:
MOVDL,’B’MOVAH,02HINT21H要想顯示輸出5,則需要寫指令:MOVDL,35H;DL裏存放要輸出字元‘5’的ASCII碼
MOVAH,02HINT21H3、字串的輸出要想輸出一個字串,可以採用中斷21H的09H號功能調(diào)用。調(diào)用方式:
MOVAH,09HINT21H要求:字串必須是以‘$’字元結(jié)尾的字串,在調(diào)用之前,應(yīng)將DS:DX指向記憶體中以‘$’字元結(jié)尾的字串。
4.2.2程式舉例
例4.2將一字串‘HOWAREYOU?’輸出。DATASEGMENTBUFDB‘HOWAREYOU?$’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,OFFSETBUF
MOVAH,09HINT21H
MOVAH,4CHINT21HCODEENDSENDSTART執(zhí)行完畢,則輸出字串“HOWAREYOU?”
例4.3從鍵盤上鍵入20個字元,然後與鍵入字元的先後相同的順序顯示出來。分析:從鍵盤上輸入的字元,分配了一個20個位元組的記憶體緩衝區(qū),假設(shè)這個緩衝區(qū)的起始地址名為STR。我們將從鍵盤上輸入的字元依次存放在這片記憶體裏,然後再從第一個字元開始,依次把它們顯示出來。DATASEGMENTSTRDB20DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETSTRMOVCX,20NEXT1:MOVAH,01HINT21HMOV[SI],ALINCSILOOPNEXT1
MOVDL,0DH;輸出回車
MOVAH,02HINT21HMOVDL,0AH;輸出換行
MOVAH,02HINT21H
MOVSI,OFFSETSTRMOVCX,20NEXT2:MOVDL,[SI]MOVAH,02HINT21HINCSILOOPNEXT2MOVAH,4CHINT21HCODEENDSENDSTART例4.4將LI4_3稍作改動,變?yōu)榕c鍵入字元的先後相反的順序顯示出來。又如何來編寫程式呢?分析:我們還是採用一個20個位元組的記憶體緩衝區(qū)存放從鍵盤上輸入的字元。將從鍵盤上輸入的字元依次存放在這片記憶體裏,然後再從最後一個字元開始,依次把它們顯示出來。只要把輸出部分改為:
MOVSI,OFFSETSTR+20-1;最後一個字元
MOVCX,20;的偏移地址送SINEXT2:MOVDL,[SI]MOVAH,02HINT21HDECSI;從後向前輸出,所以SI減1LOOPNEXT24.3堆疊4.3.1堆疊的定義及操作指令1、堆疊的基本概念堆疊是一組暫存單元,處理機(jī)可以向其中存入或取出資訊。堆疊可以由寄存器或是記憶體存儲單元構(gòu)成。硬堆疊:由寄存器構(gòu)成的堆疊叫做硬堆疊(或級聯(lián)隊棧)。軟堆疊:由記憶體存儲單元構(gòu)成的堆疊叫做軟堆疊(或記憶體堆疊)。堆疊的特點是:先進(jìn)後出,後進(jìn)先出。記憶體堆疊:就是在內(nèi)存中開闢一段存儲區(qū)域,它可以通過PUSH指令將數(shù)據(jù)壓入棧中,
或是通過POP指令將數(shù)據(jù)彈出,也可以用任何訪問記憶體的指令去訪問棧中的數(shù)據(jù)。堆疊指針SP:用來指示記憶體堆疊的棧頂。它始終指向堆疊的棧頂數(shù)據(jù)元素。2、堆疊的操作指令PUSH進(jìn)棧指令格式:PUSH源運(yùn)算元執(zhí)行操作:首先將堆疊指針減2,即(SP)-2=>SP,然後將源運(yùn)算元=>(SP)+1,SP。記憶體運(yùn)算元、寄存器、段寄存器、且必須是字例如:PUSHAX;(SP)-2=>SP,(AX)=>(SP)+1,SP。PUSHCS;將段寄存器CS的值壓入堆疊PUSHBETA;將BETA存儲字的內(nèi)容壓入堆疊PUSH[SI];將[SI]指向的存儲單元的字壓入堆疊例如:AX=1234HPUSHAX執(zhí)行情況如右圖:POP出棧指令格式:POP目的運(yùn)算元例如:恢復(fù)上面程式段保存的寄存器、記憶體的程式段為:POP[SI];將棧頂元素(字)彈出至[SI]指向的存儲單元POPBETA;將棧頂元素(字)彈出至BETA指向的存儲單元執(zhí)行操作:首先將棧頂?shù)淖炙腿肽康倪\(yùn)算元,然後堆疊指針加2,即(SP)+2=>SP。其中,目的運(yùn)算元可以為記憶體運(yùn)算元、寄存器、段寄存器,但不能是CS。POPB;因為POPCS非法,所以把原來CS的值送入一個存儲單元B中POPAX;將棧頂元素(字)彈出至AXPUSH和POP指令都不影響狀態(tài)標(biāo)誌。例如:POPAX指令執(zhí)行情況如圖所示:4.3.2用堆疊存儲數(shù)據(jù)實例例4.5我們用堆疊來實現(xiàn)例4.4從鍵盤上鍵入20個字元,然後與鍵入字元的先後相反的順序顯示出來。分析:因為堆疊的特點實後進(jìn)先出,我們可以利用堆疊作為輸入緩衝區(qū),輸入字元,壓入堆疊,直至輸入完畢。然後再依次從棧頂將數(shù)據(jù)彈出輸出,就完成了數(shù)據(jù)的反序輸出。MYSTACKSEGMENTSTACK
DW30DUP(?)
STACK_TOPLABELWORDMYSTACKENDSCODESEGMENT
ASSUMECS:CODE,SS:MYSTACKSTART:MOVAX,MYSTACK
MOVSS,AXMOVSP,OFFSETSTACK_TOPMOVCX,20IN_S:MOVAH,01H
INT21HPUSHAXLOOPIN_S
MOVDL,0DH;輸出回車
MOVAH,02HINT21HMOVDL,0AH;輸出換行
MOVAH,02HINT21H
MOVCX,20OUT_S:POPDXMOVAH,02HINT21HLOOPOUT_S
MOVAH,4CHINT21HCODEENDSENDSTART4.4換碼程式
4.4.1XLAT指令格式:XLAT換碼表或XLAT功能:[(BX)+(AL)]=>AL;即是用換碼表中一個位元組的內(nèi)容置換AL寄存器的內(nèi)容。要求:在此指令之前,BX寄存器中存放換碼表的起始地址,AL的內(nèi)容為要換碼的位元組在換碼表中的下標(biāo)。即是以[BX]為起點的換碼表中,以(AL)為相對位移,取一位元組裝入AL。例如:設(shè)(BX)=0040H,(AL)=03H,(DS)=170AH如果所記憶體中建立的表換碼表如下圖所示:執(zhí)行指令XLAT則把[(BX)+(AL)]的內(nèi)容即把實際地址為170A0+0040+0003H=170E3H的內(nèi)容送入AL寄存器,所以指令執(zhí)行後,(AL)=34H,即指令把AL中的代碼替換為34H。4.4.2換碼程式舉例例4.6利用XLAT指令將二進(jìn)位描述的十六進(jìn)制數(shù)字轉(zhuǎn)換成ASCII碼顯示出來。TABLESEGMENTTAB_DADB'01234567890ABCDEF'TAB_HEXDB0,1,2,3,4,5,6,7,8,9,0AH,0BH,DB0CH,0DH,0EH,0FHTABLEENDSCODESEGMENTASSUMECS:CODE,DS:TABLESTART:MOVAX,TABLEMOVDS,AXMOVCX,16MOVBX,OFFSETTAB_DAMOVSI,OFFSETTAB_HEXNEXT:MOVAL,[SI]XLATTAB_DAMOVDL,ALMOVAH,02HINT21HINCSILOOPNEXTMOVAH,4CHINT21HCODEENDS4.5其他傳送指令
1、XCHG交換指令(exchange)
格式:XCHG目的運(yùn)算元,源運(yùn)算元功能:目的運(yùn)算元
源運(yùn)算元該指令的兩個運(yùn)算元必須有一個在寄存器中,不允許使用段寄存器,允許字或位元組操作。該指令可用除立即數(shù)外的任何尋址方式,且不影響標(biāo)誌位。
例如:XCHGBX,[BP+SI]例如:XCHGBX,AX;BX、AX內(nèi)容互換2、地址傳送指令LEA(loadeffectiveaddress)有效地址送寄存器LDS(loadDSwithpointer)指針?biāo)图拇嫫骱虳SLES(loadESwithpointer)指針?biāo)图拇嫫骱虴S這一組指令完成把地址送到指定寄存器的功能。1)LEA有效地址送寄存器指令(loadeffectiveaddress)格式:LEA寄存器,源運(yùn)算元功能:指令把源運(yùn)算元的有效地址送到指定的寄存器中目的運(yùn)算元可用16位寄存器(AX,BX,CX,DX,SP,BP,SI,DI之一)但不能使用段寄存器。源運(yùn)算元可使用除立即數(shù)和寄存器外的任一種記憶體尋址方式。不影響標(biāo)誌位。例如:LEABX,VAR1;把變數(shù)VAR1的有效地址送給寄存器BXLEABX,[BX+SI+0004H];如果指令執(zhí)行前(BX)=0400H,(SI)=003CH,則指令之行後(BX)=0400+003C+0004H=0480H注意:在這裏BX寄存器得到的是有效地址而不是該存儲單元的內(nèi)容。如果指令為:
MOVBX,[BX+SI+0004H]
則BX中得到的是偏移地址為0480H單元的內(nèi)容而不是其偏移地址。2)LDS(loadDSwithpointer)指針?biāo)图拇嫫骱虳S格式:LDS寄存器,源運(yùn)算元功能:將雙字長源運(yùn)算元的低地址中的字(變數(shù)或標(biāo)號在它所在段的位移量)傳送給目的寄存器;將雙字長源運(yùn)算元的高地址中的字(變量或標(biāo)號所在段的基址)傳送至DS寄存器。目的運(yùn)算元寄存器為16位的通用寄存器之一,源運(yùn)算元是雙字長存儲器指針。例如:數(shù)據(jù)的定義為
ADB‘K’BDDA若寫指令:LDSBX,B;將A的位移量=>BX
;將A所在段基址=>DSMOVAL,[BX];將’K’送至AL3)LES(loadESwithpointer)指針?biāo)图拇嫫骱虴S
把雙字指針中的段基址傳送值ES段寄存器,不是
DS段寄存器外,其他與LDS指令完全相同。3、標(biāo)誌寄存器傳送指令LAHF(1oadAHwithflags)標(biāo)誌送
AHSAHF(storeAHintoflags)AH送標(biāo)誌寄存器PUSHF(Pushtheflags)標(biāo)誌進(jìn)棧POPF(poptheflags)標(biāo)誌出棧1)LAHF指令(狀態(tài)標(biāo)誌位元組送AH)格式:LAHF
功能:將標(biāo)誌寄存器FLAGS低位位元組送AH寄存器。1514131211109876543210OFDFIFTFSFZFAFPFCF2)SAHF指令(將AH存入狀態(tài)標(biāo)誌寄存器)格式:SAHF
功能:AH的內(nèi)容送至標(biāo)誌寄存器(即與LAHF
指令傳送方向相反)。3)PUSHF指令(將標(biāo)誌寄存器推人堆疊)格式:PUSHF
功能:先將堆疊指針減2(即(SP)-2=>SP),然後將整個標(biāo)誌寄存器(16位)壓入SP
所指向的棧頂。1514131211109876543210OFDFIFTFSFZFAFPFCF4)POPF指令(標(biāo)誌退棧)格式:POPF功能:先將堆疊頂?shù)膬?nèi)容,即((SP)+1,(SP))傳送至標(biāo)誌寄存器(16位)。然後將堆疊指針SP加2,即(SP)+2=>SP.4、輸入/輸出指令輸入指令I(lǐng)N(輸入位元組或字)輸出指令OUT(輸出位元組或字)
IN累加器,端口
OUT端口,累加器輸入指令將端口內(nèi)容輸入到AL(位元組)或AX(字),端口地址在64KI/O空間之間(0000H-FFFFH),
若端口地址在0000H-00FFH之間,則可使用直接尋址或間接尋址,否則只能用間接尋址,例如:
IN
AX,
21H
MOV
DX,210H
IN
AL,
DX輸出指令將AX中的16位數(shù)據(jù)或AL中的8位數(shù)據(jù)輸出到輸出端口,端口地址在00000H-FFFFH範(fàn)圍內(nèi),尋址方式的規(guī)定同輸入指令,例如:
MOVDX,61H
OUTDX,AX
OUT22H,AL
算術(shù)邏輯運(yùn)算程式5.1帶符號和無符號二進(jìn)位數(shù)加減運(yùn)算5.1.1加減運(yùn)算指令1、ADD指令(位元組或字相加)格式:ADD目的運(yùn)算元,源運(yùn)算元功能:將目的運(yùn)算元加上源運(yùn)算元,和送至目的運(yùn)算元。注意:目:寄存器、記憶體運(yùn)算元。源:寄存器、記憶體運(yùn)算元和立即數(shù)。二者類型要一致,即同時為字,或同時為位元組。但不能同時為記憶體運(yùn)算元。
影響狀態(tài)標(biāo)誌:AF、CF、OF、PF、SF、ZF1)寄存器----寄存器例:ADDAX,BX;(AX)+(BX)=>AXADDCX,DXADDBX,DI2)記憶體----寄存器
例:ADDCX,A;A用DW定義
ADDAX,BETA[SI];BETA用DW定義
ADDBX,[BX][SI]3)寄存器----記憶體
例:ADDA,CX;A用DW定義
ADDBETA[SI],AX4)立即數(shù)累加到寄存器/記憶體
例:ADDAL,3ADDAX,356ADDCX,100ADDBETA[SI],34狀態(tài)標(biāo)誌位:ZF:當(dāng)運(yùn)算結(jié)果為0時,置1。SF:結(jié)果為負(fù)時,置1。CF:執(zhí)行加法指令時,CF是根據(jù)最高有效位是否有向高位進(jìn)位設(shè)置的。有進(jìn)位時CF置1OF:據(jù)運(yùn)算元的符號及其變化情況來定,若兩操作數(shù)符號相同而結(jié)果符號與之相反時,OF=1。也既是如果結(jié)果溢出,則OF置1。
ADDDX,0F0F0H(DX)=4652H則:0100011001010010+111100001111000010011011101000010(DX)=3742H,ZF=0,SF=0,CF=1,OF=0OFOV/NV1/0有/無DFDN/UP減/增IFEI/DI開/關(guān)SFNG/PL負(fù)/正ZFZR/NZ0/非0AFAC/NA有/無PFPE/PO偶/奇CFCY/NC有/無格式:同ADD
功能:源運(yùn)算元加目的運(yùn)算元再加進(jìn)位標(biāo)誌CF的和送至目的運(yùn)算元。即:如果進(jìn)位標(biāo)誌位被置位則兩個運(yùn)算元相加的結(jié)果在存入目的運(yùn)算元之前再加1,否則,再加0。影響狀態(tài)標(biāo)誌位:AF,CF,OF,PF,SF,ZF。ADD和ADC指令既適用於無符號二進(jìn)位數(shù)也適用於有符號的。但它們的兩個運(yùn)算元必須同時為字節(jié)(8位)或字(16位)。2、ADC指令(帶進(jìn)位的加法指令)addwithcarry3、INC指令(位元組或字加1)increment格式:INC目的運(yùn)算元功能:目的運(yùn)算元加1後送至目的運(yùn)算元。例:INCCXINCA;A為變數(shù)名INCWORDPTR[SI];注意INC[SI]是錯的。注意:目的運(yùn)算元可以為通用寄存器,也可以記憶體,但不能是立即數(shù)。本指令主要用在迴圈程式中修改地址指針和迴圈次數(shù)等。指令執(zhí)行結(jié)果影響AF,OF,PF,SF,ZF。但不影響CF。4、SUB指令(位元組或字相減)subtract格式:SUB目的運(yùn)算元,源運(yùn)算元功能:目的運(yùn)算元減源運(yùn)算元,結(jié)果送目的運(yùn)算元。影響狀態(tài)標(biāo)誌位:AF,CF,OF,PF,SF,ZF。5、SBB指令(帶借位的減法指令)subtractwithborrow格式:SBB目的運(yùn)算元,源運(yùn)算元功能:目的運(yùn)算元減源運(yùn)算元,再減去進(jìn)位標(biāo)誌CF的值,結(jié)果送目的運(yùn)算元。影響AF,CF,OF,PF,SF,ZF.本指令主要用於多位元組運(yùn)算元相減。在行減法運(yùn)算時(SUB或SBB)若有高位的借位就置CF為1;例:MOVAL,64HMOVBL,03HSBBAL,BL;AL-BL-CF=>AL,若CF=1,則AL結(jié)果為60H6、DEC指令(位元組或字相減)decrement格式:DEC目的運(yùn)算元功能:將目的運(yùn)算元的值減1,在將結(jié)果送回目的運(yùn)算元。注意:運(yùn)算元不能是立即數(shù),在相減時把運(yùn)算元作為一個無符號二進(jìn)位數(shù)來對待。影響:AF,OF,PF,SF,ZF,但不影響CF。7、NEG指令(求補(bǔ))negate格式:NEG目的運(yùn)算元功能:使目的運(yùn)算元的符號變反,即0減去目的運(yùn)算元後送目的運(yùn)算元,例+1變?yōu)?1。影響AF,CF,OF,PF,SF,ZF。但注意若運(yùn)算元為0,指令執(zhí)行後CF置0,否則置1。5.1.2程式舉例例:5.1計算356+789和0B4H-25HDATASEGMENTADW356BDW789CDW?DDB0B4HEDB25HFDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
MOVAX,AADDAX,BMOVC,AXMOVAL,DSUBAL,EMOVF,ALMOVAH,4CHINT21HCODEENDSENDSTART例5.2多位元組二進(jìn)位加法,求兩個無符號的六位元組十六進(jìn)制數(shù)的加法運(yùn)算。
A03487EA6B14H+78659D4789FCH筆算:A03487EA6B14H+78659D4789FCH-------------------------------------------------------1189A2531F510H因為電腦中無如此大的寄存器,所以把其分解成8位或16位的數(shù)據(jù)從最低有效位開始,連續(xù)的進(jìn)行反復(fù)加法運(yùn)算。第一步第六步FIRSTDB14H,6BH,0EAH,87H,34H,0A0H,00HSECONDDB0FCH,89H,47H,9DH,65H,78H:
L1:MOVAL,SECOND[SI]ADCFIRST[SI],ALINCSILOOPL1MOVCX,6CLC;CF<=0MOVAL,0ADCAL,0MOVFIRST[SI],ALMOVSI,0為了不單獨處理進(jìn)位,可用增加一次迴圈加法來解決,如下:
FIRSTDB14H,6BH,0EAH,87H,34H,0A0H,00HAECONDDB0FCH,89H,47H,9DH,65H,78H,00H:MOVCX,7MOVSI,0CLC;0=>CFL1:MOVAL,SECOND[SI]ADCFIRST[SI],ALINCSILOOPL1:5.2帶符號和無符號二進(jìn)位數(shù)乘除法運(yùn)算5.2.1乘除運(yùn)算指令1、MUL無符號二進(jìn)位數(shù)相乘unsignedmultiple格式:MUL源運(yùn)算元目的運(yùn)算元隱含為AL(位元組乘)或AX(字乘)。源運(yùn)算元可以為寄存器也可以記憶體。8086/8088規(guī)定:如果源運(yùn)算元為8位無符號數(shù),則AL中的8位無符號數(shù)與源運(yùn)算元相乘,得到16位乘積送至AX;如果源運(yùn)算元為16位無符號數(shù),則AX中的16位無符號數(shù)與源運(yùn)算元相乘,得到32位乘積放在DX,AX中,乘積的高16位送至寄存器DX,低16位送至AX。如下頁圖:AL源運(yùn)算元*AHAL(8位)(8位)(16位)AX源運(yùn)算元AXDX*(16位)(16位)(32位)乘法運(yùn)算的情形影響標(biāo)誌:OF,CF。如果乘積的高一半是0,則CF,OF都置0,否則CF和OF均為1。2、IMUL帶符號二進(jìn)位數(shù)相乘signedmultiple格式:IMUL源運(yùn)算元功能:執(zhí)行的操作與MUL相同,但這裏的運(yùn)算元被看作是帶符號數(shù)。影響標(biāo)誌:OF,CF。
如果乘積的高一半是低一半的符號擴(kuò)展,則CF,OF都置0,否則CF和OF均為1。例:(AL)=0A4H,(BL)=0AH那麼求執(zhí)行指令MULBL和IMULBL後的乘積值。(AL)=0A4H為無符號數(shù)的164D,帶符號的-92D(BL)=0AH為無符號數(shù)的10D,帶符號的10D
則執(zhí)行MULBL和IMULBL後的結(jié)果分別為(AX)=0668H=1640d,CF=OF=1(AX)=0FC68H=-920D,CF=OF=13、DIV指令(無符號的位元組或字除法)unsigneddivide格式:DIV源運(yùn)算元功能:將累加器及其擴(kuò)展寄存器中的雙倍長度的無符號的被除數(shù)除以源運(yùn)算元中的無符號除數(shù)。對於8位除數(shù)的除法運(yùn)算,被除數(shù)在AH和AL中,對於16位除數(shù)的除法運(yùn)算,被除數(shù)在DX和AX中。運(yùn)算後將單倍長度的商送回累加器AL或AX,將單倍長度的餘數(shù)送到擴(kuò)展器AH或DX。
如下頁圖:如果除法指令產(chǎn)生的結(jié)果(商的值)超出了保存它的目的寄存器的範(fàn)圍,溢出並置OF為1,產(chǎn)生溢出中斷。8位AHALAHAL商餘數(shù)除數(shù)被除數(shù)DXAXAXDX16位商餘數(shù)除數(shù)被除數(shù)4、IDIV指令(帶符號的位元組或字除法)signeddivide
規(guī)定餘數(shù)和被除數(shù)的符號相同。因此使得商和餘數(shù)是唯一的。例:設(shè)(AX)=0400H,(BL)=09DH
即(AX)為無符號數(shù)的1024D,帶符號數(shù)的+1024D(BL)為無符號數(shù)的157D,帶符號數(shù)的-99D
執(zhí)行DIVBL的結(jié)果是:(AH)=52H=82D餘數(shù)(AL)=06H=6D商執(zhí)行IDIVBL的結(jié)果是:(AH)=22H=34D餘數(shù)(AL)=0F6H=-10D商5、CBW和CWDconvertbytetoword,convertwordtodoubleword格式:CBWCWD功能:進(jìn)行帶符號的8位除法時,需要將AL裏的符號位擴(kuò)展至AH裏,CBW將AL裏的8位帶符號數(shù)擴(kuò)展為16位數(shù)即將AH裏擴(kuò)展為AL的符號位。
CWD有時將AX中的符號位擴(kuò)展到DX中去。例:設(shè)(AX)=0400H,(BL)=OFDH即(AX)為帶符號數(shù)的1024D,(BL)為帶符號數(shù)的-3D。
執(zhí)行IDIVBL結(jié)果溢出,因此採用字除:
MOVAX,0400HCWD;將被除數(shù)符號擴(kuò)展到DX中MOVBX,0FFFDH;將除數(shù)的符號位也擴(kuò)展成為一個字IDIVBX;結(jié)束後,(AX)=OFEABH=-341D(DX)=0001H5.2.2程式舉例例5.3:將16位無符號二進(jìn)位數(shù)用除10取餘法化為十進(jìn)位數(shù),並輸出結(jié)果。分析:假設(shè)無符號二進(jìn)位數(shù)為11001000,即是十進(jìn)位數(shù)的456。考慮16位數(shù)以10商仍可能是16位,即有可能AL裏放不下商而溢出,所以採用32位除以16位的除法動算:將被除數(shù)放在AX寄存器裏,DX清零。除數(shù)10放在BX寄存器裏,除完後的餘數(shù)即是想要的十進(jìn)位數(shù)字,保存起來,商如果不為0,繼續(xù)除。我們將無符號二進(jìn)位數(shù)用變數(shù)NUM存放,將除之後得到的十進(jìn)位數(shù)字用D_NUM存放,則程式如下:DATASEGMENTD_NUMDB6_DUP(?);存放除完後得到的10進(jìn)制數(shù)字NUMDW0000000011001000B;要轉(zhuǎn)換的無符號DATAENDS二進(jìn)位數(shù)。CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
MOVBX,10;除數(shù)10MOVSI,OFFSETD_NUMMOVAX,NUM;存放被除數(shù)L1:MOVDX,0DIVBXMOV[SI],DL;將存放在DL中的有效十INCSI進(jìn)制數(shù)字送至D_NUM。CMPAX,0JEL2JMPL1L2:MOVCX,SI;將十進(jìn)位數(shù)字的個數(shù)送CXOUT_L:DECSIMOVDL,[SI]ORDL,30HMOVAH,02HINT21HLOOPOUT_LMOVAH,4CHINT21HCODEENDSENDSTART5.3十進(jìn)位數(shù)算術(shù)運(yùn)算5.3.1壓縮的BCD碼調(diào)整指令1、DAA加法的十進(jìn)位調(diào)整decimaladjustforaddition格式:DAA功能:用在ADD或ADC指令之後,對兩個BCD碼數(shù)相加後的結(jié)果(在AL中)進(jìn)行調(diào)整,使之成為正確的非壓縮BCD碼結(jié)果。影響狀態(tài)標(biāo)誌位:AF,CF,PF,SF,ZF,不影響OF。例:求89+48=?用壓縮BCD碼實現(xiàn)。則實現(xiàn)的程式段為:MOVAL,89HMOVBL,48HADDAL,BL;此指令執(zhí)行完後(AL)=0D1H,CF=0DAA;指令執(zhí)行完後(AL)=37H,且CF=12、DAS減法的十進(jìn)位調(diào)整decimaladjustforsubtraction格式:DAS功能:與DAA相似,只是對減法進(jìn)行調(diào)整,使之成為正確的壓縮BCD碼結(jié)果。5.3.2壓縮型BCD碼加法舉例:例:計算:56743829+95744856=?用壓縮BCD碼存儲計算分析:用壓縮型BCD碼存儲計算,每兩位占一個位元組採用低位存放低地址位元組。實現(xiàn)兩個多位元組BCD碼相加,和多位元組二進(jìn)位數(shù)的加法類似,從低位元組開如加,每次加完用DAA調(diào)整。程式如下:DATASEGMENTNUM1DB29H,38H,74H,56H,00HNUM2DB56H,48H,74H,95H,00HDATAENDSADD_BCDSEGMENTASSUMECS:ADD_BCD,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAH,4CHINT21HADD_BCDENDSENDSTART插入處理程式MOVCX,5MOVSI,0CLC;由於用的是ADC指令,必須事先;將CF清零,才保證結(jié)果正確。L1:MOVAL,NUM2[SI]ADCAL,NUM1[SI]DAA
MOVNUM1[SI],ALINCSILOOPL1(結(jié)果並未輸出)5.3.3非壓縮型BCD碼(ASCII碼)的加法調(diào)整指令1、AAA加法的ASCII碼調(diào)整ASCIIadjustforaddition格式:AAS功能:與AAA相似,只是對減法進(jìn)行調(diào)整,使之成為正確的非壓縮BCD碼結(jié)果。格式:AAA功能:在ADD指令後,對兩個非壓縮BCD碼相加後存
放於AL中的和進(jìn)行調(diào)整,以獲得正確的非壓縮BCD碼結(jié)果。注意:只要低四位大於9,CF就置1,即記錄進(jìn)位。2、AAS減法的ASCII碼調(diào)整ASCIIadjustforsubtraction
3、AAM乗法的ASCII碼調(diào)整ASCIIadjustformultiplication格式:AAM功能:用在8位無符號二進(jìn)位乘法MUL指令後。對兩個非壓縮型BCD碼相乘後存放於AX中的乘積進(jìn)行調(diào)整,以得到正確的BCD碼乘積。例:MOVAL,07HMOVBL,05H
MULBL;此指令執(zhí)行完後(AX)=35D=0000000000100011B=0023HAAM;此指令執(zhí)行完後(AX)=0000001100000101B=0305H4、AAD除法的ASCII碼調(diào)整ASCIIadjustfordivision格式:AAD功能:用在除法指令之前,將AX中的兩位非壓縮碼轉(zhuǎn)換成真正的二進(jìn)位數(shù)。例如:計算34/5
MOVAX,0304H;AX中存放34D的非壓縮BCD碼
ADD;將AX的內(nèi)容調(diào)整為0000000000100010B即0022H
MOVBL,05H
DIVBL;除完後,餘數(shù)(AH)=04H,商(AL)=06H5.3.4非壓縮型BCD碼程式舉例例5.4.2計算56743829+95744856=?用非壓縮型BCD碼存儲計算,並輸出。分析:因為用非壓縮型BCD碼計算,所以採用從低到高的存儲方法。存儲方式或為以下幾種:1、NUM1DB09H,02H,。。05H,00H2、NUM1DB9,2,8,3,4,7,6,5,03、NUM1DB‘928347650’實現(xiàn)程式如下:DATASEGMENTNUM1DB‘928347650’NUM2DB‘658447590’DATAENDSASC_ADDSEGMENTASSUMECS:ASC_ADD,DS:DATASTART:MOVAX,DATAMOVDS,AX
MOVSI,OFFSETNUM1MOVDI,OFFSETNUM2MOVCX,9CLCL1:MOVAL,[SI]ADCAL,[DI]AAALAHF;因為下一條指令OR將改變標(biāo)誌CF的值,;所以要先將狀態(tài)標(biāo)誌保存至AHORAL,30H;將結(jié)果拼成ASCII碼SAHF;恢復(fù)狀態(tài)標(biāo)誌寄存器的值,即將保存在AH;中的標(biāo)誌送標(biāo)誌寄存器MOV[DI],AL;(AL)=>[DI]INCSIINCDILOOPL1;CX-1=>CX,CX=0?如果不等,繼續(xù)迴圈MOVCX,9CLCL1:MOVAL,[SI]ADCAL,[DI]AAA
;下麵完成計算結(jié)果從高位到低位的輸出MOVAH,02HMOVCX,9DECDIL2:MOVDL,[DI]INT21HDECDILOOPL2MOVAH,4CHINT21HASC_ADDENDSENDSTART5.4邏輯運(yùn)算程式5.4.1邏輯指令A(yù)ND邏輯與OR邏輯或NOT邏輯非XOR異或TEST測試邏輯運(yùn)算可對字或位元組運(yùn)算,並且是按位操作,所以,其運(yùn)算元應(yīng)該是位串而不是數(shù)。1、AND邏輯與指令
格式:ANDDST,SRC
執(zhí)行的操作:(DST)<=(DST)^(SRC)2、OR邏輯或指令
格式:ORDST,SRC
執(zhí)行的操作:(DST)<=(DST)(SRC)4、XOR異或指令
格式:XORDST,SRC
執(zhí)行的操作:(DST)<=(DST)+(SRC)3、NOT邏輯非指令
格式:NOTOPR
執(zhí)行的操作:(OPR)<=(OPR)5、TEST測試指令
格式:TESTOPR1,OPR2
執(zhí)行的操作:(OPR1)^(OPR2)注意:在以上五種指令中,NOT不能使立即數(shù),其他四條除非運(yùn)算元是立即數(shù),至少有一個運(yùn)算元必須放在寄存器中另一個操作數(shù)則可以使用任意尋址方式。它們對標(biāo)誌位的影響是NOT指令不影響標(biāo)誌位,其他4種將使CF位和OF位為0,AF位無定義,而SF,ZF位和PF位則根據(jù)運(yùn)算結(jié)果設(shè)置。5.4.2移位指令SHL(shiftlogicalleft)邏輯左移SAL(shiftarithmeticleft)算術(shù)左移SHR(shiftlogicalright)邏輯右移SAR(Shiftarithmeticright)算術(shù)右移ROL(rotateleft)迴圈左移ROR(rotateright)迴圈右移RCL(rotateleftthroughcarry)帶進(jìn)位迴圈左移RCR(rotaterightthroughcarry)帶進(jìn)位迴圈右移下麵分三組來說明這十條指令:1、移位指令①SHL邏輯左移指令格式:SHL目的運(yùn)算元,CNT執(zhí)行的操作如下圖所示:其中目的運(yùn)算元用除立即數(shù)外的任何尋址方式,移位次數(shù)由CNT決定,在8086中它可以是1或CL,CNT為1時只移一位,如果需要移位的次數(shù)大於1,則可以在該移位指令前把移位次數(shù)置於CL寄存器中,而移位指令中的CNT寫為CL即可。SAL算術(shù)左移指令格式:SAL目的運(yùn)算元,CNT執(zhí)行的操作與SHL相同。③SHR邏輯右移指令格式:SHR目的運(yùn)算元,CNT執(zhí)行的操作如圖5.4所示。④SAR邏輯右移指令格式:SAR目的運(yùn)算元,CNT執(zhí)行的操作如圖5.5所示。5.4.3程式舉例
例5.5從鍵盤讀入一個十進(jìn)位數(shù),設(shè)此數(shù)以“;”為結(jié)束,且小於一個字大小,將其轉(zhuǎn)化成它所代表的二進(jìn)位數(shù)據(jù)。分析:(1)從鍵盤讀入的是ASCII碼,首先轉(zhuǎn)換成對應(yīng)的十進(jìn)位數(shù)字(2)按照習(xí)慣,從高位輸入,只需將先輸入的數(shù)*10,加上現(xiàn)在輸入的數(shù)即可。DATASEGMENTBUFDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX::END_L:MOVAH,4CHINT21HCODEENDSENDSTART
MOVBUF,0IN_L:MOVAH,01HINT21HCMPAL,’;’JEEND_LANDAL,0FHSALBUF,1MOVBX,BUFSALBUF,1SALBUF,1ADDBUF,BXMOVAH,0ADDBUF,AXJMPIN_L例5.6從鍵盤上輸入一個十進(jìn)位數(shù)(設(shè)有偶數(shù)個數(shù)字位),以壓縮型BCD碼的方式存入記憶體緩衝區(qū)。分析:1)首先將鍵入的數(shù)字字元以ASCII碼的方式存入內(nèi)存緩衝區(qū)。2)將ASCII碼轉(zhuǎn)換為壓縮型BCD碼程式如下:DATASEGMENTASC_NUMDB30DUP(?)BCD_NUMDB20DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETASC_NUM;輸入並將ASCII碼存儲到ASC_NUM中
MOVCX,0;CX用於記錄輸入字元的個數(shù)IN_ASC:MOVAH,01HINT21HCMPAL,0DH;和回車比較,如果相等,轉(zhuǎn)L2JEL2MOV[SI],ALINCSIINCCXJMPIN_ASC
L2:SHRCX,1
;壓縮型BCD碼所占位元組數(shù)為字元個數(shù)/2L3:MOVSI,OFFSETASC_NUMMOVDI,OFFSETBCD_NUMLOOPER:MOVDL,[SI]SHLDL,1SHLDL,1SHLDL,1SHLDL,1MOVAL,[SI+1]ANDAL,0FHORDL,ALMOV[DI],DLINCSIINCSIINCDILOOPLOOPER
MOVAH,4CHINT21HCODEENDSENDSTART例5.7壓縮型BCD碼的輸出,設(shè)壓縮型BCD碼的存放是高位位元組存放在高地址,低位位元組存放在低地址,輸出時按照習(xí)慣從高位到低位輸出。分析:一個位元組裏存放了兩位十進(jìn)位數(shù)字,因此需要將其分離出來,分離方法:先輸出高位,將存放在DL裏的壓縮型BCD碼右移四位,再拼成ASCII碼輸出即可,然後再將低位拼成ASCII碼,輸出。
程式如下:
DATASEGMENT
BCD_NUMDB34H,56H,78H,94H
COUNTEQU$-OFFSETBCD_NUM
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETBCD_NUM+3
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
MOVCX,COUNTL1:MOVDL,[SI]MOVBX,CX;下麵用到CX,先將CX保存起來
MOVCX,4SHRDL,CL;將存在DL裏的壓縮型BCD碼右移4位
ORDL,30HMOVAH,02HINT21H;輸出高位
MOVDL,[SI]ANDDL,0FHORDL,30HMOVAH,02H
INT21H;輸出低位
DECSIMOVCX,BX;恢復(fù)CX的值
LOOPL1
迴圈與分支程式設(shè)計**6.1迴圈程式設(shè)計JCXZ:當(dāng)CX為0時跳轉(zhuǎn)的條件轉(zhuǎn)移指令;LOOP:使CX的值遞減並且產(chǎn)生一個無條件跳轉(zhuǎn)的迴圈指令;LOOPE/LOOPZ,LOOPNE/LOOPNZ
條件迴圈迭代控制指令,根據(jù)零狀態(tài)標(biāo)誌位的狀態(tài),決定是否繼續(xù)進(jìn)行迴圈操作。迴圈控制指令可用來控制迴圈。它們用CX寄存器作為計數(shù)器,來控制迴圈次數(shù)。並且都是短距離轉(zhuǎn)移指令。
*1、LOOP指令(執(zhí)行迴圈直到計數(shù)為0)格式:LOOP短距離標(biāo)號例如:L1:…..┆
LOOPL1功能:CX-1=>CX,若CX不為0,則將控制轉(zhuǎn)移到目標(biāo)運(yùn)算元(指定標(biāo)號處);否則順序執(zhí)行LOOP指令之後的指令。程式舉例例6.l一組數(shù)求和,假設(shè)有20個16位二進(jìn)位數(shù),要對這20個數(shù)求和(假設(shè)和值<65536)程式如下:*DATASEGMENTARRY DW123CH,3DH,100H,90H,345H,12H,DW0A5H,4BH,89H DW87H,234H,64H,35H,20H,21H,50H,DW88H,92H,11H,0FFHDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATAMOVDS,AX
**MOVCX,20MOVSI,0MOVAX,0NEXT: ADDAX,ARRY[SI]INCSIINCSILOOPNEXTMOVAH,4CHINT21HCODEENDSENDSTART**2、LOOPE/LOOPZ(如果相等/如果為0則迴圈)格式:LOOPE/LOOPZ
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 康復(fù)輔具的跨國合作與市場準(zhǔn)入考核試卷
- 木材切割精度控制技術(shù)考核試卷
- 停車設(shè)備行業(yè)營銷策略與渠道建設(shè)考核試卷
- 圖書、報刊行業(yè)風(fēng)險管理考核試卷
- 電工培訓(xùn)課件
- 再生物資回收在氣候變化適應(yīng)策略中的應(yīng)用考核試卷
- 家居紡織品的文化與藝術(shù)欣賞考核試卷
- 土地利用規(guī)劃中的鄉(xiāng)村景觀規(guī)劃考核試卷
- 快遞商鋪轉(zhuǎn)讓合同范本
- 采購合作合同范本
- 2023年新改版教科版五年級下冊科學(xué)全冊教案(附知識點)
- 固定式塔式起重機(jī)基礎(chǔ)設(shè)計及計算
- 奶牛性控凍精的使用細(xì)則:張相文 整理
- GB/T 34376-2017數(shù)控板料折彎機(jī)技術(shù)條件
- GB/T 22492-2008大豆肽粉
- 三年級下冊豎式脫式計算
- 《財務(wù)風(fēng)險的識別與評估管理國內(nèi)外文獻(xiàn)綜述》
- ??谑写媪糠抠I賣合同模板(范本)
- 經(jīng)典文學(xué)作品中的女性形象研究外文文獻(xiàn)翻譯2016年
- 高爐煤氣安全知識的培訓(xùn)
- 2008 年全國高校俄語專業(yè)四級水平測試試卷
評論
0/150
提交評論