




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第二章8086基本結(jié)構(gòu)與指令系統(tǒng)單擊此處添加標(biāo)題雙擊添加標(biāo)題文字單擊此處添加段落文字內(nèi)容雙擊添加標(biāo)題文字單擊此處添加段落文字內(nèi)容雙擊添加標(biāo)題文字單擊此處添加段落文字內(nèi)容雙擊添加標(biāo)題文字單擊此處添加段落文字內(nèi)容單擊此處添加標(biāo)題單擊此處添加段落文字內(nèi)容單擊此處添加段落文字內(nèi)容單擊此處添加段落文字內(nèi)容單擊此處添加段落文字內(nèi)容12342.18086微處理器基本結(jié)構(gòu)一、總線接口部件BIU(BusinterfaceUnit)二、執(zhí)行部件(ExecutionUnit)結(jié)構(gòu)分為兩部分:Intel公司1978年推出80861979年推出8088,于1981年用于IBMPC/XT中2.18086微處理器基本結(jié)構(gòu)ALU執(zhí)行部分控制電路輸入/輸出控制電路地址加法器20位16位指令隊(duì)列緩沖器8位執(zhí)行部件(EU)總線接口部件(BIU)外部總線16位運(yùn)算寄存器標(biāo)志寄存器通用寄存器8086CPU編程結(jié)構(gòu)圖段寄存器DLCLBLALSIDIBPSPDHCHBHAH內(nèi)部暫存器IPESSSDSCS
1、總線接口部件BIU管理8086CPU與系統(tǒng)總線的接口負(fù)責(zé)CPU對存儲器和外設(shè)的訪問具體地說:即BIU負(fù)責(zé)從內(nèi)存的指定部分取出指令,送到指令流隊(duì)列中排隊(duì);在執(zhí)行指令是所需的操作數(shù),也由BIU從內(nèi)存的指定區(qū)域取出,傳送給EU部分去執(zhí)行。包含:4個(gè)段寄存器、指令指針寄存器、地址加法器、總線控制器、指令隊(duì)列緩沖器、內(nèi)部暫存器等組件1)段寄存器四個(gè)段寄存器(16位)1.必要性尋址空間1M,而216=64K
指針位數(shù)不夠用與16位地址總線相兼容2.內(nèi)存可分為若干邏輯段(<=64k)單元地址=段首地址+內(nèi)部地址存于CS,DS,SS,ES可存于SP,DP,SI,DI1)段寄存器4個(gè)16位段寄存器CS(代碼段)指明代碼段的起始地址SS
(堆棧段)指明堆棧段的起始地址DS(數(shù)據(jù)段)指明數(shù)據(jù)段的起始地址ES
(附加段)指明附加段的起始地址每個(gè)段寄存器用來確定一個(gè)邏輯段的起始地址,每種邏輯段均有各自的用途CSSSDSES如何分配各個(gè)邏輯段?內(nèi)部結(jié)構(gòu)CSDSSSES代碼段寄存器CS(CodeSegment)代碼段用來存放程序的指令序列代碼段寄存器CS存放代碼段的段地址指令指針寄存器IP指示下條指令的偏移地址處理器利用CS:IP取得下一條要執(zhí)行的指令匯編語言程序員看到的處理器,就是寄存器所以,一定要熟悉這些寄存器的名稱和作用堆棧段寄存器SS(StackSegment)堆棧段確定堆棧所在的主存區(qū)域堆棧段寄存器SS存放堆棧段的段地址堆棧指針寄存器SP指示堆棧棧頂?shù)钠频刂诽幚砥骼肧S:SP操作堆棧頂?shù)臄?shù)據(jù)匯編語言程序員看到的處理器,就是寄存器所以,一定要熟悉這些寄存器的名稱和作用數(shù)據(jù)段寄存器DS(DataSegment)數(shù)據(jù)段存放運(yùn)行程序所用的數(shù)據(jù)數(shù)據(jù)段寄存器DS存放數(shù)據(jù)段的段地址各種主存尋址方式(有效地址EA)得到存儲器中操作數(shù)的偏移地址處理器利用DS:EA存取數(shù)據(jù)段中的數(shù)據(jù)匯編語言程序員看到的處理器,就是寄存器所以,一定要熟悉這些寄存器的名稱和作用附加段寄存器ES(ExtraSegment)附加段是附加的數(shù)據(jù)段,也保存數(shù)據(jù):附加段寄存器ES存放附加段的段地址各種主存尋址方式(有效地址EA)得到存儲器中操作數(shù)的偏移地址處理器利用ES:EA存取附加段中的數(shù)據(jù)串操作指令將附加段作為其目的操作數(shù)的存放區(qū)域匯編語言程序員看到的處理器,就是寄存器所以,一定要熟悉這些寄存器的名稱和作用
如何分配各個(gè)邏輯段程序的指令序列必須安排在代碼段程序使用的堆棧一定在堆棧段程序中的數(shù)據(jù)默認(rèn)是安排在數(shù)據(jù)段,也經(jīng)常安排在附加段,尤其是串操作的目的區(qū)必須是附加段數(shù)據(jù)的存放比較靈活,實(shí)際上可以存放在任何一種邏輯段中思考演示邏輯段的分配示例64KB邏輯段1起點(diǎn)邏輯段10FFFF64KB1FFFF1000064KB00000FFFFF各段連續(xù)排列64KB邏輯段2起點(diǎn)邏輯段264KB邏輯段4、5起點(diǎn)邏輯段4、564KB邏輯段3起點(diǎn)邏輯段3各段靈活排列1MB存儲空間分段邏輯結(jié)構(gòu)圖示200002FFFF64KBF000064KB16個(gè)邏輯段1MB??????2)指令指針寄存器IP(InstructionPointer)指示主存儲器指令的位置隨著指令的執(zhí)行,IP將自動修改以指示下一條指令所在的存儲器位置IP寄存器是一個(gè)專用寄存器IP寄存器與CS段寄存器聯(lián)合使用以確定下一條指令的存儲單元地址內(nèi)部結(jié)構(gòu)8086寄存器均為16位!??4)地址加法器CS、DS、SS和其他寄存器組合指向存儲單元狀態(tài)標(biāo)志寄存器運(yùn)算寄存器SPBPDISICS123456執(zhí)行部件控制電路輸入輸出控制電路AHALBHBLCHCLDHDLALU指令隊(duì)列緩沖器內(nèi)部總線外部總線DSSSESIP內(nèi)部暫存器Σ16位20位地址加法器段寄存器執(zhí)行部分(EU)總線接口部件(BIU)SPBPDISIAHALBHBLCHCLDHDLCSDSSSESIP內(nèi)部暫存器狀態(tài)標(biāo)志寄存器8086內(nèi)部編程結(jié)構(gòu)8088指令執(zhí)行過程2.執(zhí)行部件EU執(zhí)行部件負(fù)責(zé)指令的執(zhí)行,由下列4部分組成:①算術(shù)邏輯部件ALU(arithmeticlogicunit)。②寄存器組:4個(gè)通用寄存器,即AX、BX、CX、DX;4個(gè)專用寄存器,即基數(shù)指針寄存器BP(basepointer)堆棧指針寄存器SP(stackpointer)源變址寄存器SI(sourceindex)目的變址寄存器DI(destinationindex);③標(biāo)志寄存器FR;④執(zhí)行部件控制電路4個(gè)通用寄存器通用的16位寄存器AXBXCXDX4個(gè)數(shù)據(jù)寄存器還可以分成高8位和低8位兩個(gè)獨(dú)立的寄存器,這樣又形成8個(gè)通用的8位寄存器AX:AHAL BX:BHBLCX:CHCL DX:DHDLAHALBHBLCHCLDHDLAXBXCXDX4個(gè)通用寄存器(續(xù))AX稱為累加器(Accumulator)使用頻度最高。用于算術(shù)、邏輯運(yùn)算以及與外設(shè)傳送信息等如:字乘法、字除法、字I/OAH:字節(jié)乘、字節(jié)除
AL:字節(jié)乘、字節(jié)除、字節(jié)I/O、查表和十進(jìn)制運(yùn)算BX稱為基址寄存器(BaseaddressRegister)常用做存放存儲器地址CX稱為計(jì)數(shù)器(Counter)作為循環(huán)和串操作等指令中的隱含計(jì)數(shù)器.CL:變量位移、循環(huán)控制4個(gè)通用寄存器(續(xù))DX稱為數(shù)據(jù)寄存器(Dataregister)常用來存放雙字長數(shù)據(jù)的高16位——字乘、字除存放外設(shè)端口地址
——間接I/O地址2)專用寄存器4個(gè)16位專用寄存器_變址寄存器:SIDI_指針寄存器:BPSP常用于存儲器變址尋址方式時(shí)提供地址SI是源地址寄存器(SourceIndex)DI是目的地址寄存器(DestinationIndex)在串操作類指令中,SI通常指向源操作數(shù)。用來存放當(dāng)前數(shù)據(jù)段中源操作數(shù)地址偏移量;DI通常指向目的操作數(shù)。用來存放當(dāng)前數(shù)據(jù)段中目標(biāo)操作數(shù)地址偏移量2)專用寄存器(續(xù))指針寄存器用于尋址內(nèi)存堆棧內(nèi)的數(shù)據(jù)SP為堆棧指針寄存器(StackPointer),
和堆棧段寄存器SS一起來確定堆棧的棧頂在內(nèi)存中的偏移地址,又稱棧頂指針BP為基址指針寄存器(BasePointer),用于存放數(shù)據(jù)在堆棧段中的基地址或數(shù)據(jù)區(qū)基址偏移地址SP和BP寄存器與SS段寄存器聯(lián)合使用以確定堆棧段中的存儲單元地址堆棧(Stack)是主存中一個(gè)特殊的區(qū)域,采用“先進(jìn)后出”或“后進(jìn)先出”存取操作方式、而不是隨機(jī)存取方式。3)標(biāo)志寄存器標(biāo)志(Flag)用于反映指令執(zhí)行結(jié)果或
控制指令執(zhí)行形式8088處理器的各種標(biāo)志形成了一個(gè)16位的標(biāo)志寄存器FLAGS(程序狀態(tài)字PSW寄存器)其中7位未用,標(biāo)志寄存器的9位標(biāo)志位分為:狀態(tài)標(biāo)志--用來記錄程序運(yùn)行結(jié)果的狀態(tài)信息,許多指令的執(zhí)行都將相應(yīng)地設(shè)置它CF
ZF
SFPFOF
AF控制標(biāo)志--可由程序根據(jù)需要用指令設(shè)置,用于控制處理器執(zhí)行指令的方式DF
IF
TF3)標(biāo)志寄存器FR——狀態(tài)標(biāo)志狀態(tài)標(biāo)志有6個(gè),即CF、PF、AF、ZF、SF和OF
。CF(CarryFlag)——進(jìn)位標(biāo)志位
CF=1,表示本次運(yùn)算中最高位(D15或D7)有
進(jìn)(借)位;CF=0,無進(jìn)(借)位。CFPFAFZFSFTFIFDFOF0123456789101112131415例:3AH+7CH=B6H,
沒有進(jìn)位:CF=0
AAH+7CH=(1)26H,有進(jìn)位:CF=1PF(parityflag)——
奇偶標(biāo)志
PF=1,表示本次運(yùn)算結(jié)果中有偶數(shù)個(gè)“l(fā)”,
PF=0,表示本次運(yùn)算結(jié)果中有奇數(shù)個(gè)“1”PF標(biāo)志僅反映最低8位中“1”的個(gè)數(shù)是
偶或奇,即使是進(jìn)行16位字操作例:3AH+7CH=B6H=10110110B
結(jié)果中有5個(gè)“1”,是奇數(shù):PF=0CFPFAFZFSFTFIFDFOF0123456789101112131415AF(AuxiliarycarryFlag)——輔助進(jìn)位標(biāo)志位。
AF=1;本次加(減)法運(yùn)算結(jié)果的低4位
向高4位有進(jìn)位(或借位)時(shí);
AF=0。
CFPFAFZFSFTFIFDFOF0123456789101112131415這個(gè)標(biāo)志主要由處理器內(nèi)部使用,用于十進(jìn)制算術(shù)運(yùn)算調(diào)整指令中,用戶一般不必關(guān)心ZF(ZeroFlag)——零標(biāo)志位。若當(dāng)前的運(yùn)算結(jié)果為零,ZF=1;否則即運(yùn)算結(jié)果非零時(shí),ZF=0。注意:ZF為1表示的結(jié)果是0,用于條件轉(zhuǎn)移例:3AH+7CH=B6H,結(jié)果不是零:ZF=0
84H+7CH=(1)00H,結(jié)果是零:ZF=1CFPFAFZFSFTFIFDFOF0123456789101112131415SF(SignFlag)——符號標(biāo)志位。它和運(yùn)算結(jié)果的最高位相同。
SF=1,表示本次運(yùn)
算結(jié)果的最高位(第7位或第15位)為“l(fā)”,
否則SF=0。
有符號數(shù)據(jù)用最高有效位表示數(shù)據(jù)的符號所以,最高有效位就是符號標(biāo)志的狀態(tài)CFPFAFZFSFTFIFDFOF0123456789101112131415OF(OverflowFlag)——溢出標(biāo)志位。
當(dāng)補(bǔ)碼運(yùn)算有溢出時(shí),OF=1;否則OF=0。CFPFAFZFSFTFIFDFOF0123456789101112131415思考如何判斷是否有溢出?例:3AH+7CH=B6H,產(chǎn)生溢出:OF=1
AAH+7CH=(1)26H,沒有溢出:OF=0
溢出判斷只有當(dāng)兩個(gè)相同符號數(shù)相加(包括不同符號數(shù)相減),而運(yùn)算結(jié)果的符號與原數(shù)據(jù)符號相反時(shí),產(chǎn)生溢出;因?yàn)?,此時(shí)的運(yùn)算結(jié)果顯然不正確其他情況下,則不會產(chǎn)生溢出例1:3AH+7CH=B6H
溢出例2:AAH+7CH
無溢出例3:3AH-7CH
無溢出例4:AAH-7CH=2DH
溢出答案溢出和進(jìn)位的區(qū)別溢出標(biāo)志OF和進(jìn)位標(biāo)志CF是兩個(gè)意義不同的標(biāo)志進(jìn)位標(biāo)志表示無符號數(shù)運(yùn)算結(jié)果是否超出范圍,運(yùn)算結(jié)果仍然正確溢出標(biāo)志表示有符號數(shù)運(yùn)算結(jié)果是否超出范圍,運(yùn)算結(jié)果已經(jīng)不正確例1:3AH+7CH=B6H無符號數(shù): 58+124=182 范圍內(nèi),無進(jìn)位有符號數(shù):58+124=182 范圍外,有溢出例2:AAH+7CH=(1)26H無符號數(shù): 170+124=294 范圍外,有進(jìn)位有符號數(shù): -86+124=28 范圍內(nèi),無溢出3)標(biāo)志寄存器FR——控制標(biāo)志方向標(biāo)志DF(DirectionFlag)
用于串操作指令中,控制地址的變化方向:
CLD指令復(fù)位設(shè)置DF=0,存儲器地址自動增加;
STD指令置位設(shè)置DF=1,存儲器地址自動減少中斷允許標(biāo)志IF(Interrupt-enableFlag)
控制可屏蔽中斷是否可以被處理器響應(yīng):
CLI指令復(fù)位設(shè)置IF=1,則允許中斷;
STI指令置位設(shè)置IF=0,則禁止中斷
3)標(biāo)志寄存器FR——控制標(biāo)志(續(xù))單步標(biāo)志TF(TrapFlag)
用于控制處理器進(jìn)入單步操作方式:設(shè)置TF=0,處理器正常工作;設(shè)置TF=1,處理器單步執(zhí)行指令單步執(zhí)行指令——處理器在每條指令執(zhí)行結(jié)束時(shí),便產(chǎn)生一個(gè)編號為1的內(nèi)部中斷這種內(nèi)部中斷稱為單步中斷所以TF也稱為單步標(biāo)志利用單步中斷可對程序進(jìn)行逐條指令的調(diào)試這種逐條指令調(diào)試程序的方法就是單步調(diào)試2.28086指令系統(tǒng)指令:
控制計(jì)算機(jī)完成某種操作的命令,由操作碼和操作數(shù)兩部分組成。操作碼:指示計(jì)算機(jī)執(zhí)行什么操作。操作數(shù):指明參加操作的數(shù)或者它所在的地址。指令系統(tǒng):
處理器所能識別的所有指令的集合
2.28086指令系統(tǒng)——指令格式指令的助記符格式操作數(shù)1,成被稱為目的操作數(shù)dest,它不僅可以作為指令操作的一個(gè)對象,還可以用來存放指令操作的結(jié)果操作數(shù)2,常被稱為源操作數(shù)src,它表示參與指令操作的一個(gè)對象
操作碼
操作數(shù)1,操作數(shù)2;注釋指令解決什么問題?匯編語言指令要解決的兩個(gè)問題:要指出進(jìn)行什么操作——操作碼;要指出操作數(shù)和操作結(jié)果放在何處——尋址方式。問題指令的操作碼和操作數(shù)每種指令的操作碼:用一個(gè)助記符表示(指令功能的英文縮寫)對應(yīng)著機(jī)器指令的一個(gè)或多個(gè)二進(jìn)制編碼指令中的操作數(shù):可以是一個(gè)具體的數(shù)值可以是存放數(shù)據(jù)的寄存器或指明數(shù)據(jù)在主存位置的存儲器地址操作數(shù)可以有一個(gè)操作數(shù)、兩個(gè)操作數(shù)或隱含在助記符中(形式上無操作數(shù))。
2.2
8086的尋址方式根據(jù)操作數(shù)所在位置,8086尋址方式分為三大類:立即數(shù)尋址寄存器尋址存儲器尋址根據(jù)8086的指令格式的不同,存儲器尋址方式又可分為:直接尋址
寄存器間接尋址寄存器相對尋址基址變址尋址相對基址變址尋址8086尋址方式
與數(shù)據(jù)相關(guān)的尋址方式立即數(shù)尋址寄存器尋址存儲器尋址相對基址加變址
直接尋址寄存器間接寄存器相對基址加變址與地址相關(guān)的尋址方式段內(nèi)尋址段間尋址段內(nèi)直接尋址段內(nèi)間接尋址段間直接尋址段間間接尋址1)立即數(shù)尋址操作數(shù)就在指令中提供,叫立即尋址方式。比如: ;將1090H送AX,AH中為10H,AL中為90H MOV AX,1090H 操作數(shù)緊跟在操作碼的后面,與操作碼一起放在存儲器的代碼段區(qū)域中。在取出指令的同時(shí),也就取出了操作數(shù)。它主要用來給寄存器或存儲單元賦初值,也可以與寄存器操作數(shù)或存儲器操作數(shù)進(jìn)行算術(shù)邏輯運(yùn)算。90H10HAXAHAL10H90Hmov代碼段2)寄存器尋址
操作數(shù)在CPU內(nèi)部的寄存器中,指令中操作數(shù)用內(nèi)部寄存器——寄存器尋址方式。
例如: MOV AX,BX;將BX的內(nèi)容復(fù)制到AX ADD AL,BH;將BH的內(nèi)容加到AL的內(nèi)容中 INC CX ;將CX的內(nèi)容加1 ROL AH,1;將AH中的內(nèi)容循環(huán)左移一位AXBX2)寄存器尋址(續(xù))16位的操作數(shù)通常用8個(gè)16位通用寄存器
(段寄存器僅用在部分傳送指令中),因通用寄存器是處理器的一部分,因此寄存器尋址方式可以提高工作效率。其中AX稱為累加器,若操作數(shù)存放在AX中的話,通常指令執(zhí)行時(shí)間要短些。8位的操作數(shù)必須用AH、AL、BH、BL、CH、CL、DH、DL等8個(gè)8位寄存器。
3)存儲器尋址方式操作數(shù)在主存儲器中,用主存地址表示程序設(shè)計(jì)時(shí),8086采用邏輯地址表示主存地址段地址在默認(rèn)的或用段超越前綴指定的段寄存器中指令中只需給出操作數(shù)的偏移地址(有效地址EA)8086設(shè)計(jì)了多種存儲器尋址方式1、直接尋址方式2、寄存器間接尋址方式3、寄存器相對尋址方式4、基址變址尋址方式5、相對基址變址尋址方式8086的存儲器存儲器是計(jì)算機(jī)存儲信息的地方。
掌握數(shù)據(jù)存儲格式,以及存儲器的分段
管理對以后的匯編程序設(shè)計(jì)非常重要。你能區(qū)別寄存器、存儲器(主存)?答案區(qū)別寄存器、存儲器(主存)寄存器是微處理器(CPU)內(nèi)部暫存數(shù)據(jù)的存儲單元,以名稱表示,例如:AX,BX..….等存儲器也就是平時(shí)所說的主存,也叫內(nèi)存,可直接與CPU進(jìn)行數(shù)據(jù)交換。主存利用地址區(qū)別。指令中用‘[]’表示。方括號內(nèi)為內(nèi)存單元地址。答案存儲單元及其存儲內(nèi)容每個(gè)存儲單元都有一個(gè)編號;
被稱為存儲器地址,指令中用‘[]’表示。方括號內(nèi)為內(nèi)存單元地址。每個(gè)存儲單元存放一個(gè)字節(jié)的內(nèi)容例:存儲器地址為1200H單元存放有一個(gè)數(shù)據(jù)34H表達(dá)為
[1200H]=34H存儲器中的數(shù)據(jù)存放多字節(jié)數(shù)據(jù)在存儲器中占連續(xù)的
多個(gè)存儲單元:存放時(shí),低字節(jié)存入低地址,高字節(jié)存入高地址;表達(dá)時(shí)用它的低地址表示多字節(jié)數(shù)據(jù)占據(jù)的地址空間。0002H號“字節(jié)”單元的內(nèi)容:
[0002H]=34H0002H號“雙字”單元的內(nèi)容:
[0002H]=1234H0002H號“雙字”單元的內(nèi)容:
[0002H]=78561234H存儲器中的數(shù)據(jù)存放(續(xù))同一個(gè)存儲器地址可以是字節(jié)單元地址、
字單元地址、雙字單元地址等等。
(視具體情況來確定)字單元安排在偶地址(xxx0B)、雙字單元安排在模4地址(xx00B)等,被稱為“地址對齊(Align)”存儲器的分段管理8086CPU有20條地址線最大可尋址空間為220=1MB每個(gè)存儲單元具有一個(gè)唯一的20位編號,即物理地址物理地址范圍從00000H~FFFFFH8086CPU將1MB空間分成許多邏輯段(Segment)每個(gè)段最大限制為64KB段地址的低4位為0000B每個(gè)存儲單元還具有多個(gè)邏輯地址
形式為
段基地址:段內(nèi)偏移地址物理地址、邏輯地址、有效地址(偏移地址)段地址說明邏輯段在主存中的起始位置,用16位段寄存器表達(dá)段地址偏移地址說明主存單元距離段起始位置的偏移量,偏移地址可以用16位寄存器或16位數(shù)據(jù)表示將邏輯地址中的段地址左移4位,加上偏移地址就得到20位物理地址一個(gè)物理地址可以有多個(gè)邏輯地址23500H+100H23600H12000H+FA0H12FA0H段地址左移4位加上偏移地址得到物理地址邏輯地址 2350H:100H和1200H:0FA0H物理地址
23600H和
12FA0H例如12H34H10H00H操作碼AX
AH
AL代碼段數(shù)據(jù)段1070H34H12H1071H數(shù)據(jù)在存儲器中,有效地址由指令直接給出——直接尋址。比如:
;將DS段的1070H和1071H
兩單元的內(nèi)容取到AX中
MOV AX,[1070H]
3)存儲器尋址——直接尋址
默認(rèn)段地址為DS段3)存儲器尋址——寄存器間接尋址寄存器間接尋址可分為四種:(1)以BX寄存器進(jìn)行間接尋址—數(shù)據(jù)段基址尋址 MOV AX,[BX] ES:MOV
CX,[BX](2)以BP寄存器進(jìn)行間接尋址—堆棧段基址尋址 MOV BX,[BP](3)
以SI寄存器進(jìn)行間接尋址——變址尋址
MOV BX,[SI](4)以DI寄存器進(jìn)行間接尋址——變址尋址
MOV BX,[DI]3)存儲器尋址——寄存器間接尋址(續(xù))操作數(shù)在某個(gè)存儲單元中,其偏移地址
在指令給出的方括號中的寄存器中,即寄存器的內(nèi)容為操作數(shù)的偏移地址。所使用的段寄存器由指令中的間址寄存器確定。若用BX、SI、DI寄存器間址,則操作數(shù)在當(dāng)前數(shù)據(jù)段中,即段地址在DS中。若用BP間址,則操作數(shù)在堆棧段SS中。只有上述4個(gè)寄存器可以用于間接尋址。間接尋址的優(yōu)點(diǎn):只要對間址用的寄存器作適當(dāng)修改,一條指令就可以對許多不同的存儲單元進(jìn)行訪問。循環(huán)程序設(shè)計(jì)中,多用間接尋址。3)存儲器尋址——寄存器相對尋址4個(gè)用于間接尋址的寄存器的內(nèi)容與一個(gè)位移量相加如:
MOV CL,[BX+10]或?qū)懗桑? MOV CL,10[BX] MOV CL,[BX]+10操作數(shù)在某個(gè)存儲單元中,其偏移地址是指定的寄存器的內(nèi)容與指令中給出的位移量相加之和。段地址依據(jù)使用的寄存器的不同而不同EA=8位偏移量16位偏移量+[BX][BP][SI][DI]3)存儲器尋址——基址變址尋址操作數(shù)在某個(gè)存儲器單元中,其偏移地址是指令中指定的基址寄存器和變址寄存器的內(nèi)容與位移量3項(xiàng)相加之和。段地址由基址寄存器約定在哪一個(gè)段寄存器中。2個(gè)基址寄存器與2個(gè)變址寄存器組合有四種:
[BX+SI] 或?qū)懗桑篬BX][SI] [BX+DI] [BP+SI] [BP+DI][BX][BP]EA=8位偏移量16位偏移量+[SI][DI]+3)存儲器尋址——相對基址變址尋址基址寄存器與變址寄存器組合,再加上一個(gè)位移量例: MOV CL,[BX+SI+10]有效地址=BX/BP+SI/DI+8/16位位移量段地址對應(yīng)BX基址寄存器默認(rèn)是DS,對應(yīng)BP基址寄存器默認(rèn)是SS;可用段超越前綴改變例:設(shè)
BX=0158H,DI=10A5H,位移量=1B57H,DS=2100H,求下列尋址方式下的有效地址和物理地址:①直接尋址②寄存器間接尋址(寄存器為BX)③BX寄存器相對間接尋址④變址尋址(寄存器為DI)⑤DI寄存器相對變址尋址⑥基址加變址的尋址⑦相對的基址加變址的尋址(BX為基址寄存器,DI為變址寄存器)答案①直接尋址:有效地址=1B57H物理地址=21000H+1B57H=22B57H
②寄存器間接尋址(寄存器為BX):有效地址=0158H物理地址=21000H+0158H=21158H③BX寄存器相對間接尋址:有效地址=0158H+1B57H=1CAFH物理地址=21000H+1CAFH=22CAFH答案④變址尋址(寄存器為DI):有效地址=10A5H物理地址=21000H+10A5H=220A5H⑤DI寄存器相對變址尋址:有效地址=10A5H+1B57H=2BFCH物理地址=21000H+2BFCH=23BFCH⑥基址加變址的尋址(BX為基址寄存器,DI為變址寄存器):有效地址=0158H+10A5H=11FDH物理地址=21000H+11FDH=221FDH答案⑦相對的基址加變址的尋址(BX為基址寄存器,DI為變址寄存器):有效地址=0158H+10A5H+1B57H=2D54H物理地址=21000H+2D54H=23D54H尋址方式演示尋址方式演示尋址方式演示尋址方式演示尋址方式演示尋址方式演示尋址方式演示總結(jié):方括號“[]”運(yùn)算符a.方括號的內(nèi)容表示存儲器操作數(shù)的偏移地址;b.有多對方括號順序排列時(shí),操作數(shù)的偏移地址等于各方括號內(nèi)容之和;c.一個(gè)常量后面跟有方括號時(shí),偏移地址等于該常量與方括號內(nèi)容之和;d.一個(gè)變量后面跟有方括號時(shí),偏移地址等于該變量的偏移地址與方括號內(nèi)容之和??偨Y(jié):帶方括號的地址表達(dá)式遵循的規(guī)則:
a.寄存器中只有BX、BP、SI、DI可在方括號中出現(xiàn);
b.不允許BX、BP同時(shí)出現(xiàn)在同一個(gè)地址表達(dá)式中;
c.不允許SI、DI同時(shí)出現(xiàn)在同一個(gè)地址表達(dá)式中;
d.當(dāng)多個(gè)寄存器出現(xiàn)在方括號中時(shí),只能作加運(yùn)算;
e.
當(dāng)方括號中包含BP,則隱含使用SS提供段地址,
否則均隱含使用DS提供段地址。
掌握操作數(shù)的尋址方式后,進(jìn)入指令學(xué)習(xí)2.38086指令系統(tǒng)指令格式標(biāo)號:操作碼
操作數(shù)1,操作數(shù)2
;注釋①一條指令中可以包含一個(gè)或多個(gè)操作數(shù)②涉及一個(gè)操作數(shù)的指令稱為單操作數(shù)指令③如位移量或立即數(shù)為16位,那么低位在前,高位在后指令執(zhí)行時(shí)間
一條指令執(zhí)行總時(shí)間=基本執(zhí)行時(shí)間
+計(jì)算有效地址的時(shí)間
+讀取內(nèi)存的時(shí)間
字操作數(shù)在內(nèi)存的存放格式也是影響一條指令執(zhí)行時(shí)間的因素。讀寫偶地址字
讀寫偶地址字節(jié)
讀寫奇地址字節(jié)
讀寫奇地址字
8086數(shù)據(jù)總線的傳輸特性:2.38086指令系統(tǒng)分類2.3.1數(shù)據(jù)傳送指令2.3.2算術(shù)指令2.3.3邏輯指令2.3.4串處理指令2.3.5控制轉(zhuǎn)移指令2.3.6處理機(jī)控制指令2.3.1數(shù)據(jù)傳送指令不論是專用計(jì)算機(jī),還是通用計(jì)算機(jī),也不管是數(shù)值計(jì)算或信息處理,還是實(shí)時(shí)控制,都需要傳送數(shù)據(jù)。因此,數(shù)據(jù)傳送是最大量、最基本、最主要的操作。傳送類指令的特點(diǎn)是把數(shù)據(jù)從計(jì)算機(jī)的一個(gè)部位傳送到另一個(gè)部位。把發(fā)送的部位稱之為“源”,接收的部位稱之為“目的地”。1通用數(shù)據(jù)傳送指令2累加器專用傳送指令3地址傳送指令4標(biāo)志寄存器傳送指令1通用傳送指令——MOV(1)最基本的傳送指令(MOV)
MOV AL,BL ;BL中的8位數(shù)據(jù)送AL MOV ES,DX ;DX中16位數(shù)據(jù)送ES幾點(diǎn)注意:①通用傳送指令可傳送8位和16位數(shù)據(jù)。②通用傳送指令中總是既含源操作數(shù),又含目的操作數(shù)。③不能在兩個(gè)內(nèi)存單元之間直接傳送數(shù)據(jù)④CS和IP寄存器、立即數(shù)不能作為目的操作數(shù)⑤目的操作數(shù)和源操作數(shù)不允許同時(shí)為段寄存器1通用傳送指令——MOV(續(xù))⑥
用BX、SI、DI來間接尋址時(shí),默認(rèn)的段寄存器為DS,而用BP來間接尋址時(shí),默認(rèn)的段寄存器為SS
⑦執(zhí)行SS寄存器賦值
的傳送指令時(shí),系
統(tǒng)自動禁止外部中
斷。
⑧所有的通用傳送指
令都不改變標(biāo)志。立即數(shù)
段寄存器DSESSS通用寄存器AXBXCXDXBPSPSIDI存儲器MOV指令也并非任意傳送!CS1通用傳送指令——PUSH\POP(2)堆棧操作指令
堆棧的設(shè)置主要用來保護(hù)現(xiàn)場,寄存中間結(jié)果,并為主、子程序的轉(zhuǎn)返提供強(qiáng)有力的依托。
8086的堆棧操作都是字操作,將一個(gè)數(shù)壓入堆棧稱為進(jìn)棧,SP自動減2,進(jìn)棧的字就存放在新增加的兩個(gè)單元內(nèi)。將一個(gè)數(shù)從堆棧彈出稱為出棧,出棧時(shí),SP自動加2。棧頂隨進(jìn)棧或出棧操作而變化。1通用傳送指令——PUSH\POP推入堆棧指令PUSH和彈出堆棧指令POP。如:
PUSH源操作數(shù)POP目的操作數(shù) PUSHDS
POPAX幾點(diǎn)注意:①堆棧操作總是按字進(jìn)行的。②推入指令,SP減2,數(shù)據(jù)在棧頂。彈出指令正好相反③允許PUSHCS,但不允許POPCS。④堆棧的后進(jìn)先出。⑤不能使用立即數(shù)方式⑥不影響標(biāo)志位SSSP0000H(棧頂)存儲器高地址堆棧段(棧頂)SP=0040HSP=003EH12341234AHAL執(zhí)行前執(zhí)行后1通用傳送指令——PUSH\POP執(zhí)行PUSHAX的具體過程(設(shè)AX=1234):PUSH指令的功能POP指令的功能堆棧示例例:給定一個(gè)堆棧區(qū),地址為:1250H:0000H~1250H:0100H,(SP)=0052H,問:(1)當(dāng)前的棧頂?shù)刂?(2)棧底地址 (3)段基地址SS(4)若存入數(shù)據(jù)AX=1234H,如何放置?此時(shí)SP的值如何?解:棧頂?shù)刂罚?邏輯地址:1250H:0052H 物理地址:12552H
棧底地址: 邏輯地址:1250H:0100H 物理地址:12600H
段基地址: SS=1250H1250H:0000HSP=0052H
1250H:0100HPUSHAX執(zhí)行前堆棧情況堆棧段數(shù)據(jù)PUSHAX執(zhí)行后堆棧情況入棧方向出棧方向1250H:0000H
執(zhí)行后棧頂:SP=0050H
0051H
原棧頂:SP=0052H
250H:0100H1通用傳送指令——XCHG(3)交換指令 交換指令XCHG可以實(shí)現(xiàn)字節(jié)或字交換。如:
XCHGAL,BL XCHGBX,CX XCHG[2530],CX交換指令注意點(diǎn):①目的操作數(shù)和源操作數(shù)不能均為內(nèi)存單元。②
段寄存器和IP不能作為交換指令的操作數(shù)。
③不影響標(biāo)志位 【例】指令執(zhí)行前,(BX)=1234H,(BP)=0100H,(SI)=0020H,(SS)=1F00H,(1F120H)=0000H,則源操作數(shù)物理地址=1F00H×10H+0100H+0020H=1F00H×10H+0120H=1F120H指令執(zhí)行后:(BX)=0000H,(1F120H)=1234H
XCHGBX,[BP+SI]2累加器專用傳送指令——IN、OUT
(1)輸入輸出指令分為:直接的輸入/輸出指令間接的輸入/輸出指令。輸入輸出指令注意點(diǎn):①只能用累加器作為執(zhí)行輸入輸出的機(jī)構(gòu)②尋址范圍: 直接輸入輸出指令為0~255
間接輸入輸出指令為0~65535。2累加器專用傳送指令——IN、OUT直接的輸入輸出指令提供端口號。如:IN AL,50H ;將50H端口的字節(jié)讀入ALIN AX,70H ;分別將70H、71H端口的內(nèi)容讀入AL、AHOUT44H,AL ;將AL中的內(nèi)容輸出到44H端口OUT80H,AX ;將AL、AH中的內(nèi)容分別輸出到80H、81H兩端口
2累加器專用傳送指令——IN、OUT間接的輸入輸出指令,如: IN AL,DX ;從DX所指的端口中讀取 IN AX,DX ;從DX和DX+1所指出的兩個(gè)端口中讀取 OUTDX,AL ;將AL中的字節(jié)輸出到DX所指的端口中 OUTDX,AX ;將AL中的字節(jié)輸出到DX所指的端口中,同時(shí)將AH中的字節(jié)輸出到DX+1所指的端口中INAL,21H
說明:①該指令的目的操作數(shù)僅限于累加器,即8位操作采用AL,16位操作采用AX,不能由其他任何寄存器代替。②如果I/O尋址的口地址號在8位以內(nèi),可以用直接尋址方式,地址表達(dá)式則由一個(gè)8位立即數(shù)表示;如果I/O尋址的口地址號在16位以內(nèi),可以用寄存器間接尋址方式,所尋址的地址口號則裝入DX,間接尋址僅可以使用DX。2累加器專用傳送指令——XLAT
(2)換碼指令
換碼指令為XLAT,使累加器中的一個(gè)值變換為內(nèi)存表格中的某一個(gè)值。
操作步驟:
1.建立轉(zhuǎn)換表(其最大容量位256B),將該表定位到某個(gè)邏輯段的一片連續(xù)地址中,并將表首的偏移地址置入BX.
2.將待轉(zhuǎn)換的數(shù)在表中的序號送入AL寄存器中。
3.執(zhí)行XLAT指令。
執(zhí)行結(jié)果是將待轉(zhuǎn)換的序號單元中的數(shù)據(jù)轉(zhuǎn)換成對應(yīng)的代碼,并送回AL寄存器中,即([BX+AL])→AL。【例】例:數(shù)字0~9對應(yīng)的格雷碼為:18H、34H、05H、06H、09H、0AH、0CH、11H、12H和14H,要求從某個(gè)端口給CPU輸入一位十進(jìn)制數(shù)碼,CPU從對應(yīng)端口輸出相應(yīng)的格雷碼。MOVBX,TABLEINAL,1XLATTABLEOUT1,AL2累加器專用傳送指令——XLAT該指令有兩種格式,第二種格式中的地址標(biāo)號是指代碼表的表首地址。它只是為提高程序可讀性而設(shè)置的,指令執(zhí)行時(shí)只使用預(yù)先存入BX中的代碼表首地址,而并不用匯編格式中指定的地址標(biāo)號。(AL)是一個(gè)8位無符號數(shù),所以表格中最多只能存放256個(gè)代碼。此指令的執(zhí)行結(jié)果不影響標(biāo)志位。3地址傳送指令——LEA(1)取有效地址指令(LEA) 如: LEA AX,[2728] ;將內(nèi)存單元的偏移量2728送AX LEA BX,[BP+SI] ;指令執(zhí)行后,BX中內(nèi)容為BP+SI的值 LEA SP,[0482] ;使堆棧指針SP為4823地址傳送指令——LDS(2)裝入地址指令
LDS功能:將4字節(jié)的地址指針傳送到2個(gè)目的寄存器,比如: LDS DI,[2130H] ;使2130H和2131H中的偏移量送DI,2132H和2133H中的段值DS。3地址傳送指令——LES(3)裝入地址的指令LES功能:將一個(gè)地址指針裝入ES和另一個(gè)寄存器。例:LES DI,〔BP+04〕 ;將堆棧中存放的字符串首址送到ES和DI中4標(biāo)志寄存器傳送指令(1)讀取標(biāo)志指令(LAHF) 將標(biāo)志寄存器的低8位送AH。(2)設(shè)置標(biāo)志指令(SAHF)
將AH寄存器的相應(yīng)位送標(biāo)志寄存器的低8(3)對標(biāo)志寄存器的堆棧操作指令 PUSHF將標(biāo)志寄存器的值推入堆棧頂部。
POPF從堆棧彈出一個(gè)字送標(biāo)志寄存器。2.3.2算術(shù)運(yùn)算指令算術(shù)運(yùn)算指令涉及兩種類型的數(shù)據(jù)無符號數(shù)8位無符號數(shù)的范圍為0~25516位無符號數(shù)的范圍為0~65535有符號數(shù) 8位有符號數(shù)的范圍為-128~+12716位有符號數(shù)的范圍為-32768~+327672.3.2算術(shù)運(yùn)算指令所有算術(shù)運(yùn)算指令均影響狀態(tài)標(biāo)志。規(guī)則:當(dāng)無符號數(shù)運(yùn)算產(chǎn)生溢出時(shí),CF為1;當(dāng)有符號數(shù)運(yùn)算產(chǎn)生溢出時(shí),OF為1;如運(yùn)算結(jié)果為0,則ZF=1;如運(yùn)算結(jié)果為負(fù)數(shù),則SF=1;如運(yùn)算結(jié)果低8位中有偶數(shù)個(gè)1,則PF=1。1加法指令——ADD(1)不帶進(jìn)位位的加法指令 如: ADD AL,50H ;AL和50H相加,結(jié)果放在AL中 ADD DI,SI ;DI和SI的內(nèi)容相加,結(jié)果在DI1加法指令——ADDADD[BX+DI],AX ;BX+DI和BX+DI+12個(gè)單元和AX相加,結(jié)果在BX+DI和BX+DI+1所指單元ADD AX,[BX+2000H] ;BX+2000H和
BX+2001H所指單
元內(nèi)容和AX的內(nèi)容相加,結(jié)果在AX中1加法指令——ADC(2)帶進(jìn)位位的加法指令 如: ADC AX,SI ;AX和SI中的內(nèi)容以及CF的值相加,結(jié)果在AX ADCDX,[SI] ;SI和SI+1所指的單元的內(nèi)容和DX的內(nèi)容以及CF的值相加,結(jié)果在DX1加法指令——INC(3)增量指令(加1指令) 將操作數(shù)的內(nèi)容加1。不影響CF標(biāo)志如:INCAL ;將AL中的內(nèi)容加1INC CX ;將CX中的內(nèi)容加1INC BYTEPTR[BX+DI+500];將BX+DI+500所指單元的內(nèi)容加12減法指令——SUB(1)不考慮借位的減法指令
SUB完成2個(gè)字節(jié)或2個(gè)字的相減。如: SUBBX,CX;將BX中的內(nèi)容減去CX中的內(nèi)容,結(jié)果在BX中SUB[BP+2],CL;將BP+2所指的單元中的值減去CL中的值,結(jié)果在BP+2所指的堆棧單元中
2減法指令——SUB
SUBAL,20 ;AL中的數(shù)減去20,結(jié)果在AL中 SUBSI,5010H ;SI中的數(shù)減去5010H,結(jié)果在SI中 SUBWORDPTR[DI],1000H ;DI和DI+1所指的兩單元中的數(shù)減去1000H,結(jié)果在DI和DI+1所指的單元中2減法指令——SBB(2)考慮借位的減法指令如: SBBAX,2030H ;將AX的內(nèi)容減去2030H,并減去CF值 SBBWORDPTR[DI+2],1000H ;將DI+2和DI+3所指兩單元的內(nèi)容減去1000H,并減去CF值,結(jié)果在DI+2和DI+3所指的單元2減法指令——例題完成雙字長相減操作,被減數(shù)存放在DX與AX中,減數(shù)存放在BX與CX中,差放在DX和AX中。程序段如下:SUB AX,CXSBB DX,BX2減法指令——DEC(3)減量指令(減1指令)將操作數(shù)減1。不影響CF標(biāo)志如:DECAX ;將AX的內(nèi)容減1,再送回AX中DECBL ;將BL的內(nèi)容減1,結(jié)果送回BL中DECBYTEPTR[DI+2] ;將DI+2所指單元的內(nèi)容減1,結(jié)果送回此單元DEC也一般用于對計(jì)數(shù)器和地址指針的調(diào)整。2減法指令——NEG(4)求補(bǔ)指令 操作數(shù)取補(bǔ)碼如:
NEGAL ;將AL中的數(shù)取補(bǔ)數(shù) NEGCX ;將CX中的內(nèi)容取補(bǔ)數(shù)
NEG指令對操作數(shù)執(zhí)行求補(bǔ)運(yùn)算,即用零減去操作數(shù),然后結(jié)果返回操作數(shù)求補(bǔ)運(yùn)算也可以表達(dá)成:將操作數(shù)按位取反后加1NEG指令對標(biāo)志的影響與用零作減法的SUB指令一樣NEG指令也是一個(gè)單操作數(shù)指令2減法指令——CMP(5)比較指令如:CMPAX,2000H ;將AX的內(nèi)容和2000H相比較,結(jié)果影響標(biāo)志位CMP AL,50H ;將AL中的數(shù)和50H比較,結(jié)果影響標(biāo)志位CMP指令將目的操作數(shù)減去源操作數(shù),但差值不回送目的操作數(shù)該指令主要用來判斷兩數(shù)的大小與是否相等,其后常常是條件轉(zhuǎn)移指令,根據(jù)比較的結(jié)果實(shí)現(xiàn)程序的分支。3乘法指令——MUL(1)無符號數(shù)的乘法指令如:MULBL ;AL中數(shù)和BL中數(shù)相乘,結(jié)果在AX中MULCX ;AX中數(shù)和CX中數(shù)相乘,結(jié)果在DX和AX中MULBYTEPTR[DI];AL中數(shù)和DI所指的單元中數(shù)相乘
,結(jié)果在AX中【例】無符號數(shù)0A3H與11H相乘。
MOVAL,0A3H ;(AL)=0A3H
MOVBL,11H
;(BL)=11H
MULBL
;(AX)=0AD3H3乘法指令——IMUL(2)有符號數(shù)的乘法指令
如: IMULCL ;AL中有符號數(shù)與CL中有符號數(shù)相乘,結(jié)果在AX中 IMULBX;AX和BX中的兩個(gè)有符號數(shù)相乘,結(jié)果在DX和AX中字節(jié)乘,字?jǐn)?shù)據(jù)積送AX;字?jǐn)?shù)據(jù)相乘,雙字乘積,高字送DX,低字送AX3乘法指令——IMULIMULBYTEPTR[BX];AL中的8位有符號數(shù)和BX所指單元的8位有符號數(shù)相乘,結(jié)果在AXIMULWORDPTR[DI];AX中的16位有符號數(shù)和DI、DI+1所指的單元16位有符號數(shù)相乘,結(jié)果在DX和AX中
MUL和IMUL執(zhí)行時(shí),會影響標(biāo)志位CF和OF,但,AF、PF、SF和ZF無意義。
4除法指令注意:
當(dāng)被除數(shù)為16位,除數(shù)為8位時(shí),8位的商放在AL,8位的余數(shù)放在AH當(dāng)被除數(shù)為32位,除數(shù)為16位,16位的商放在AX中,16位的余數(shù)放在DX
4除法指令——DIV(1)無符號數(shù)的除法指令如:DIV CL
;AX中的數(shù)據(jù)除以CL中的數(shù)據(jù),
商在AL中,余數(shù)在AH中DIV WORDPTR[DI];DX和AX中的32位數(shù)除以DI、
DI+1所指的16位數(shù),商在AX中,
余數(shù)在DX中字節(jié)除法,(AX)/字節(jié),Al(商)、AH(余數(shù))字除法,(DX,AX)/字,AX(商)、DX(余數(shù))4除法指令——IDIV(2)有符號數(shù)的除法指令 如: IDIVBX ;將DX和AX中的32位數(shù)除以BX中的16位數(shù),商在AX中,余數(shù)在DX中 IDIVBYTEPTR[DI] ;將AX中16位數(shù)除以DI所指單元中的8位數(shù),商在AL,余數(shù)在AH4除法指令——IDIV【例】寫出實(shí)現(xiàn)有符號數(shù)0400H/0B4H運(yùn)算的程序段。MOV AX,0400H ;(AX)=0400H(補(bǔ));=+1024MOVBL,0B4H
;(BL)=0B4H(補(bǔ))
;
=-76IDIV BL ;(AL)=0F3H(商)=-13
(AH)=DCH(余數(shù))=-364除法指令幾點(diǎn)注意:①標(biāo)志位AF、CF、OF、PF、SF和ZF無意義。②商范圍如下,超出了范圍則產(chǎn)生0號中斷:雙字除以字為-32768~+32767字除以字節(jié)-128~+127③有符號數(shù)除法規(guī)定余數(shù)的符號和被除數(shù)的符號相同。④要求用16位數(shù)除以8位數(shù),或者用32位數(shù)除以16位數(shù)。 5符號擴(kuò)展指令——CBW
(3)將字節(jié)擴(kuò)展成字的指令CBW功能:將AL寄存器中的符號位擴(kuò)展到AH中。 執(zhí)行時(shí),不影響標(biāo)志位?!纠繉⒆止?jié)數(shù)據(jù)擴(kuò)展成字?jǐn)?shù)據(jù)。MOV AL,0A5H ;(AL)=0A5HCBW ;(AX)=0FFA5HADD AL,70H ;(AL)=15HCBW ;(AX)=0015H5符號擴(kuò)展指令——CWD(4)將字?jǐn)U展成雙字的指令CWD功能:將AX中的被除數(shù)擴(kuò)展成雙字,即把AX中的符
號位擴(kuò)展到DX中。
執(zhí)行時(shí),不影響標(biāo)志位。例】將字?jǐn)?shù)據(jù)擴(kuò)展成雙字?jǐn)?shù)據(jù)。MOVDX,0
;(DX)=0MOVAX,0FFABH
;(AX)=0FFABHCWD ;(DX)=0FFFFH;(AX)=0FFABH6十進(jìn)制調(diào)整指令(1)壓縮的BCD碼調(diào)整指令
DAA對組合的BCD碼相加結(jié)果進(jìn)行調(diào)整。 DAS對組合的BCD碼相減結(jié)果進(jìn)行調(diào)整注意:①被調(diào)整的數(shù)必須在AL寄存器中;②影響除OF外的其它狀態(tài)標(biāo)志;③DAA必須緊接在加法指令后,DAS緊接在減指令后;6十進(jìn)制調(diào)整指令7算術(shù)運(yùn)算指令應(yīng)用舉例(1)將AL、AH、BL中的3個(gè)數(shù)相加,將“和”放入BH中。
MOV BH,0 ADD BH,AL ADD BH,AH ADD BH,BL7算術(shù)運(yùn)算指令應(yīng)用舉例(2)將兩個(gè)雙精度數(shù)相加。兩個(gè)加數(shù)分別在(DX,CX)、(BX,AX)中,將“和”存于(DX,CX)中。
ADD CX,AX ADD DX,BX 7算術(shù)運(yùn)算指令應(yīng)用舉例(3)兩個(gè)壓縮的BCD數(shù)相加。兩個(gè)加數(shù)分別在CL、AL中,將“和”存于AL中。 ADD AL,CL DAA (4)兩個(gè)非壓縮BCD數(shù)相加。兩個(gè)加數(shù)分別為5、7中,將“和”存于AL中。 MOV AL,5 ADD AL,7 AAA 7算術(shù)運(yùn)算指令應(yīng)用舉例(5)例:x、y、z均為32位數(shù),分別存放在地址為X,X+2;Y,Y+2;Z,Z+2的存儲單元中,用指令序列實(shí)現(xiàn)wx+y+24-z,結(jié)果放在W,W+2單元中。 MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2;x+yADDAX,24ADCDX,0;x+y+24SUBAX,ZSBBDX,Z+2;x+y+24-zMOVW,AXMOVW+2,DX ;結(jié)果存入W,W+2單元 7算術(shù)運(yùn)算指令應(yīng)用舉例6)有兩個(gè)字符串形式的十進(jìn)制數(shù),2658和3619,求二者之和。即2658+3619=?由題意知,被加數(shù)和加數(shù)的每一位都以ASCII碼形式存放在內(nèi)存中。假定二數(shù)在內(nèi)存中均是低位在前,高位在后,另留出5個(gè)單元存放相加的結(jié)果。內(nèi)存中數(shù)據(jù)存放形式見下頁圖。7算術(shù)運(yùn)算指令應(yīng)用舉例36H32H39H31HSTRING1STRING238H35H36H33H被加數(shù)加數(shù)數(shù)據(jù)段‘8’‘5’‘6’‘2’‘9’‘1’‘6’‘3’SUM結(jié)果......7算術(shù)運(yùn)算指令應(yīng)用舉例LEASI,STRING1;STRING1偏移地址送SILEADI,STRING2;STRING2偏移地址送DILEABX,SUM;SUM偏移地址送BXMOVCX,4;循環(huán)4次CLC;清進(jìn)位標(biāo)志AGAIN:MOVAL,[SI]ADCAL,[DI];帶進(jìn)位加AAA;未壓縮BCD碼調(diào)正MOV[BX],AL;結(jié)果存入SUMINCSI;調(diào)整指針I(yè)NCDIINCBXDECCX;循環(huán)計(jì)數(shù)器減1JNZAGAIN;若未處理完,則轉(zhuǎn)AGAIN操作碼ANDORNOTXORTEST功能與或非異或測試2.3.3邏輯指令邏輯運(yùn)算指令
移位指令
1邏輯運(yùn)算指令邏輯運(yùn)算指令包括AND(與)OR(或)NOT(非)XOR(異或)TEST(測試)例: ANDAL,0FH;
AL中內(nèi)容和0FH相與,結(jié)果在AL中1邏輯運(yùn)算指令ORAX,00F0H ;AX和00F0H相或,結(jié)果在AXXOR AX,AX
;AX內(nèi)容本身進(jìn)行異或,結(jié)果AX清零
TEST和AND執(zhí)行同樣操作,但TEST指令不送回操作結(jié)果,而僅僅影響標(biāo)志位。如:TEST AX,8000H ;如AX的最高位為1,則ZF=0,否則ZF=1
1邏輯運(yùn)算指令NOT指令求操作數(shù)的反碼。比如: NOT AL ;AL中內(nèi)容求反碼,結(jié)果AL中邏輯運(yùn)算指令對標(biāo)志位的影響指令OFCFSFPFZFAFAND=0=00或10或10或1無定義OR=0=00或10或10或1無定義XOR=0=00或10或10或1無定義TEST=0=00或10或10或1無定義NOT不影響不影響不影響不影響不影響不影響由于邏輯運(yùn)算操作是按位進(jìn)行的,所以對標(biāo)志位的影響不同于算術(shù)運(yùn)算操作,2移位指令(1)非循環(huán)移位指令 4條移位指令:算術(shù)左移指令SAL邏輯左移指令SHL算術(shù)右移指令SAR邏輯右移指令SHR0CF操作數(shù)CF操作數(shù)CF0操作數(shù)2移位指令2移位指令(2)循環(huán)移位指令
循環(huán)左移指令ROL循環(huán)右移指令ROR帶進(jìn)位位的循環(huán)左移RCL帶進(jìn)位位的循環(huán)右移RCRCF操作數(shù)CF操作數(shù)CF操作數(shù)CF操作數(shù)演示演示演示演示SHL和SAL指令的功能SHR指令的功能SAR指令的功能ROL指令的功能ROR指令的功能RCL指令的功能RCR指令的功能3邏輯運(yùn)算指令應(yīng)用舉例(1)將AL中的壓縮的BCD碼轉(zhuǎn)換成非壓縮的BCD碼,存入AH和AL中。
MOV AH,AL AND AH,0FH MOV CL,4 SHR AH,CL AND AL,0FH(2)把AL的第5位置為1ORAL,00100000B3邏輯運(yùn)算指令應(yīng)用舉例(3)將AL中的數(shù)乘以4(不用乘法指令)。
MOV CL,2 SHL AL,CL(4)將AL中的數(shù)D0~D6清零。
AND AL,80H(5)把AH和AL中的非壓縮BCD碼組合成壓縮的BCD碼,放到AL中。MOV CL,4SHLAH,CLORAL,AH3邏輯運(yùn)算指令應(yīng)用舉例(6)把AL中的數(shù)x乘10因?yàn)?0=8+2=23+21,所以可用移位實(shí)現(xiàn)乘10操作。程序如下:
SALAL,1;2x
MOVAH,AL
SALAL,1;4xSALAL,1;8xADD AL,AH;8x+2x=10x3邏輯運(yùn)算指令應(yīng)用舉例用移位操作代替乘除法可提高運(yùn)算速度例:前例中計(jì)算x×10。(1)采用乘法指令: MOV BL,10MUL BL 共需70~77個(gè)T周期。(2)采用移位和加法指令:SAL AL,1;2TMOV AH,AL;2TSAL AL,1;2TSAL AL,1;2TADD AL,AH;3T只需11個(gè)T周期,僅相當(dāng)于乘法的1/7。3邏輯運(yùn)算指令應(yīng)用舉例(7)將AL的高4位與低4位互換。
MOVCL,4ROLAL,CL(8)將1A00H內(nèi)存單元中的雙字循環(huán)左移1位。
CMP[1A00H],8000HCMCRCLWORDPTR[1A02H],1RCLWORDPTR[1A00H],13邏輯運(yùn)算指令應(yīng)用舉例例1:將以W為首址的字無符號數(shù)除以8,商放在AX中,余數(shù)放在DL中。
MOVAX,W
;先將其送入AX中 XORDL,DL ;將DL清零 SHRAX,1 ;邏輯右移,使W/2
RCRDL,1 ;余數(shù)放入DL的高位 SHRAX,1 ;W/4 RCRDL,1 ;余數(shù)向右移 SHRAX,1 ;W/8 RCRDL,1 ; MOVCL,5 ;
SHR
DL,CL ;余數(shù)右移5位2.3.4串處理指令設(shè)置方向標(biāo)志指令字符串傳送指令存字符串指令取字符串指令字符串比較指令字符串檢索指令1設(shè)置方向標(biāo)志指令
CLD DF置0,自動增
STD DF置1,自動減串操作指令的約定:(1)源串用DS:SI間址,目的串用ES:DI間址;對于較短的字符串,可將DS=ES;因此在字符串處理指令前,要先給SI和DI賦值;(2)源串和目的串的偏移地址指針的移動方向由方向標(biāo)志DF確定:DF=0,SI和DI增量;DF=1,SI和DI減量。方向標(biāo)志置位指令STD
STD
DF置1,SI和DI自動減量方向標(biāo)志置位指令CLD
CLD
DF置0,SI和DI自動增量(3)若使重復(fù)前綴,則應(yīng)將串長度送CX寄存器。2字符串傳送指令字符串傳送指令MOVSB/MOVSW
MOVSB用于字節(jié)傳送 MOVSW用于字傳送。
特點(diǎn):指令前面常加重復(fù)前綴REP。
2字符串傳送指令——【例】設(shè)偏移地址為1000H的內(nèi)存中存放著100個(gè)字節(jié)的數(shù)據(jù)。要求傳送到以2000H為起始地址的區(qū)域。MOV SI,1000H ;源地址為1000HMOV DI,2000H ;目的地址為2000HMOV CX,100 ;字符串長100個(gè)字節(jié)CLD ;方向標(biāo)志清0,使指針按增量方向修改REPMOVSB ;將源地址開始的100個(gè)字節(jié)傳送到目的地址2字符串傳送指令——注意MOVSB指令注意點(diǎn):①源地址用SI寄存器指出 目的地址用DI寄存器指出②CX中為字節(jié)數(shù)或字?jǐn)?shù)。③若DF為0,則用MOVSB時(shí),每傳送一次,SI和DI自動增1;用MOVSW時(shí),每傳送一次,SI和DI自動增2。3存、取字符串指令
STOSB/STOSW(存字符串指令)功能:
把AL或AX中的數(shù)據(jù)存到ES段DI寄存器所指的內(nèi)存單元。LODSB/LODSW(取字符串指令)功能:
將位于DS段由SI所指的存儲單元的內(nèi)容取到AL或AX中。 5字符串比較指令字符串比較指令CMPSB/CMPSW功能:DS段由SI所指的字節(jié)或者字和ES段由DI所指的字節(jié)或者字相比較。 注意點(diǎn):①預(yù)先將 源字符串的首址設(shè)置到DS段和SI中 目的字符串的首址設(shè)置到ES段和DI中 比較的字節(jié)數(shù)或字?jǐn)?shù)設(shè)置到CX中 設(shè)置方向標(biāo)志②在DF為0或?yàn)?,影響比較SI和DI的修改方向。③通常加前綴 REPNZ/REPNE、
REPZ/REPE6字符串檢索指令SCASB或者SCASW功能:
將AL中的字節(jié)或者AX中的字與位于ES段由DI寄存器所指的內(nèi)存單元的字節(jié)或字相比較。7串重復(fù)前綴重復(fù)前綴:只允許用在串操作指令前,使緊跟其后的串操作指令重復(fù)執(zhí)行。在使用重復(fù)前綴前,重復(fù)次數(shù)必須放在寄存器CX中,而且是先判斷,然后再決定是否執(zhí)行串操作。REP 重復(fù)執(zhí)行,(CX)=重復(fù)次數(shù)REPE/REPZ
(CX≠0)且(ZF=1)相等/為零時(shí)重復(fù)
執(zhí)行,(CX)=次數(shù)REPNE/REPNZ
(ZF=0)且(CX≠0)不等/不為零時(shí)重
復(fù)執(zhí)行,(CX)=次數(shù)2.3.5控制轉(zhuǎn)移指令控制轉(zhuǎn)移指令中包括5類指令,即無條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令循環(huán)控制指令子程序調(diào)用和返回指令中斷指令2.3.5控制轉(zhuǎn)移指令1、無條件轉(zhuǎn)移指令轉(zhuǎn)移指令分為JMP和Jcond兩大類,前者稱為無條件轉(zhuǎn)移指令,后者稱為條件轉(zhuǎn)移指令,常用于選擇結(jié)構(gòu)的程序?qū)崿F(xiàn)中。條件轉(zhuǎn)移只能實(shí)現(xiàn)段內(nèi)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中小微企業(yè)供應(yīng)鏈金融創(chuàng)新與金融科技風(fēng)險(xiǎn)控制研究報(bào)告
- 福州廠房租賃合同協(xié)議
- 工程勞務(wù)協(xié)議書范本
- 快銷入股合同協(xié)議
- 填充棉購買合同協(xié)議
- 購二手房合同協(xié)議
- 培訓(xùn)機(jī)構(gòu)中國舞合同協(xié)議
- 工業(yè)用地開發(fā)合同協(xié)議
- 建筑改造服務(wù)合同協(xié)議
- 相城區(qū)勞動派遣合同協(xié)議
- (完整)關(guān)于高壓線下施工安全專項(xiàng)方案
- 2022年新疆維吾爾自治區(qū)三校生高考語文備考試題及答案解析
- 國際學(xué)術(shù)交流英語知到章節(jié)答案智慧樹2023年哈爾濱工業(yè)大學(xué)
- 反三角函數(shù)正課
- 高考標(biāo)準(zhǔn)化考場建設(shè)的方案
- 乳腺癌NCCN指南中文版2022.v2
- GB/T 38942-2020壓力管道規(guī)范公用管道
- 家居建材全屋定制店面運(yùn)營管理細(xì)則規(guī)定
- GB/T 27924-2011工業(yè)貨架規(guī)格尺寸與額定荷載
- 大班語言《他們看見了一只貓》課件
- 消毒產(chǎn)品進(jìn)貨檢查驗(yàn)收制度
評論
0/150
提交評論