微機原理指令_第1頁
微機原理指令_第2頁
微機原理指令_第3頁
微機原理指令_第4頁
微機原理指令_第5頁
已閱讀5頁,還剩106頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

3.580486基本集指令分6類,為講授方便,用N代表立即數(shù),N8、N16、N32代表8、16、32位立即數(shù)R代表寄存器操作數(shù),R8、R16、R32代表8、16、32位寄存器操作數(shù)M代表內存操作數(shù),M8、M16、M32代表8、16、32位內存操作數(shù)S代表段寄存器總說明:源、目操作數(shù)不可同為內存操作數(shù)源、目操作數(shù)屬性一致(長度相同)當目標操作數(shù)為間址、變址、基址、基+變址的內存操作數(shù),而源操作數(shù)為單字節(jié)/雙字節(jié)立即數(shù),則目標操作數(shù)必須用PTR說明類型若操作數(shù)為間、變、基、基+變的內存操作數(shù),則必須用PTR說明類型2.對于單操作數(shù)指令(如:INC,DEC)1.于雙操作數(shù)指令(如:MOV,ADD,CMP)第一類、傳送類本類指令執(zhí)行后,不影響狀態(tài)標志1.通用傳送(1)數(shù)據(jù)傳送MOV目,源R/M,NR/M/S,R;目標不允許是CSR/M,SR/S,M;目標不允許是CS功能:源→目,源不變,不影響6種標志CS不能做目標,不能向段寄存器寫入立即數(shù)禁止2個內存單元直接傳送源、目屬性要一致說明:為了深入理解數(shù)值定義偽指令、學習PTR運算符的使用,請仔細閱讀以下例題?!纠块喿x以下程序,寫出指令執(zhí)行后的目標操作數(shù)。代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AX;對DS初始化MOVBL,BNUM;BL=?

所以,BL=12H數(shù)據(jù)段經(jīng)過匯編之后,設數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

BNUM:12H34H56H78H90H代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AXMOVBX,WNUM+2;BX=?數(shù)據(jù)段經(jīng)過匯編之后,WNUM:22H11H44H33H66H55H所以,BX=3344H設數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AXMOVEBX,DNUM+4;EBX=?數(shù)據(jù)段經(jīng)過匯編之后,所以,EBX=87654321HDNUM:68H24H57H13H21H43H65H87H設數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AXMOVBL,BYTEPTRDNUM;BL=?數(shù)據(jù)段經(jīng)過匯編之后,所以,BL=68HDNUM:68H24H57H13H設數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AX;對DS初始化MOVBX,WORDPTRBNUM+1;BX=?

所以,BX=5634HBNUM:12H34H56H78H90H數(shù)據(jù)段經(jīng)過匯編之后,設數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AX;對DS初始化MOVEBX,DWORDPTRWNUM+1;EBX=?

所以,EBX=66334411H數(shù)據(jù)段經(jīng)過匯編之后,設數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

WNUM:22H11H44H33H66H55H代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AXMOVBX,WORDPTRDNUM[3];BX=?數(shù)據(jù)段經(jīng)過匯編之后,所以,BX=2113H設數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

DNUM:68H24H57H13H21H43H65H87H代碼段:……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AX;對DS初始化MOVBX,WORDPTRFNUM;BX=?

所以,BX=5566H數(shù)據(jù)段經(jīng)過匯編之后,設數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

FNUM:66H55H44H33H22H11H代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AX;對DS初始化MOVBX,3MOVBL,BNUM[BX];BL=?

所以,BL=78H數(shù)據(jù)段經(jīng)過匯編之后,設數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

BNUM:12H34H56H78H90H代碼段: ……

MOVAX,SEG數(shù)據(jù)段段名MOVDS,AX;對DS初始化MOVSI,OFFSETBNUMMOVBX,[SI+1];BX=?所以,BX=5634H數(shù)據(jù)段經(jīng)過匯編之后,設數(shù)據(jù)段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

BNUM:12H34H56H78H90H(2)符號擴展/零擴展傳送指令MOVSX目標寄存器,源操作數(shù)MOVZX目標寄存器,源操作數(shù) R,R/M說明:源操作數(shù)字長要小于或等于目標寄存器字長功能:源操作數(shù)不變MOVSX源操作數(shù)符號位向高位擴展,再送給目標MOVZX源操作數(shù)高位補零,再送給目標如:MOVDL,-16;DL=F0HMOVSXBX,DL;BX=FFF0H,DL、DH不變MOVZXBX,DL;BX=00F0H,DL、DH不變(3)有效地址傳送LEA目標寄存器,源操作數(shù)R16/R32,內存地址表達式功能:計算內存單元的有效地址(不是其中的操作數(shù))→目標LEABX,BUF;將BUF單元的有效地址→BXLEABX,[SI+5];將數(shù)據(jù)段SI+5變址的那個單元的有效地址→BX注:有效地址就是偏移地址,LEA指令等效與OFFSET運算符

