版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
PAGE23第三章8086的尋址方式和指令系統(tǒng)基本內(nèi)容:8086尋址方式的概念,7種尋址方式的操作過程,8086的指令系統(tǒng)的構(gòu)成及六大類基本指令。基本要求:掌握8086的7種尋址方式,掌握8086指令系統(tǒng)的匯編格式,掌握每一個(gè)指令的功能用法。重點(diǎn)內(nèi)容:8086的7種尋址方式,傳送指令、算術(shù)運(yùn)算指令、邏輯指令、控制轉(zhuǎn)移指令。難點(diǎn):立即尋址與直接尋址,寄存器尋址與寄存器間接尋址的區(qū)別,相對尋址的寄存器搭配使用,算術(shù)指令中寄存器的使用及結(jié)存放移位指令的使用,控制轉(zhuǎn)移指令的操作過程。第一節(jié)8086的尋址方式計(jì)算機(jī)中的匯編指令由操作碼字段和操作數(shù)字段組成,操作碼字段指示CPU執(zhí)行哪一種操作,如傳送、運(yùn)算等;操作數(shù)為參與操作的數(shù)據(jù),如寄存器中的數(shù)據(jù)或內(nèi)存單元中的數(shù)據(jù)等。(如加法指令須指明兩個(gè)被加數(shù))操作數(shù)字段可以直接給出操作數(shù)本身或者指明操作數(shù)的存放地址,如是在寄存器中存放須指出寄存器名稱,若是在存儲器中存放,須給出此操作數(shù)在存儲器中的地址。8086中對操作數(shù)的尋址方式可分為下列7種尋址方式。立即數(shù)尋址方式特征:操作數(shù)由指令直接給出,緊跟于操作碼之后,做為指令的一部分。注意:1、立即數(shù)可做源操作數(shù),不能是目的操作數(shù);2、立即數(shù)只能是8位或16位的整數(shù),不能是小數(shù),且與目的操作數(shù)格式要一致;例:MOVBX,107DHMOVAL,90H不能寫為MOV90H,AL操作數(shù)的立即數(shù)可以是16進(jìn)制,十進(jìn)制或二進(jìn)制,但必須注明。例:MOVBL,90(D)――十進(jìn)制后綴可不寫,系統(tǒng)默認(rèn)。MOVAL,10010000B特點(diǎn):不啟動總線周期,速度快。寄存器尋址特征:操作數(shù)存放于寄存器中,指令中用寄存器名指出。16位操作數(shù)AX,BX,CX,DX,SI,DI,SP,BP等。8位操作數(shù)AL,BL,CL,DL,AH,BH,CH,DH特點(diǎn):不訪問存儲器,速度快。例:MOVAX,BX執(zhí)行前(AX)=OFC56H(BH)=0100H執(zhí)行后(AX)=0100H(BH)=0100H不變INCDL執(zhí)行前(DL)=02H執(zhí)行后(DL)=03H注:寄存器尋址時(shí),寄存器可以是源操作數(shù),也可以目的操作數(shù)。直接尋址方式特征:數(shù)據(jù)存放于存儲器中,存儲單元的有效地址(偏移地址)由指令給出,指令運(yùn)算時(shí)可根據(jù)段地址與偏移地址計(jì)算物理地址,找出此操作數(shù)操作數(shù)在數(shù)據(jù)段中MOVAX[2000H]運(yùn)行前DS=1000H運(yùn)行后(AX)=1234HMOVAL[2000H]運(yùn)行后(AL)=34H操作數(shù)在其它段中必須用段前綴指出段寄存名,默認(rèn)為DS。如ES:MOVAX,[1000H]或MOVAX,ES:[1000H]執(zhí)行前,ES=3000H執(zhí)行后(AX)=5C0FH編程時(shí)為求方便,可以使用符號地址,先定義符號,指令中直接使用此符號表示偏移段地址。如:VALUEDW1000HMOVAX,ES:[VALUE]MOVBX,[VALUE]執(zhí)行前ES=3000HDS=1100H執(zhí)行后(AX)=(31000H)=5C0FH(BX)=(12000H)=1234H寄存器間接尋址方式特征:操作數(shù)在存儲器中存放,存儲單元的偏移地址由寄存器指出寄存器可以是BX,BP,SI,DI之一。如果指令中指定的寄存器是BX,SI,DI無前綴時(shí)表示此數(shù)據(jù)段中用DS做段寄存器(BX)則物理地址=16D×(DS)+(SI)(DI)如果指令中指定的寄存器是BP,則默認(rèn)此數(shù)據(jù)在堆棧段用SS則物理地址=16D×(SS)+(BP)例:MOVAX,[BX]執(zhí)行前(DS)=1000H,(BX)=2000H執(zhí)行后(AX)=(12000H)=1234HMOVAX,[BP]執(zhí)行前(SS)=2000H,(BP)=3000H執(zhí)行后(AX)=(23000H)=6978H若操作數(shù)存放于其它段時(shí),指定段前綴例:MOVAX,ES:[BX]執(zhí)行前(DS)=1000H(BX)=2000H(ES)=3000H執(zhí)行后(AX)=(32000H)=10EBH寄存器相對尋址方式直接變址尋址方式特征:在寄存器間接尋址的基礎(chǔ)上,指令中輸出一個(gè)8位/16位的偏移量[BX]8位偏移量有效地址EA=[BD]+[SI]16位偏移量[DI][BX]8位偏移量即物理地址=16D×DS+[SI]+[DI]16位偏移量8位偏移量物理地址=16D×(BP)+16位偏移量例:MOVAX,TABLE[SI]或MOVAX,[TABLE+SI]執(zhí)行前TABLE=3000H[SI]=2000HDS=3000H則物理地址=30000H+2000H+3000H=35000H,(AX)=(35000H)若數(shù)據(jù)在其它段中要加前綴如:MOVAX,ES:SI+2000H執(zhí)行前ES=2000H,SI=1000H則(AX)=(23000H)基址變址尋址方式通常我們將BX,BP稱為基址寄存器,SI,DI稱為變址寄存器BX做間接尋址時(shí),默認(rèn)DS段如MOVAX,[BX]數(shù)據(jù)段基址尋址DS=5000HBX=4000H則(AX)=(54000H)BP做間接尋址時(shí),默認(rèn)SS段如MOVAX,[BP]堆棧段基址尋址BP=3000HSS=5000H執(zhí)行后(AX)=(53000H)用SI、DI變址寄存器作間接尋址時(shí)稱為源變址尋址、目的變址尋址若指令中,有效地址由一基址寄存器和一個(gè)變址寄存器之和給定稱為基址+變址尋址物理地址=16D×(DS)+(BX)+(SI)(DI)物理地址=16D×(SS)+(BP)+(SI)(DI)例:MOVAX,[BX][DI]或MOVAX,[BX+DI]執(zhí)行前:DS=1000HBX=0F00HDI=030HES=4000H執(zhí)行后:(AX)=(10000+0F00H+0030)=(10F30H)=?若用上段前綴如MOVAX,ES:[BX][DI]或MOVAX,ES:[BX+DI]結(jié)果(AX)=(40F30H)=?相對基址變址尋址方式特征:在基址變址尋址方式基礎(chǔ)上再加一個(gè)16位/8位偏移量物理地址=16D×(DS)+(BX)+(SI)+8位偏移量(DI)+16位偏移量如:MOVAX,TAB[BX+SI]物理地址=16D×(SS)+(BP)+(SI)+8位偏移量(DI)+16位偏移量如:MOVAX,[BX+SI+2000H]
第二節(jié)、8086的指令系統(tǒng)指令系統(tǒng):計(jì)算機(jī)指令的集合。每種計(jì)算機(jī)都有自己固有的指令系統(tǒng),不同系列計(jì)算機(jī)的指令系統(tǒng)互不兼容。但同一系列計(jì)算機(jī)的指令系統(tǒng)是向上兼容的。執(zhí)行周期1)從程序存儲系統(tǒng)中獲得指令2)確定所需的動作和指令大小3)定位并獲得操作數(shù)數(shù)據(jù)4)計(jì)算結(jié)果數(shù)值或狀態(tài)5)在存儲系統(tǒng)中存放結(jié)果以備后用6)確定后續(xù)指令操作碼:用來說明該指令所要完成的操作。指令的組成操作數(shù)(地址碼):用來描述該指令的操作對象。操作碼操作數(shù)(地址碼)指令格式:指令在機(jī)器中用若干位二進(jìn)制數(shù)表示。8086/8088指令為1~6個(gè)字節(jié)。第1個(gè)字節(jié)和第2個(gè)字節(jié)(部分位)表示操作碼,其余為指令操作數(shù)。分類(根據(jù)操作數(shù)給出地址的個(gè)數(shù)):無操作數(shù)指令:例如,停機(jī)指令HLT單操作數(shù)指令:例如,增量指令I(lǐng)NCAX雙操作數(shù)指令:例如,傳送指令MOVAX,267大多數(shù)指令需要雙操作數(shù),一般第一個(gè)操作數(shù)為目的操作數(shù),第二個(gè)操作數(shù)為源操作數(shù)。指令處理結(jié)果將存入到目的操作數(shù)的地址中去。指令的表示方法機(jī)器指令:由二進(jìn)制碼組成。這是一種計(jì)算機(jī)所能直接理解和執(zhí)行的指令。但這種指令不好記憶,不易理解,難寫難讀。匯編指令:用英文單詞縮寫而構(gòu)成的助記符代替這種二進(jìn)制碼指令,以而形成了匯編指令。如加法用ADD,傳送用MOV等。這些符號化了的指令使得書寫程序、閱讀程序和修改程序變得簡單、方便,但計(jì)算機(jī)不能直接識別和執(zhí)行。匯編指令與機(jī)器指令是一一對應(yīng),本書中的指令都使用匯編指令形式書寫,便于讀者學(xué)習(xí)和理解。計(jì)算機(jī)不能直接識別和執(zhí)行匯編指令,在把它交付給計(jì)算機(jī)執(zhí)行之前,必須將匯編指令翻譯成計(jì)算機(jī)所能識別的機(jī)器指令。將匯編指令翻譯成機(jī)器指令的過程由一個(gè)被稱為“匯編程序”的工具軟件自動實(shí)現(xiàn)。指令系統(tǒng)包括六大類、133種基本指令,通過尋址方式的變化與數(shù)據(jù)形式(字節(jié)、字型)的組合,可構(gòu)成上千條指令。指令系統(tǒng)按功能分為數(shù)據(jù)傳送類、算術(shù)運(yùn)算類、邏輯運(yùn)算與移位類、串操作類、控制轉(zhuǎn)移類、處理器控制類。傳送類指令8086的傳送指令是實(shí)現(xiàn)寄存器之間,CPU與存儲器之間,CPU和I/O端口之間數(shù)據(jù)傳送的指令。(1)、通用傳送指令MOV指令格式:MOVDST,SRC功能:將源操作數(shù)的一字節(jié)或一個(gè)字段傳送給DST包括:寄存器——寄存器寄存器――內(nèi)存立即數(shù)――內(nèi)存立即數(shù)――寄存器注意:(1)、兩操作數(shù)中至少有一個(gè)是寄存器,不能是兩個(gè)地址單元例:MOVAX,[1000H]MOV[2000H],AX但MOV[2000H],[1000H]是錯(cuò)誤的(2)、寄存器可以用做DST,SRC,但是CS,IP不能用做DST。如MOVIP,1000H錯(cuò)誤(3)、傳送數(shù)據(jù)的位數(shù)由寄存器或偽指令決定例:MOVAL,[1000H]將[1000H]單元字節(jié)送ALMOVAX,[1000H]將[1000H]單元字節(jié)送AL,1001H單元字節(jié)送AH。MOVBYTEPTR[SI],0將SI指定的存儲單元清0MOVWORDPTR[SI],0將SI,SI+1指定的兩存儲單元清0(4)、段地址必須用AX寄存器送入DS,ES等。例:MOVAX,1000HMOVDS,AX使DS=1000H,不能用MOVDS,1000H入棧指令與出棧指令堆棧是以“后進(jìn)先出”方式下的一段存儲區(qū)必須在堆棧中用SS做段值寄存器,SP堆棧指針指向棧頂位置。堆棧存取必須以字為單位入棧方向?yàn)橛筛呦虻蜕蒔USH指令――入棧指令格式PUSHSRCSRC不能是立即數(shù)功能:將操作數(shù)保存到堆棧。例:MOVAX,2000HPUSHAX出棧指令POPDST功能:將SP指定的棧中的字單元送入目的操作數(shù)例:POPAX操作(7940H)AX,SP=SP-2注:(1)、CS的值可壓入堆棧,但不能將一個(gè)值彈入CS,如POPCS錯(cuò)誤。(2)、不能將立即數(shù)壓入堆棧。PUSH2000H錯(cuò)誤。(3)、堆棧是先入后出的,要恢復(fù)時(shí)應(yīng)注意順序。3、交換指令XCHG格式:XCHGOPR1,OPR2功能:(OPR1)――――(OPR2)注:(1)、OPR1,OPR2不能都是內(nèi)存單元,必須有一個(gè)是寄存器。例:XCHG[0100H],[1020H]錯(cuò)誤應(yīng)為MOVAX,[0100H]XCHGAX,[1020H]MOV[0100H],AX(2)、不能用段寄器CS,IP等。如:XCHGCS,AX錯(cuò)誤。(2)、累加器專用傳送指令8086指令系統(tǒng)中有些指令必須通過累加器來執(zhí)行。1、輸入/輸出指令I(lǐng)NOUT格式: INAL,PORT ;從端口PORT讀一個(gè)字節(jié) INAX,PORT ;從端口PORT讀一個(gè)字 OUTPORT,AL ;向端口PORT寫一個(gè)字節(jié) OUTPORT,AX ;向端口PORT寫一個(gè)字如果端口大于255時(shí)必須事先將端口號存入DX,然后用寄存器間接尋址如:MOVDX,1234HOUTDX,AL(端口為8位)OUTDX,AX(端口為16位)2、換碼指令XLAT程序設(shè)計(jì)時(shí),以常要將一個(gè)代碼轉(zhuǎn)換為另一種代碼,如將數(shù)字轉(zhuǎn)換成ASCⅡ碼格式:XLATOPROPR為表格首地址或XLAT操作(AL)[(AL)+(BX)]說明:BX寄存器指向表格首地址,AL為表中某項(xiàng)與表格首地址的位移量例:將數(shù)字8轉(zhuǎn)換成ASCⅡ碼。MOVBX,3000HMOVAL,08HXLAT操作(3008H)AL即AL=38H(3)地址傳送指令取有效地址指令LEA格式:LEAREGSRC功能:SRC的有效地址送入寄存器例:LEABX,[BX][SI]執(zhí)行前(BX)=0400H(SI)=003CH執(zhí)行后(BX)=043CH注:a、SRC必須是內(nèi)存單元,REG必須是通用寄存器b、不要和其它指令混淆。如:MOVBX,[BX][SI]是將043CH單元內(nèi)送入BX地址指針裝入DS和另一寄存器指令格式:LDSREG,SRC16位通用REG必須是存儲器操作數(shù)操作:(REG)SRC(DS)(SRC+2)例:LDSSI,[10H]執(zhí)行前(DS)=0C000H(C0010H)=0180H(C0012H)=2000H執(zhí)行后SI=(C0000H+10H)=0180HDS=(C0012H)=2000H地址指針:即存儲單元SRC中存放有4個(gè)四字節(jié)的地址SRC指出此四字節(jié)地址存放的地址號。3、LES將地址指針裝入ES和另一個(gè)寄存器指令與LDS類似。不講(4)標(biāo)志傳送指令1、LAHF標(biāo)志讀取指令格式:LAHF操作:PSW中低八位AH2、SAHF設(shè)置標(biāo)志指令格式:SAHF操作:(AH)PSW中低八位標(biāo)志寄存器入棧指令PUSHF格式:PUSHF操作:(SP)(SP)-2{(SP)+1,(SP)}(PSW)標(biāo)志寄器出棧指令POPF格式:POPF操作:(PSW)((SP)+1,(SP))(SP)(SP)+2算術(shù)運(yùn)算類指令之前已講過有符號數(shù)與無符數(shù)的運(yùn)算學(xué)生自己復(fù)習(xí)加法指令1)、ADD不帶進(jìn)位加法格式:ADDDST,SRC操作:(DST)((DST)+(SRC))注:DST必須為累加器,通用寄存器或存儲器,操作數(shù)不能為立即數(shù)例:ADDAL,50HADD[1000H],CXADD[SI][DX],BX不能用ADD50H,AL2)、ADC帶進(jìn)加法格式:ADCDST,SRC操作:(DST)(DST)+(SRC)+CF其他同ADD主要用于多字節(jié)數(shù)的加法操作例:在數(shù)據(jù)段的1200H與1300H開始的存儲單元分別存放有4字節(jié)無符號數(shù)試編寫程序求其和,結(jié)果送入2000H單元分析:四字節(jié)無符號數(shù)可用二次16位加法實(shí)觀MOVAX,[1200H]高16位低16位ADDAX,[1300H]+高16位低16位MOV[2000H],AX——————————MOVAX,[1202H]高16位低16位ADCAX,[1302H]2002H2001HMOV[2002H],AX3)、增一指令I(lǐng)NC格式:INCOPR操作:(OPR)(OPR)+1減法指令1)、不帶借位減法指令SUB格式:SUBDST,SRC功能:(DST)(DST)-(SRC)實(shí)現(xiàn)2個(gè)字節(jié)或2個(gè)字相減,結(jié)果存放于DST2)、帶借位減法指令SBB與加法類似,減法時(shí)可能產(chǎn)生借位,需考慮格式:SBBDST,SRC操作:(DST)(DST)-(SRC)-CF用于多字節(jié)減法,同加法,不多講3)、減一指令格式:DECOPR操作:(OPR)(OPR)-14)、求補(bǔ)指令NEG格式:NEGOPR操作:對操作數(shù)求補(bǔ),結(jié)果送回操作數(shù)注意:a、求補(bǔ)可用按位取反來加1或相當(dāng)于0一數(shù)屬于減法指令b、-128和-32768求補(bǔ)后,結(jié)果無變化,只是OF=1c、CF一般為0,除非操作數(shù)0求補(bǔ)5)、比較指令CMP格式:CMPOPR1,OPR2操作:OPR1-OPR2,置相應(yīng)標(biāo)志位例題在講條件轉(zhuǎn)移指令時(shí)講解一般在此指令后跟條件轉(zhuǎn)移指令例:在2000H開始的存儲單元存放有100個(gè)16位帶符號數(shù),試編寫程序段找出最大值保存到MAX單元MOVBX,2000HMOVAX,BXINCBXINCBXMOVCX,99AGAIN:CMPAX,[BX]JGNEXTMOVAX,[BX]NEXT:ADDBX,2LOOPAGAINMOVMAX,AX此程序詳細(xì)講解乘法指令計(jì)算機(jī)中兩數(shù)相乘有兩種情況:1無符號數(shù)相乘,2有符號數(shù)相乘匯編語言中有專門的指令在十進(jìn)制運(yùn)算時(shí),兩個(gè)一位數(shù)相乘最多結(jié)果為2位數(shù),兩個(gè)二進(jìn)制數(shù)相乘最多有四位結(jié)果。同樣二進(jìn)制數(shù)中,兩個(gè)8位二進(jìn)制數(shù)相乘,積為16位二進(jìn)制數(shù);兩個(gè)16位二進(jìn)制數(shù)相乘,積為32位二進(jìn)制數(shù)。、無符號數(shù)乘法MUL格式:MULSRC(事先在AL或AX中放置被乘數(shù))功能:(AL)×SRC=16位結(jié)果(AX)(AX)×SRC=32位結(jié)果(DX)(高16位)(AX)(低16位)例:MULBLMULBYTEPTR[DI]PTR屬性指明存儲器中參數(shù)運(yùn)算的數(shù)據(jù)長度MULWORDPTR[DI]注:源操作數(shù)不允許使用立即數(shù)尋址方式。2)、有符號數(shù)乘法IMUL格式,功能同MUL,但要求兩個(gè)操作數(shù)必須是有符號數(shù)除法指令無符號數(shù)除法DIV有符號數(shù)除法IDIV規(guī)定:參與除運(yùn)算的被除數(shù)必須是除數(shù)長度的2倍如除數(shù)為8位,被除數(shù)必須是16位即字(AX)/字節(jié)(SRC)=字節(jié)(商在AL,余數(shù)在AH)如除數(shù)為16位,則被除數(shù)必須是32位雙字(DX,AX)/字(SRC)=字(商在AX余數(shù)在DX)1)、無符號數(shù)除法DIV格式:DIVSRC功能:(AX)/(SRC)=商AL(DX,AX)/(SRC)=商(AX)余數(shù)AH余數(shù)(DX)注:執(zhí)行前一定要在AX或DX,AX中放置被除數(shù),要知道結(jié)果分別在哪里存放2)、無符號數(shù)除法同DIV(略)3)、CBW將字節(jié)擴(kuò)展成字(將AL中內(nèi)容擴(kuò)展到AX)專用于有符號數(shù)4)、CWD將字?jǐn)U展成雙字(將AX中內(nèi)容擴(kuò)展到DX,AX)專用于有符號數(shù)為何要擴(kuò)展?除法中要求被除數(shù)長度是除數(shù)的二倍,但某些情況下,給定的被除數(shù)與除數(shù)可能位相同,不符合除法規(guī)則,必須將被除數(shù)擴(kuò)展。如何擴(kuò)展?無符號數(shù)擴(kuò)展:前面補(bǔ)0直到要求位數(shù)相同,如將AL=10010110B擴(kuò)展只需將AH清0即可。有符號數(shù)擴(kuò)展:將符號位向前擴(kuò)展正數(shù)補(bǔ)0,負(fù)數(shù)補(bǔ)1。如(+46)補(bǔ)=00101110B擴(kuò)展后為0000000000101110B;(-46)補(bǔ)=11010010B擴(kuò)展后為1111111111010010B掌握擴(kuò)展法即可,在匯編中有專門指令來擴(kuò)展。例:X/Y(X,Y均為字節(jié))無符號數(shù)時(shí)MOVAL,XMOVAH,0DIVY有符號數(shù)時(shí)MOVAL,XCBWIDIVYBCD碼調(diào)整指令之前已講過,BCD碼是二進(jìn)制編碼的二進(jìn)制數(shù),用四位二進(jìn)制數(shù)表示一個(gè)十進(jìn)制數(shù)位從0000到1001,但執(zhí)行9+1時(shí),結(jié)果為1010不是BCD碼應(yīng)調(diào)整。方法是加61)、加法調(diào)整AAA非壓縮BCD碼調(diào)整DAA壓縮BCD碼調(diào)整2)、減法調(diào)整AAS非壓縮BCD碼調(diào)整DAS壓縮BCD碼調(diào)整3)、乘法調(diào)整AAM4)、除法調(diào)整AAD后兩種操作數(shù)必須是非壓縮BCD碼例:編程實(shí)現(xiàn)(DH)NUM1+NUM2-NUM3三數(shù)均為一位BCD碼MOVAL,NUM1ADDNUM2AAASBBNUM3AASMOVDH,AL用法:①緊跟于加減乘除指令后邊②結(jié)果要在累加器中邏輯運(yùn)算指令和移位指令(一)邏輯運(yùn)算指令主要有我們已學(xué)過的與、或、非、異或指令和測試指令1、與指令A(yù)ND格式:ANDDST,SRC操作:DST與SRC相與,結(jié)果存入DST,全高出高用途:可將某位或某幾位清0例:將AL中第0位第1位清0MOVAL,3FHANDAL,0FCH結(jié)果(AL)=001111002、或指令OR格式:ORDST,SRC操作:DST與SRC相或,結(jié)果放于DST,有高出高用途:將某位或某位幾置1例:將AL中第6位置1MOVAL,3FHORAL,01000000B結(jié)果(AL)=01111111異或指令XOR格式:XORDST,SRC操作:DST與SRC進(jìn)行異或結(jié)果存入DST相同出低用途:將某寄存器所有位清0例:XORAX,AX4、非指令NOT格式:NOTDST操作:將DST取反后,結(jié)果存入DST5、測試指令TEST格式:TESTDST,SRC功能:將DST與SRC相與,不存放結(jié)果,只置標(biāo)志位用途:測試某位或某幾位相等。例:測試DL中第0位是否為1,為1時(shí)跳到INT2執(zhí)行,否則順序執(zhí)行。MOVAL,DLTESTAL,00000001BJEINT2……INT2:(二)、移位指令移位指令包括算術(shù)移位指令、邏輯移位指令和循環(huán)移位指令,分別進(jìn)行左移和右移操作。這些指令均有統(tǒng)一的語句格式:[標(biāo)號:]操作符DST,1或[標(biāo)號:]操作符DST,CL其功能為將目的操作數(shù)的所有位按操作符規(guī)定的方式移動1位或按寄存器CL規(guī)定的次數(shù)(0~255)移動,結(jié)果送入目的地址。目的操作數(shù)是8位(或16位)的寄存器數(shù)據(jù)或存儲器數(shù)據(jù)。非循環(huán)移位指令1)、邏輯左移SHL格式:SHLDST,SRC操作:CF高位低位02)、算術(shù)左移SAL同SHL完全一樣3)、邏輯右移SHR格式:SHRDST,SRC操作:0高位低位CF4)、算術(shù)右移SAR格式:SARDST,SRC操作:0或1|高位低位CF解釋本條指令注:a、如果移動一位時(shí),可直接在指令中指定SHLAX,1SARAL,1b、如果移動位數(shù)超過一位時(shí),必須將移位次數(shù)放于CL中,指令中用CL指定移動位數(shù)如:MOVCL,7SHLAX,CL不能用SHLAX,7循環(huán)移位指令1)、不帶進(jìn)位循環(huán)左移指令ROL格式:ROLDST,SRC操作:最高位進(jìn)入CF同時(shí)也送入最低位2)、不帶進(jìn)位循環(huán)右移指令ROR格式:RORDST,SRC操作:3)、帶進(jìn)位循環(huán)左移RCL格式:RCLDST,SRC操作:4)、帶進(jìn)位循環(huán)右移RCR格式:RCRDST,SRC操作:同樣,移位數(shù)大于1時(shí),必須用CL指定次數(shù)例:將DX,AX中的雙字邏輯右移四位分析:所學(xué)八條指令均為按字操作或按字節(jié)操作,但無指令能同時(shí)將雙字移位,如何解決呢? 過程DXAXCFMOVCX,4 開始11000100110110110NEXT:SHRDX,1 101100010CF=0011011011RCRAX,1 200110001CF=0001101101LOOPNEXT 300011000CF=1100110110…… 400001100CF=0010011011串操作指令——對一串字符或數(shù)據(jù)用一條指令操作(一)、字符串傳送指令MOVSB/MOVSW傳送字節(jié)MOVSB傳送字MOVSW功能:(DS,SI)――――(ES,DI),修改SI,DI指向下一個(gè)元素注:a、源操作數(shù)在DS中,偏移地址由SI給定,目的數(shù)在ES中,EA由DI給定b、傳送字節(jié)后,SI,DI加(減)1,傳送字后,SI,DI加(減)2;加減由DF控制,DF=1減,DF=0加即MOVSBDF=0SI,DI加1MOVSWDF=0SI,DI加2DF=1SI,DI減1DF=1SI,DI減2C、多個(gè)字節(jié)多個(gè)字傳送時(shí),可以用前綴REP實(shí)現(xiàn)。例:編程實(shí)現(xiàn)將DS中2000H處的100個(gè)字節(jié)傳送到ES中4000H開始的存儲區(qū)中。MOVSI,2000HMOVDI,4000HMOVCX,100CLDREPMOVSBKKK:MOVSBDECCXJNZKKK解釋:CLD指令是令DF=0,使SI,DI自增。REP指令為重復(fù)操作指令,隱含計(jì)數(shù)器為CX(二)、字符串比較指令CMPSB/CMPSW格式:CMPSB/CMPSW功能:將(DS,SI)中的字/字節(jié)與(ES,DI)中的字/字節(jié)與比較,設(shè)置相應(yīng)標(biāo)置位IF比較完畢后令SI,DI改變,指向下一個(gè)操作數(shù)。注意事項(xiàng):a、同上b、同上c、可以加前綴REPI,REPNI,REPE,REPNE例:REPE/REPNECMPSB;字節(jié)相等且CX不等于0,繼續(xù)比較下一個(gè)字節(jié),直到找不相等字節(jié)或CX=0,IF=1REPNE/REPNECMPSB;字節(jié)不等且CX不等于0,繼續(xù)比較,直到找相等字節(jié)或CX=0,IF=0具體例程見課本P95(三)、存字符串指令STOSW/STOSB格式:STOSB/STOSW操作:將AL/AX中數(shù)存到ES段DI寄存器所指的內(nèi)存單元,并修改DI內(nèi)容,可與REP聯(lián)用,用于對一長度為CX的緩沖區(qū)設(shè)初值(四)、取字符串指令LODSB/LODSW功能:將(DS,SI)內(nèi)容送AL或AX,并根據(jù)DF修改SI值?!镒ⅲ阂话惚戎噶畈挥们熬Y,否則AL,AX內(nèi)容被覆蓋(五)、字符串檢索指令SCASB/SCASW格式:SCASB/SCASW功能:將AL或AX中的內(nèi)容與ES段DI所指定的存儲單元的字節(jié)/字比較,并修改DI,指向下一個(gè)數(shù),不保存結(jié)果,只根據(jù)結(jié)果置條件碼。例1:從代碼為a~o的15位學(xué)生中選取班長一人,每人從鍵盤鍵入代號,在ES的2000H處開始15個(gè)單元分別存放15人的票數(shù)。CLDMOVAL,0MOVES,2000HMOVDI,2000HMOVCX,15REPSTOSB;15人各自票數(shù)分別清0MOVBX,15NEXT:CALLINPUT;鍵盤接收選票AL中存代號a~o(略)MOVDI,1000HMOVCX,15REPNISCASBJNENEXT;都不等,無效選票,下一人的代號MOVDX,15SUBDX,CXES:INCBYTEPTR(2000H+DX)DECBXJNINEXT;下一人投票CALLDISP;顯示票數(shù)結(jié)果(略)例2、(參考)P96例控制轉(zhuǎn)移類指令(一)、無條件轉(zhuǎn)移指令和條件轉(zhuǎn)移指令1、無條件轉(zhuǎn)移指令JMP無條件的跳轉(zhuǎn)到指定的地址去執(zhí)行程序轉(zhuǎn)移可分為兩類:a、段內(nèi)轉(zhuǎn)移:指在同一個(gè)地址段中跳轉(zhuǎn),此時(shí)CS值不變,只要修改IP的值即可達(dá)到轉(zhuǎn)移的目的b、段間轉(zhuǎn)移:指由一個(gè)代碼段跳轉(zhuǎn)到另一個(gè)代碼段中去執(zhí)行,此時(shí)不僅要修改IP的值,而且要修改CS的值,所以轉(zhuǎn)移的目標(biāo)地址由新的段地址和偏移地址組成。(1)、段內(nèi)直接短轉(zhuǎn)移格式:JMPSHORTOPR操作:(IP)(IP)+8位偏移量,OPR一般用符號地址例:JMPSHORTNEXT匯編時(shí)自動將標(biāo)號的地址找出,求偏移量NEXT:MOVAL,0FH跳轉(zhuǎn)目標(biāo)還可以在JMP指令之前,所以8位偏移量是有符數(shù),只能在-128~127間跳(2)、段內(nèi)直接近轉(zhuǎn)移格式:JMPNEARPTROPR操作:(IP)(IP)+16位偏移量由于OPR提供了16位偏移量,所以可以實(shí)現(xiàn)在64K大小的段內(nèi)任意跳轉(zhuǎn)。(3)、段內(nèi)間接轉(zhuǎn)移格式:JMPWORDPTROPR操作:(IP)(EA)解釋:前兩條指令中目標(biāo)地址由指令直接給出,而這條指令中轉(zhuǎn)移的目標(biāo)地址在由OPR的尋址方式?jīng)Q定??赡苁羌拇嫫鲗ぶ?,寄存器間接尋址等(除立即數(shù)外)如:JMPBX;(IP)(BX)目標(biāo)地址在存儲器中存放JMP[BX][SI];(IP)=(16D×(DS)+(BX)+(SI))在存儲器中存放JMPTABLE[BX];(IP)=(16D×(DS)+BX+位移量TABLE)在存儲器中存放(4)、段間直接轉(zhuǎn)移格式:JMPFARPTROPR(目標(biāo)地址的段地址和偏移地址在指令中給出)操作:(IP)OPR的段內(nèi)偏移地址(CS)OPR所在的段地址例:JMP2000H:0100H例:C1SEGMENT……JMPFARPTRNEXT解釋:目標(biāo)地址由符號地址給出。若C2的段地址為C1ENDS2000H,所在偏移地址為50H,則執(zhí)行JMP后,……物理地址=20000H(CS)+50H(IP)=20050HC2SEGMENT……NEXT:DECCX……C2ENDS(5)、段間間接轉(zhuǎn)移格式:JMPDWORDPTROPR操作:(IP)(EA)(CS)(EA+2)解釋:與段間直接轉(zhuǎn)不同,段間間接轉(zhuǎn)移時(shí),目標(biāo)地址(新段地址和偏段地址在存儲器存放,即四個(gè)連續(xù)存儲單元,一般偏段量在低地址,段地址在高地址單元,指令中由OPR的尋址方式確出目標(biāo)地址的存放地址。注:不能是立即數(shù)或寄存器尋址方式例:JMPDWORDPTR[SI](SI,SI+1)IP(SI+2,SI+3)CS條件轉(zhuǎn)移指令根據(jù)上一條指令執(zhí)行后相應(yīng)的標(biāo)志位狀態(tài)實(shí)現(xiàn)轉(zhuǎn)移條件成立則轉(zhuǎn)移,條件不成立則執(zhí)行下一條指令,可根據(jù)8位偏移量前跳或后跳,所以跳轉(zhuǎn)范圍為-128~127(1)、標(biāo)志位跳轉(zhuǎn)JZ/JEIF=1跳轉(zhuǎn) JSSF=1轉(zhuǎn)移 JOOF=1溢出則轉(zhuǎn)移JNZ/JNEZF=0轉(zhuǎn)移 JNSSF=0轉(zhuǎn)移 JNOOF=0不溢出則轉(zhuǎn)移JP/JPEPF=1轉(zhuǎn)移 JB/JC/JNAECF=1轉(zhuǎn)移低于,不高于,等于JNP/JPOPF=0轉(zhuǎn)移JNB/JNC/JAECF=0不低于,高于或等于轉(zhuǎn)移(2)、無符號數(shù)比較轉(zhuǎn)移JBJCJNAE 低于,不高于或等于轉(zhuǎn)移JNBJNC JAE高于,不低于或等于轉(zhuǎn)移JBEJNA 不高于,低于等于轉(zhuǎn)移JNBEJA高于,不低于或等于轉(zhuǎn)移(3)、有符號數(shù)比較轉(zhuǎn)移JLJNGE小于,即不大于或不等于跳轉(zhuǎn)JNLJGE大于等于即不小于轉(zhuǎn)移JLEJNG 小于等于即不大于轉(zhuǎn)移JNLEJG 大于轉(zhuǎn)移解釋:a、有符號數(shù),無符號數(shù)比較應(yīng)選用相應(yīng)的轉(zhuǎn)移指令b、無符號數(shù)用高于低于判別,有符號數(shù)用于大于,小于判別(4)、CX為0則轉(zhuǎn)移JCXZOPR例:判別兩數(shù)是否相同,若相等則執(zhí)行動1,不等則執(zhí)行動作2相等否?相等否?動作1動作2動作3JEACT1動作2JMPACT3;YNACT1:動作1……ACT3:動作3(二)、循環(huán)指令在某些情況下,需要對某一特定的操作(一條指令)重復(fù)N次,此時(shí)不必要重復(fù)寫同樣代碼,又需用循環(huán)即可實(shí)現(xiàn),匯編中有專用指令或用跳轉(zhuǎn)指令LOOP指令格式:LOOP標(biāo)號=0退出循環(huán)向下執(zhí)行功能:CX-1CXCX=0?不等于0到標(biāo)號處執(zhí)行LOOPZ/LOOPE指令格式:LOOPI標(biāo)號操作:CX不等于0且IF=1時(shí),到標(biāo)號處執(zhí)行,否則退出循環(huán)向下執(zhí)行LOOPNZ/LOOPNE指令格式:LOOPNE標(biāo)號操作:CX不等于0且IF=0時(shí),到標(biāo)號處執(zhí)行,否則退出循環(huán)向下執(zhí)行例:以NEW為首地址的存儲單元存放有M字?jǐn)?shù)組,試編程求其和,并將結(jié)果存放于RESULT單元MOVAX,0;存放和的寄存器清0MOVSI,0MOVCX,M;循環(huán)次數(shù)為MNEXT:ADDAX,NEW[SI];加上下一個(gè)字ADDSI,2LOOPNEXTMOVRESULT,AX……(三)、子程序指令在程序設(shè)計(jì)時(shí),往往在多處要進(jìn)行同樣的操作,執(zhí)行相同的程序段,但又不是連續(xù)執(zhí)行,不能用LOOP指令,為方便將這一段程序?qū)憺樽映绦颍鞒绦驁?zhí)行此功能時(shí),調(diào)用子程序轉(zhuǎn)入子程序運(yùn)行,執(zhí)行完后又由子程序返回到主程序繼續(xù)向下運(yùn)行。(1)、子程序調(diào)用指令CALL由子程序與調(diào)用程序所在位置不同分段內(nèi)調(diào)用與段間調(diào)用段內(nèi)直接調(diào)用CALL子程序地址格式:CALLDST操作:(SP)(SP)-2((SP)+1,(SP))(IP)(IP)(IP)+16位偏移量說明:子程序調(diào)用時(shí)CALLPROC1,IP指向下一條要執(zhí)行指令的地址,因子程序調(diào)用完后要繼續(xù)向下執(zhí)行,所以應(yīng)將此處的IP值即返回地址保存,然后再將子程序的偏移地址送入IP使CPU執(zhí)行子程序。例:CALL1000H段內(nèi)間接調(diào)用格式:CALLDST操作:(SP)(SP)-2((SP)+1,(SP))(IP)(IP)(EA)子程序的偏移地址在寄存器或存儲單元中存放由尋址方式找出。例:CALLAX調(diào)用地址由AX給出段間直接調(diào)用格式:CALLDST操作:(SP)(SP)-2((SP)+1,(SP))(CS)(SP)(SP)-2((SP)+1,(SP))(IP)(IP)偏移地址(CS)子程序所在段地址例:CALL5000H:2000H4、段間間接調(diào)用操作同3,但子程序的段地址是在存儲單元中存放如:CALLDWORDPTR[SI](SI)=1000CS,IP為子程序的段地址,偏移地址(2)、子程序返回指令RET格式:RET調(diào)用完子程序后要將返回地址CS,IP重新回主程序運(yùn)行段內(nèi):((SP)+1,(SP))IP段間((SP)+1,(SP))IP(SP)(SP)+2(SP)(SP)+2
溫馨提示
- 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è)技術(shù)學(xué)院《施工技術(shù)與施工組織》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東水利電力職業(yè)技術(shù)學(xué)院《能源化學(xué)工程概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東青年職業(yè)學(xué)院《法語語法II》2023-2024學(xué)年第一學(xué)期期末試卷
- 七年級上冊《4.2.3整式的加減》課件與作業(yè)
- 廣東南華工商職業(yè)學(xué)院《第二外語(日語)(II)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東茂名幼兒師范??茖W(xué)?!吨袊F(xiàn)當(dāng)代文學(xué)經(jīng)典鑒賞》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東嶺南職業(yè)技術(shù)學(xué)院《數(shù)學(xué)分析實(shí)踐教學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 大學(xué)語文(南開大學(xué))學(xué)習(xí)通測試及答案
- 2025新北師大版英語七年級下UNIT 3 Rain or Shine單詞表
- 【名師一號】2020-2021學(xué)年高中英語人教版必修4語篇提能-2
- 倉央嘉措詩全集
- 海洛斯操作手冊(說明書)
- 建筑勞務(wù)公司組織機(jī)構(gòu)示意圖
- 深基坑施工危險(xiǎn)源辨識控制措施
- GB/T 35222-2017地面氣象觀測規(guī)范云
- 文史資料選輯合訂本(46卷本第1輯至第136輯)
- 內(nèi)蒙古旅游行業(yè)發(fā)展現(xiàn)狀、發(fā)展中存在的問題及解決對策分析
- 竣工驗(yàn)收湖北省市政基礎(chǔ)設(shè)施工程竣工驗(yàn)收質(zhì)量評價(jià)報(bào)告
- 鄂爾多斯盆地測井地質(zhì)分層和曲線特征課件
- 湘教版初中地理七上34《世界的聚落》課件
- 蘇教版六年級上冊數(shù)學(xué)第五單元《分?jǐn)?shù)四則混合運(yùn)算》單元分析及全部教案(共計(jì)8課時(shí))
評論
0/150
提交評論