LEABX,BUF等效于MOVBX,OFFSETBUF

(4)交換指令XCHG第一操作數(shù),第二操作數(shù)R,RM,RR,M功能:完成2個操作數(shù)互換說明:段寄存器、立即數(shù)不能參加互換2個內存操作數(shù)不能互換,源、目的類型一致(5)字節(jié)交換BSWAP32位通用寄存器功能:D31~D24D23~D16D15~D8D7~D0說明:←該指令查找數(shù)據(jù)段中的字節(jié)表,即要求數(shù)據(jù)表放在數(shù)據(jù)段,每個表元素為單字節(jié)數(shù)←指令執(zhí)行前:EBX或BX=表頭的有效地址AL=表元素相對于表頭的地址位移量功能:DS:[BX+AL]→AL或DS:[EBX+AL]→AL例:查找NUM單元中的數(shù)所對應的數(shù)碼管字型碼數(shù)碼管外形:adbghcfe(6)查表指令XLAT表頭變量名abh共陰極數(shù)碼管內部結構:數(shù)碼管工作示意圖:鎖存/驅動電路CPUD0~D7a~h數(shù)碼管字型碼:設D7~D0位依次驅動hgfedcba段,則:的字型碼為:00111111=3FH的字型碼為:00000110=06H的字型碼為:01011011=5BH的字型碼為:01100110=66H的字型碼為:01001111=4FH的字型碼為:01111101=7DH的字型碼為:01101101=6DHadbghcfe的字型碼為:00111001=39H的字型碼為:01111001=79H的字型碼為:01110001=71H的字型碼為:01111111=7FH的字型碼為:01101111=6FH的字型碼為:01110111=77H的字型碼為:01111100=7CH的字型碼為:01011110=5EH的字型碼為:00000111=07H解:編程時,按0~9、A~F的規(guī)律,將相應的字型碼設置在數(shù)據(jù)段中:TABDB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,6FH,77H,7CH,39H,5EH,79H,71HNUMDB××;0~15中的一個數(shù)代碼段:MOVAX,SEGTABMOVDS,AXMOVBX,OFFSETTABMOVAL,NUMXLATTAB;AL=相應的字型碼數(shù)據(jù)段:2.堆棧操作指令(1)基本概念堆棧例:農(nóng)民存儲糧食用的“糧垛”就是一個堆棧花生小麥玉米計算機中的堆棧是人為設置的一片連續(xù)內存區(qū),用來存放數(shù)據(jù),所存數(shù)據(jù)按先進后出規(guī)律存取。棧頂和棧底:棧頂:棧區(qū)的低地址棧底:棧區(qū)的高地址棧頂棧底低地址高地址堆棧段寄存器SS:存放堆棧段段基址堆棧指針ESP(SP):存放棧頂單元的偏移地址SS、ESP(SP)初值,由程序員賦值或DOS系統(tǒng)自動賦值數(shù)據(jù)進棧過程(以16位操作數(shù)進棧為例)雙字節(jié)操作數(shù)高字節(jié)低字節(jié)←SPXXHXXH高8位→SS:[SP1]12H34H堆棧區(qū)數(shù)據(jù)進棧過程(以16位操作數(shù)進棧為例)XXHXXH12H←SP高8位→SS:[SP1]低8位→SS:[SP2]雙字節(jié)操作數(shù)高字節(jié)低字節(jié)堆棧區(qū)12H34H數(shù)據(jù)進棧過程(以16位操作數(shù)進棧為例)高8位→SS:[SP1]XXHXXH12H低8位→SS:[SP2]34H←SPSP2→SP雙字節(jié)操作數(shù)高字節(jié)低字節(jié)堆棧區(qū)12H34H數(shù)據(jù)進棧過程(以16位操作數(shù)進棧為例)高8位→SS:[SP1]XXHXXH12H低8位→SS:[SP2]34H←SPSP2→SP雙字節(jié)操作數(shù)高字節(jié)低字節(jié)堆棧區(qū)12H34H高字節(jié)低字節(jié)堆棧區(qū)XXHXXH12H34H←SP數(shù)據(jù)出棧過程(以16位操作數(shù)出棧為例)SS:[SP]→目標(目標寄存器,目標單元)低8位78H56H16位目標寄存器34H78H數(shù)據(jù)出棧過程(以16位操作數(shù)出棧為例)SS:[SP]→目標(目標寄存器,目標單元)低8位高字節(jié)低字節(jié)堆棧區(qū)XXHXXH←SPSS:[SP+1]→目標高8位12H16位目標寄存器56H高字節(jié)低字節(jié)堆棧區(qū)XXHXXH12HSP+2→SP數(shù)據(jù)出棧過程(以16位操作數(shù)出棧為例)SS:[SP]→目標(目標寄存器,目標單元)低8位SS:[SP+1]→目標高8位←SP16位目標寄存器34H56H高字節(jié)低字節(jié)堆棧區(qū)XXHXXH34H12HSP+2→SP數(shù)據(jù)出棧過程(以16位操作數(shù)出棧為例)SS:[SP]→目標(目標寄存器,目標單元)低8位SS:[SP+1]→目標高8位←SP16位目標寄存器80X86的堆棧是向低地址方向延伸的,棧頂是“浮動”的注:一次進棧、出棧的數(shù)據(jù)至少是2字節(jié)(2)堆棧指令←進棧指令PUSH源操作數(shù)N16/N32S/R16/R32/M16/M32如:PUSHWORDPTR[BX]PUSHDWORDPTR[SI+5]說明:非直接尋址的內存操作數(shù),必須用PTR說明屬性←

出棧指令

POP目標操作數(shù)R16/R32/M16/M32S(CS非法)如:PUSHAXPOPBX;BX=AX說明:非直接尋址的內存操作數(shù),必須用PTR說明屬性←

16位標志寄存器進棧/出棧PUSHFPOPF←

32位標志寄存器進棧/出棧PUSHFDPOPFD←

16位寄存器進棧/出棧PUSHA;依次把AX、CX、DX、BX、SP、BP、SI、DI壓棧(共28字節(jié))POPA;從棧頂彈出28字節(jié)依次放入DI、SI、BP、SP、BX、DX、CX、AX⑥32位寄存器進棧/出棧

PUSHAD;依次把EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI壓棧 (共48字節(jié))POPAD;從棧頂彈出48字節(jié)依次放入EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX第二類、算術運算1.二進制加法:ADD

目標操作數(shù),源操作數(shù)2.二進制減法:SUB

目標操作數(shù),源操作數(shù)3.二進制加進位:ADC目標操作數(shù),源操作數(shù)4.二進制減進位:SBB目標操作數(shù),源操作數(shù)

R/M,N/R

R,M功能:ADD:源+目→目SUB:目–源→目ADC:源+目+上條指令執(zhí)行后的C標→目SBB:目–源–上條指令執(zhí)行后的C標→目注:此四種操作都影響A、C、O、P、S、Z標志說明:源、目操作數(shù)的屬性(長度)要一致若源為單/雙字節(jié)立即數(shù),而目標為間、變、基、基+變的內存操作數(shù),則目標要用PTR說明如:ADD[BX],12H×ADDBYTEPTR[BX],12H√ADDWORDPTR[BX],12H√∵12H可以理解為是0012H,或00000012H,匯編程序無法肯定它的具體長度,故要用PTR說明例:實現(xiàn)下列多字節(jié)數(shù)運算(以232為模)56788785H+789A8785H設數(shù)據(jù)段:FIRSTDD56788785HSECONDDD789A8785HSUMDD?0F031FCHA經(jīng)匯編之后:FIRSTSECOND85H87H78H56H85H87H9AH78H解1:用直接尋址,單字節(jié)加法(共需12條指令)MOVAL,BYTEPTRFIRSTADDAL,BYTEPTRSECOND;進位→C標MOVBYTEPTRSUM,AL;不影響C標MOVAL,BYTEPTRFIRST+1;不影響C標ADCAL,BYTEPTRSECOND+1;進位→C標MOVBYTEPTRSUM+1,AL解2:用直接尋址,雙字節(jié)加法(只需6條指令)MOVAX,WORDPTRFIRSTADDAX,WORDPTRSECONDMOVWORDPTRSUM,AXMOVAX,WORDPTRFIRST+2ADCAX,WORDPTRSECOND+2MOVWORDPTRSUM+2,AX解3:用直接尋址,雙字加法(只需3條指令)MOVEAX,FIRSTADDEAX,SECONDMOVSUM,EAX5.二進制加1:INC目標操作數(shù)6.二進制減1:DEC目標操作數(shù)7.二進制求補:NEG目標操作數(shù)R/M說明:←對于非直接尋址的內存操作數(shù),要用PTR明確說明屬性功能:INC:目+1→目;影響A、O、P、S、Z,DEC:目-1→目;不影響C標NEG:0-目→目;影響A、C、O、P、S、ZNDB0FFH,0FFH,0,0

MOVBX,OFFSETNINC[BX]

×INC

BYTEPTR

[BX];N單元為0INC

WORDPTR

[BX];N、N+1單元都為0INC

DWORDPTR

[BX];N、N+1單元都為0

;且N+2單元為1NEG的應用:求出目標操作數(shù)的負值MOVAH,5MOVAL,-6NEG

AH ;AH=-5=FBHNEG

AL ;AL=6如:數(shù)據(jù)段:代碼段:不等價,執(zhí)行結果不同MUL默認乘數(shù)、被乘數(shù)、乘積為無符號二進數(shù)IMUL默認乘數(shù)、被乘數(shù)、乘積為有符號二進數(shù)高位積為0,則C標、O標=0,否則為1乘數(shù)、被乘數(shù)等長,乘積為雙倍長8.無符號二進數(shù)乘法:MUL乘數(shù)9.有符號二進數(shù)乘法格式1:IMUL乘數(shù)格式2:IMUL目,源操作數(shù)R16,R16/M16/N16/N8M16,R16R32,R32/M32/N32/N16/N8M32,R32說明:源、目不能同為M功能:源×目→目格式3:IMUL目,源,立即數(shù)R16/R32,與目等長的R/M,不超過目長的N功能:源×立即數(shù)→目例:實現(xiàn)150000×12解1:用無符號乘法MOVEAX,150000MOVEBX,12MULEBX;150000×12→EAX解2:用有符號乘法格式1MOVEAX,150000;∵EAX最高位必為0MOVEBX,12;EBX最高位也是0IMULEBX;可以用有符號乘法指令解3:用有符號乘法格式2MOVEAX,150000MOVEBX,12IMULEAX,EBX解4:用有符號乘法格式3MOVEAX,150000IMULEBX,EAX,12;12×EAX→EBX10.無符號二進數(shù)除法:DIV除數(shù)11.有符號二進數(shù)除法:IDIV除數(shù)功能:說明:★DIV默認除數(shù)、被除數(shù)、商、余數(shù)均為無符號數(shù)IDIV默認除數(shù)、被除數(shù)、商、余數(shù)均為有符號數(shù)★被除數(shù)應為除數(shù)的雙倍長★

如除數(shù)太小,使商值超出范圍,屏幕顯示:Dividedoverflow然后自動返回DOS說明:源、目操作數(shù)不能同為M若目標為間址、變址、基址或基址加變址尋址的內存操作數(shù),而源為8/16位立即數(shù),則前者要用PTR說明如:CMP[BX],12×CMPBYTEPTR[BX],12√CMPWORDPTR[BX],12√12.比較指令目源,產(chǎn)生A、C、O、P、S、Z6個狀態(tài)標志,不破壞源、目。該指令一般后跟條件轉移指令。功能:CMP目標操作數(shù),源操作數(shù)R/M,與目標等長的R/M不超過目標長的立即數(shù)由此可見,一串0、1代碼,是二進數(shù)還是BCD碼數(shù),是由程序員定義的,CPU并不理解?!?/p>

指令格式中怎樣表述BCD碼數(shù)(在內存區(qū)如何定義BCD碼數(shù))?★假設N=01101001若N是二進數(shù),則N=(105)10若N是BCD碼數(shù),則N=(69)1013.BCD碼調整指令(1)基本概念★組合/未組合BCD碼數(shù)(即壓縮/未壓縮BCD碼數(shù))注意:1010~1111不是BCD碼組合BCD碼:一字節(jié)中含有2位BCD碼未組合BCD碼:一字節(jié)中含有1位BCD碼(高4位為0)00001001000010018位十位個位組合BCD碼0000000010018位未組合BCD碼如:69的BCD碼數(shù)應寫成69H即:MOVAL,69H;則AL=0110,1001或:MOVAL,09H;則AL=00001001MOVAH,06H;則AH=00000110若:MOVAL,69;則AL=0100,0101如:69的BCD碼數(shù)定義在內存單元時即:BUFDB69H或:BUFDB09H,06H若:BUFDB69則錯★BCD碼數(shù)的加減運算∵BCD碼數(shù)是用4位二進數(shù)代表1位十進數(shù)∴其運算法則應是:“逢十進一,減一當十”假設:N1=(0110,1001)BCDN2=(0000,1001)BCD則:N1+N2=69+09=78即結果應當?shù)扔?0111,1000)BCD★如何實現(xiàn)BCD碼數(shù)的加法呢?指令系統(tǒng)中沒有實現(xiàn)BCD碼數(shù)加法的指令,只能借用ADD、ADC指令。但是ADD、ADC指令默認操作數(shù)是二進數(shù),其運算法則是“逢二進一”,而BCD碼數(shù)加法要求按“逢十進一”運算。0110,1001←BCD碼數(shù)N1ADD)0000,1001

←BCD碼數(shù)N20111,0010←這是二進制的和數(shù)+)0000,0110←加06H修正

事實上,N1和N2可以是任意的BCD碼數(shù),借用ADD、ADC運算后必須具體分析運算結果,然后根據(jù)不同的情況選擇加06H修正,或是加60H修正,或是加66H修正。因此借用ADD、ADC指令進行BCD碼數(shù)的加法還必須對結果進行修正,修正后的結果才是BCD碼數(shù)的和數(shù)。舉例如下:0111,1000←得到正確BCD碼和數(shù)如果對于每一次BCD碼數(shù)的加法都要由程序員來判斷結果的話,這太麻煩了,因此指令系統(tǒng)中設計了一條“組合BCD碼數(shù)加法調整指令DAA”由硬件進行分析,再對結果進行調整。上例編程時只需要按以下方式設計程序即可

MOVAL,69H ADDAL,09H DAA(2)BCD碼數(shù)的加法及其調整規(guī)律(見下頁表)筆算CPU運算加法調整

43+5598

0100,0011ADD)0101,01011001,1000C標=0,A標=0,高低四位均沒有出現(xiàn)非法BCD碼,結果正確,不修正39+4988

0011,1001ADD)0100,10011000,0010+)01101000,1000低四位有進位,即A標=1,對運算結果加06H修正

63+54117

0110,0011ADD)0101,01001011,0111+)0110,00001,0001,0111高四位出現(xiàn)非法BCD碼數(shù),對運算結果加60H修正

87+86173

1000,0111

ADD)1000,01101,0000,1101+)0110,01101,0111,0011因為C標=1,低四位出現(xiàn)非法BCD碼,對運算結果加66H修正筆算CPU運算加法調整(3)BCD碼調整指令①組合BCD碼加法調整:DAA功能:默認操作對象為AL,并且根據(jù)具體情況對AL中的高/低4位進行修正。應用:緊跟在以AL為目標寄存器的ADD/ADC之后,但AL中必須是組合BCD碼數(shù)之和。代碼段:

MOVAL,BYTEPTRN1ADDAL,BYTEPTRN2DAAMOVBYTEPTRSUM,ALMOVAL,BYTEPTRN1+1ADCAL,BYTEPTRN2+1DAAMOVBYTEPTRSUM+1,AL例:計算1234+5678=?數(shù)據(jù)段:

N1DW1234HN2DW5678HSUMDW?若被減數(shù)≥減數(shù),調整后,C標=0,AL=組合BCD碼差值若被減數(shù)<減數(shù),調整后,C標=1,AL=差值相對于模(100)10的“補數(shù)”例:計算56-78=?MOVAL,56HSUBAL,78HDAS;C=1,AL=88H;88H是“-12H”相對于模100H的補數(shù)②組合BCD碼減法調整:DAS功能:默認操作對象為AL,對AL中的組合BCD差值進行修正。例:計算8+9=?MOVAL,08HADDAL,09HMOVAH,0AAA;AH=01H,AL=07H修正后:AH=和的十位數(shù)(未組合BCD碼)AL=和的個位數(shù)(未組合BCD碼)③未組合BCD碼加法調整:AAA功能:默認操作對象為AL,對AL中的2個未組合BCD碼數(shù)之和進行修正。修正前:應使AH=0如:計算9-8=?MOVAL,09HSUBAL,08HAAS;C=0,AL=01H若被減數(shù)<減數(shù),修正后,C標=1,AH-1,AL=差值相對于模10H的“補數(shù)”④未組合BCD碼減法調整:AAS功能:默認操作對象為AL,對AL中的2個未組合BCD碼數(shù)之差進行修正若被減數(shù)≥減數(shù),修正后,C標=0,AH不變,AL=未組合差值如:計算89MOVAX,0809HMULAH;AX=89的二進制數(shù)AAM;AH=07H,AL=02H⑤未組合BCD碼乘法調整:AAM功能:默認操作對象為AX,對AX中的2個未組合BCD碼之積(二進制數(shù))進行修正,即:AL10,商→AH,余數(shù)→AL。修正后:AH=乘積的十位數(shù)(未組合BCD碼)AL=乘積的個位數(shù)(未組合BCD碼)如:計算863MOVAX,0806HAAD;AX=86的等值二進制0056HMOVBL,03HDIVBL;AL=(863)的二進制商值11100,;AH=(863)的二進制余數(shù)10MOVBL,AH;轉移AH中的余數(shù)→BLAAM;AX=0208H是商值的未組合十進數(shù)⑥未組合BCD碼除法調整:AAD功能:默認操作對象是AX,執(zhí)行AH10+AL→AL,0→AH應用:在進行未組合BCD碼數(shù)除法操作之前,用AAD指令將AX中的2位未組合BCD碼數(shù)→二進數(shù),以便后繼程序用DIV指令進行二進制數(shù)除法。第三類轉移和調用指令轉移類指令分類按照轉移條件分:無條件轉移和有條件轉移按照轉移范圍分:段內轉移和段間轉移按照獲取轉移地址的方法分:直接轉移和間接轉移無條件轉移功能:無條件轉移,執(zhí)行指定標號處的指令直接間接段內JMP標號JMPSHORT標號JMP寄存器操作數(shù)JMP內存操作數(shù)段間JMP標號JMP內存操作數(shù)說明:①標號是轉移地址標號。②SHORT是短轉移,其轉移范圍相對于指令地址而言在+129~—126個單元之間。$-127:$-126:$:JMPSHORT××;非法轉移

$+129:$+130:③段內“JMP標號”,在實模式下,可轉移到64K代碼段的任何位置。④“JMP寄存器操作數(shù)/內存操作數(shù)”的應用在程序設計中再介紹。2.條件轉移

一般格式操作碼助記符轉移地址標號應用CMP目,源條件轉移指令轉移范圍:轉移到代碼段任何位置操作碼助記符隱含了轉移的條件(1)按標志位的當前狀態(tài)轉移設轉移地址標號為XYZ

JCXYZ;當前C標志為1轉JNCXYZ;當前C標志為0轉JZXYZ;當前Z標志為1轉JNZXYZ;當前Z標志為0轉JSXYZ;當前S標志為1轉JNSXYZ;當前S標志為0轉JPXYZ;當前P標志為1轉JNPXYZ;當前P標志為0轉JOXYZ;當前O標志為1轉JNOXYZ;當前O標志為0轉無符號數(shù)條件轉移應用:CMPN1,N2;N1,N2為無符號數(shù)無符號數(shù)條件轉移設:轉移地址標號為XYZ

則:JAXYZ ;N1>N2轉

JNAXYZ;N1≤N2轉

JCXYZ;N1<N2轉

JNCXYZ;N1≥N2轉(3)有符號數(shù)條件轉移應用:CMPN1,N2;N1,N2為有符號數(shù)(機器數(shù)) 有符號數(shù)條件轉移JGXYZ;被減數(shù)的真值大于減數(shù)的真值轉JGEXYZ;被減數(shù)的真值大于等于減數(shù)的真值轉JLXYZ;被減數(shù)的真值小于減數(shù)的真值轉JLEXYZ;被減數(shù)的真值小于等于減數(shù)的真值轉(4)循環(huán)控制轉移LOOPXYZ;CX-1→CX,結果不為零轉LOOPZXYZ;CX-1→CX,結果不為零,且Z標為1轉LOOPNZXYZ;CX-1→CX,結果不為零,且Z標為0轉JCXZXYZ;測試CX,若CX=0轉JECXZXYZ;測試ECX,若ECX=0轉注意:循環(huán)控制轉移,其轉移范圍相對于指令地址而言為:-126~+129例:設AL=無符號數(shù),實現(xiàn):若AL≥5轉NEXT,否則不轉下面的3種解法哪一種正確?①CMPAL,5JNCNEXT②MOVAH,5CMPAL,AHJNCNEXT③CMPAL,5JGENEXT若AL=0~127,則:解法1:CMPAL,5解法3:CMPAL,5JNCNEXTJGENEXT這2種解法都是正確的。例:某班級40人,某課程考試成績存放在SCORE開始的內存單元。請統(tǒng)計及格人數(shù)→OK單元。思路:考試成績應視為無符號數(shù),把成績依次取出和60比較,大于等于60為及格。數(shù)據(jù)段:SCOREDB××,…××;40個成績OKDB?SCORE有效地址→BX人數(shù)→CX0→DLDS:[BX]≥60YDL→OK返回DOSNBX+1→BXCX-1→CXCX=0?NDL+1→DLY

JCNOINCDLNO:INCBXDECCXJNZLASTMOVOK,DL返回DOS強調:CMP[BX],60是錯的。程序執(zhí)行后應返回DOS,把控制權轉交給操作系統(tǒng)代碼段:MOVAX,SEGSCOREMOVDS,AXMOVDL,0MOVCX,40MOVBX,OFFSETSCORELAST:CMPBYTEPTR[BX],60

3.調用與返回指令★

調用:調用子程序,即無條件轉到子程序的第一條指令★返回:返回斷點,即返回到CALL的后繼指令★子程序:能完成一定功能的相對獨立的程序段主程序

…………CALLXYZ斷點:……XYZ子程序…………RET(1)匯編語言的過程定義語句格式過程名PROC屬性子程序實體 RET過程名ENDP

說明:過程名:子程序名,以字母開頭,長度≤31經(jīng)匯編之后,過程名就是子程序第一條指令的地址。

PROC/ENDP是子程序的定界語句屬性有2種描述

NEAR(或缺省)代表近過程即該子程序和調用它的那條指令在同一個代碼段

FAR代表遠過程即該子程序和調用它的那條指令不在同一個代碼段

RET子程序返回指令(2)段內調用段內直接調用 CALL 過程名功能:斷口偏移地址→堆棧子程序入口的偏移地址→IP,從而轉子程序(3)段間調用段間直接調用CALL 過程名段間間接調用CALL 內存操作數(shù)功能:斷口的“段基址:偏移地址”→堆棧子程序入口的“段基址:偏移地址”→CS:IP,實現(xiàn)段間轉移段內間接調用 CALL 寄存器操作數(shù)CALL 內存操作數(shù)(4)段內/段間返回指令RETRETN(N為偶數(shù))段內RET為C3H,段間RET為CBH功能:①有NEAR屬性的RET指令,從棧頂彈出2字節(jié)→IP有FAR屬性的RET指令,從棧頂彈出4字節(jié)→IP,CS如果棧頂是斷口地址,則能返回斷點,否則不能②RETN指令,首先完成RET功能,然后把堆棧指針再下調N個字節(jié)例:把5個8位二進制數(shù)轉換成十進制數(shù)→屏顯數(shù)據(jù)段:NUM DB ××,××,××,××,××POINTER DW N2_10;匯編后存放N2_10的偏移地址代碼段: MOV AX,SEGNUM MOV DS,AX MOVBX,OFFSETNUMMOVCX,5

LAST:MOVDL,[BX]CALLN2_10;備注:該指令也可以使用下注①②BREAK:INCBX;BREAK為斷點 LOOPLAST返回DOSN2_10PROC

把DL中的二進制數(shù)→十進制數(shù) →十進制數(shù)ASCⅡ碼→屏顯RETN2_10ENDP①CALLPOINTER ;N2_10的偏移地址→IP②MOVSI,POINTER

CALLSI;SI→IP4.中斷調用與中斷返回(1)中斷調用INTN

(N=0~255)功能:標志寄存器→堆?!癐NTN”的后繼指令地址“CS:IP”→堆棧無條件轉向N型中斷服務程序(2)中斷返回IRET功能:從棧頂依次彈出6個元素→IP,CS,標志寄存器 幾個轉移調用指令的總結JMP標號JC標號CALL子程序INT中斷服務子程序第四類邏輯運算取反

NOT

目 ;目→目與AND

目,源 ;源∧目→目或OR

目,源;源∨目→目異或XOR

目,源;源⊕目→目測試TEST

目,源;源∧目

R/M,與目等長的R/M/N6.位測試:BT目,源

R16/M16,等長的R或NR32/M32,等長的R或N影響P,S,ZC標=O標=0功能:把目標操作數(shù)中,與源操作數(shù)對應的那一位→C標志

例:測試AX的D13位,若D13=1,轉NEXT解1:TESTAX,2000H;2000H=0010,0000,0000,0000 JNZNEXT解2:BTAX,13 ;AX的D13位→C標志JCNEXT

例:測AL的D5位。若D5=0,則轉NEXT解1:TESTAL,00100000BJZNEXT解2:BTAL,5JNCNEXT例:XORAX,AX;0→AXANDAL,0FH;AL高4位清0,低4位不變ORAL,0F0H開環(huán)移位指令

算術左移:SAL 操作數(shù),移位次數(shù)算術右移:SAR 操作數(shù),移位次數(shù)邏輯左移:SHL 操作數(shù),移位次數(shù)邏輯右移:SHR 操作數(shù),移位次數(shù)閉環(huán)移位指令含進位的循環(huán)左移:RCL操作數(shù),移位次數(shù)含進位的循環(huán)右移:RCR操作數(shù),移位次數(shù)不含進位的循環(huán)左移:ROL操作數(shù),移位次數(shù)不含進位的循環(huán)右移:ROR操作數(shù),移位次數(shù)說明:以上指令的操作數(shù)為R/M,移位次數(shù)可以是立即數(shù)或CLCF操作數(shù)0(a)SAL(SHL)CF操作數(shù)0(b)SHRCF操作數(shù)(c)SAR(d)RCLCF操作數(shù)CF操作數(shù)(e)RCRCF操作數(shù)(f)ROL操作數(shù)CF(g)ROR

SALBL,1 ;將BL中的無符號數(shù)×2,當C標=1,有溢出

SARBL,1 ;將BL中的有符號數(shù)÷2取整

MOVCL,5;ROLBL,CL;

將AL中無符號數(shù)×8,有溢出轉OVER,哪一種解法正確?等價于ROLBL,5解1:SALAL,3JCOVER解2:MOVAH,8MULAH 舉例:或JOOVERCMPAH,0 ; JNZOVER ;例:把數(shù)據(jù)段SOURCE開始的若干字節(jié),依次傳送到ES附加段BUF開始的緩沖區(qū)……思路:SOURCE:BUF:AL數(shù)據(jù)段SOURCEDB××……××LLLEQU$-SOURCE附加段:BUFDBLLLDUP(?)第五類串操作指令源串首址→DS:SI緩沖區(qū)首址→ES:DI串長度→CXDS:[SI]→ALAL→ES:[DI]傳送一字節(jié)SI+1→SIDI+1→DI修改地址代碼段:給DS賦初值給ES賦初值MOVSI,OFFSETSOURCEMOVDI,OFFSETBUFMOVCX,LLLAGA:MOVAL,[SI]MOVES:[DI],ALINCSIINCDILOOPAGA

MOVAH,4CHINT21HCX-1→CX計數(shù)CX=0控制NY返回DOS

80X86有6條串操作指令,它們是串傳送、串比較、串搜索、串裝入、串存儲和I/O串操作,本小節(jié)僅介紹前5條。各種串操作指令雖然功能不同,但有許多共同之處,例如:源串和目標串的存儲及尋址方式都有隱含規(guī)定,即:源串要放在數(shù)據(jù)段,目標串要放在ES附加段,在16位尋址操作,CPU自動用SI間址訪問數(shù)據(jù)段,用DI間址訪問ES附加段、用CX做為串計數(shù)器。在32位尋址操作下,CPU自動用ESI間址訪問數(shù)據(jù)段,用EDI間址訪問ES附加段,用ECX做串計數(shù)器。由于實模式下邏輯段的最大體積為64K,沒有必要使用32位尋址,為了描述方便,在介紹指令功能的時候,均以16位尋址為基礎。關于串操作指令的總說明串傳送功能:把DS:[SI]的若干元素→ES:[DI]的若干單元基本型格式:字節(jié)串傳送 MOVSB

字串傳送MOVSW

雙字串傳送 MOVSD說明:①關于“元素”的概念在字節(jié)串傳送指令中,一個元素就是1個字節(jié)在字串傳送指令中,一個元素為2個字節(jié)在雙字串傳送指令中,一個元素為4個字節(jié)②指令執(zhí)行前的準備工作:源串的首地址/末地址→DS:SI目串的首地址/末地址→ES:DID標志置0/置1③該指令傳送一個元素后,CPU自動修改SI,DI當D標志為0時,SI,DI增量修改當D標志為1時,SI,DI減量修改

字節(jié)操作

字操作

雙字操作

D標志=0為增址型SI+1→SIDI+1→DISI+2→SIDI+2→DISI+4→SIDI+4→DID標志=1為減址型SI-1→SIDI-1→DISI-2→SIDI-2→DISI-4→SIDI-4→DI修改串指針的操作

有重復前綴的格式REP MOVSB REP MOVSW REP MOVSD準備工作:①同基本型格式 ②欲傳送的元素個數(shù)→CX CX=0?CX-1→CXDS:[SI]的一個元素→ES:[DI]根據(jù)D標志修改SI,DIYN指令結束REPMOVSBREPMOVSW指令功能示意圖REPMOVSD應用舉例以上例題,若使用“MOVSB”,代碼段可以改寫如右下:給DS賦初值給ES賦初值MOVSI,OFFSETSOURCEMOVDI,OFFSETBUFMOVCX,LLL

CLDAGA:MOVSBLOOPAGAMOVAH,4CHINT21H

給DS賦初值給ES賦初值MOVSI,OFFSETSOURCEMOVDI,OFFSETBUFMOVCX,LLLAGA:MOVAL,[SI]MOVES:[DI],ALINCSIINCDI

LOOPAGA

MOVAH,4CHINT21H應用舉例以上例題,若使用“REPMOVSB”,代碼段可以改寫如右下:給DS賦初值給ES賦初值MOVSI,OFFSETSOURCEMOVDI,OFFSETBUFMOVCX,LLLCLDREPMOVSBMOVAH,4CHINT21H

給DS賦初值給ES賦初值MOVSI,OFFSETSOURCEMOVDI,OFFSETBUFMOVCX,LLLAGA:MOVAL,[SI]MOVES:[DI],ALINCSIINCDILOOPAGAMOVAH,4CHINT21H2.串裝入LODSB ;DS:[SI]的1個字節(jié)→AL,自動修改SI

LODSW ;DS:[SI]的2個字節(jié)→AX,自動修改SILODSD ;DS:[SI]的4個字節(jié)→EAX,自動修改SI3.串存儲①基本型格式:STOSB ;AL→ES:[DI]的1個單元,自動修改DISTOSW

;AX→ES:[DI]的2個單元,自動修改DI

STOSD;EAX→ES:[DI]的4個單元,自動修改DI

準備工作:串首址/末址→DS:SI,0/1→D標準備工作:目標區(qū)首址/末址→ES:DI,0/1→D標②有重復前綴的格式REPSTOSBREPSTOSWREP

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論