尋址方式和指令系統(tǒng)修改.ppt
《尋址方式和指令系統(tǒng)修改.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《尋址方式和指令系統(tǒng)修改.ppt(141頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
本章重點(diǎn):1、掌握8086尋址方式2、掌握8086匯編語言指令系統(tǒng),第三章8086的尋址方式和指令系統(tǒng),第三章8086的尋址方式和指令系統(tǒng),3-18086的尋址方式,指令有單操作數(shù)、雙操作數(shù)和無操作數(shù)之分。如果是雙操作數(shù)指令,要用逗號(hào)將兩個(gè)操作數(shù)分開,逗號(hào)右邊的操作數(shù)稱為源操作數(shù),逗號(hào)左邊的為目的操作數(shù)。,MOV功能:將BX中的源操作數(shù)→AX(目的),,而象單操作數(shù)指令I(lǐng)NCAX其中AX既是源操作數(shù),又是目的操作數(shù),其功能是:AX+1→AX。而象指令NOP,沒有操作數(shù)。,前面舉的例子都是操作數(shù)在寄存器中,操作數(shù)還可以在存儲(chǔ)器或I/O端口中,也可以是立即數(shù)。,,8086的尋址方式,下面主要以MOV指令來說明8086的這些尋址方式。,一、立即尋址方式,操作數(shù)直接包含在指令中,它是一個(gè)8位或16位的常整數(shù),也叫立即數(shù)。,例如MOVAL,30HMOVAX,0FFFCHMOV[1000H],1234H注意:1.常數(shù)以A~F開頭時(shí),應(yīng)在其前加0,以區(qū)別其它符號(hào)(如0FFFCH)。2.立即數(shù)只能作源操作數(shù),不能作目的操作數(shù)。(如MOV23H,BL),二、寄存器尋址方式,操作數(shù)包含在寄存器中。對(duì)于16位操作數(shù),寄存器可以是AX,BX,CX,DX,SI,DI,SP,BP等等;對(duì)于8位操作數(shù),寄存器可以是AH,AL,BH,BL,CH,CL,DH,DL。例1:MOVDX,AX2:MOVBL,CL注意:源操作數(shù)的長度必須與目的操作數(shù)一致。,,三、直接尋址方式(存儲(chǔ)器尋址),1.直接尋址方式,有效地址(EA):操作數(shù)的偏移地址。使用直接尋址方式的指令時(shí),存儲(chǔ)單元的有效地址直接由指令給出,而段地址如沒有指令前綴,默認(rèn)由數(shù)據(jù)段寄存器給出。例如MOVAX,[2000H];存儲(chǔ)單元的有效地址EA=2000H,段地址由數(shù)據(jù)段DS指定(設(shè)DS=3000H)。此指令的執(zhí)行過程如下圖所示。,,指令MOVAX,[2000H]的執(zhí)行過程,2.段超越前綴如果要對(duì)代碼段、堆棧段或附加段寄存器所指出的存儲(chǔ)區(qū)進(jìn)行直接尋址,應(yīng)在指令中指定段超越前綴。,3.符號(hào)地址(變量名)在匯編語言中還允許用符號(hào)地址代替數(shù)值地址,實(shí)際上就是給存儲(chǔ)單元起一個(gè)名字,這樣,要與這些單元打交道,只要使用其名字即可,不必記住具體數(shù)值是多少。例如MOVAX,AREA1這里的AREA1就是操作數(shù)的符號(hào)地址,該指令執(zhí)行后,將從有效地址為AREA1的存儲(chǔ)單元中取出一個(gè)字送到AX中去。,注意:光從指令的形式上看,AREA1不僅可代表符號(hào)地址,也可以表示它是一個(gè)16位的立即數(shù),兩者之間究竟如何來區(qū)別呢?程序中還必須事先安排說明語句也叫做偽指令來加以說明。,四、寄存器間接尋址方式,指令中給出的寄存器中的值不是操作數(shù)本身,而是操作數(shù)的有效地址EA,這種尋址方式稱為寄存器間接尋址。寄存器名稱外面必須加方括號(hào),以與寄存器尋址方式相區(qū)別。這類指令中使用的寄存器有基址寄存器BX、BP及變址寄存器SI、DI。,例如MOVBX,[SI]設(shè)DS=1000H,SI=2000H,(12000H)=3456H則物理地址=DS16+SI=10000H+2000H=12000H此指令的功能就是(12000H)字→BX,因此指令執(zhí)行后BX=3456H。執(zhí)行過程如下圖所示。,指令MOVBX,[SI]的執(zhí)行過程,例如指令MOVAX,[BP],則默認(rèn)操作數(shù)在堆棧段中,操作數(shù)的物理地址=SS16+BP。設(shè)SS=4000H,BP=1000H,(41000H)=5678H則物理地址=SS16+BP=40000H+1000H=41000H此指令的功能就是(41000H)字→AX,因此指令執(zhí)行后AX=5678H。執(zhí)行過程如下圖所示。,指令MOVAX,[BP]的執(zhí)行過程,寄存器間接尋址方式的指令中也可以指定段超越前綴來從默認(rèn)段以外的段中取得數(shù)據(jù),如:MOVBX,DS:[BP]物理地址=DS16+BPMOVAX,ES:[DI]物理地址=ES16+DI,五、寄存器相對(duì)尋址方式操作數(shù)的有效地址是一個(gè)基址或變址寄存器的內(nèi)容與指令中指定的8位或16位位移量之和。這種尋址方式與寄存器間接尋址十分相似,主要區(qū)別是前者在有效地址的基礎(chǔ)上還要加一個(gè)位移量。同樣,當(dāng)指令中指定的寄存器是BX,SI或DI時(shí),默認(rèn)的段寄存器是DS,當(dāng)指定寄存器是BP時(shí),默認(rèn)的段寄存器是SS。,指令MOVBX,COUNT[SI]的執(zhí)行過程,六、基址變址尋址方式操作數(shù)的有效地址是一個(gè)基址寄存器(BX或BP)和一個(gè)變址寄存器(SI或DI)的內(nèi)容之和,兩個(gè)寄存器均由指令指出。若基址寄存器BX時(shí),段寄存器用DS;若基址寄存器BP時(shí),段寄存器用SS。,指令MOVAX,[BX][SI]的執(zhí)行過程,七、相對(duì)基址變址尋址方式操作數(shù)的有效地址是一個(gè)基址寄存器(BX或BP)和一個(gè)變址寄存器(SI或DI)的內(nèi)容,再加上指令中指定的8位或16位位移量之和。若基址寄存器BX時(shí),段寄存器用DS;若基址寄存器BP時(shí),段寄存器用SS。,指令MOVAX,MASK[BX][SI]的執(zhí)行過程,從以上這些尋址方式可以看到,在涉及到操作數(shù)的地址時(shí),常常要在指令中使用方括號(hào),有關(guān)帶方括號(hào)的地址表達(dá)式必須遵循下列規(guī)則:,①立即數(shù)可以出現(xiàn)在方括號(hào)內(nèi),表示直接尋址,如[1000H];,②只有BX,BP,SI和DI這四個(gè)寄存器可以出現(xiàn)在方括號(hào)內(nèi),它們可以單獨(dú)出現(xiàn),也可以由兩個(gè)寄存器組合起來(只能相加),同時(shí)還可以加上一個(gè)8位或16位的位移量,但BX和BP不能同時(shí)出現(xiàn)在方括號(hào)中,SI和DI也不能同時(shí)出現(xiàn)在方括號(hào)中;,,③由于方括號(hào)有相加的含義,下面幾種寫法都是等價(jià)的:6[BX][SI][BX+6][SI][BX][SI+6][BX+SI+6],④若方括號(hào)內(nèi)出現(xiàn)BP,則隱含使用SS段來提供段地址,物理地址=SS16+EA,其他情況均使用DS段來提供段地址,物理地址=DS16+EA,當(dāng)然我們可以通過加段超越前綴來修改段地址。,八、其它尋址方式,1.隱含尋址指令中不指明操作數(shù),但有隱含規(guī)定的尋址方式。例如指令DAA,它的含義是對(duì)寄存器AL中的數(shù)據(jù)進(jìn)行十進(jìn)制數(shù)調(diào)整,結(jié)果仍保留在AL中。,2.I/O端口尋址分為直接端口尋址和間接端口尋址。直接:端口號(hào)由指令直接給出,是一個(gè)8位的立即數(shù)。端口號(hào)范圍為:00~FFH;間接:端口號(hào)由寄存器DX指定,端口范圍為:0000~FFFFH。,3.一條指令有幾種尋址方式前面介紹的各種尋址方式都是針對(duì)源操作數(shù)的,目的操作數(shù)均用寄存器來表示。實(shí)際上,目的操作數(shù)也可以除立即尋址方式以外的所有尋址方式指定。,4.轉(zhuǎn)移類指令尋址將在后面章節(jié)詳細(xì)介紹。,3-2指令的機(jī)器碼表示方法(自學(xué)),課堂練習(xí)P120(1,2,3)其中1(2),(4),(6)2(1),(3),(5)3(1),(2),(6)作業(yè):P120(1,2,3)其中1(1),(3),(5)2(2),(4),(6)3(7),(8),(9),3-38086的指令系統(tǒng),8086指令系統(tǒng)中包含133條基本指令,分六大類:①數(shù)據(jù)傳送指令②算術(shù)運(yùn)算指令③邏輯運(yùn)算和移位指令④字符串操作指令⑤控制轉(zhuǎn)換指令⑥處理器控制指令,一、數(shù)據(jù)傳送指令,分4類:①通用數(shù)據(jù)傳送指令②輸入輸出指令③地址目標(biāo)傳送指令④標(biāo)志傳送指令,1.通用數(shù)據(jù)傳送指令,(1)MOV傳送指令指令格式:MOV目的,源指令功能:將源操作數(shù)(一個(gè)字節(jié)或一個(gè)字)傳送到目的操作數(shù)。,幾點(diǎn)說明:,①指令中,立即數(shù)不能作為目的操作數(shù),CS和IP也不能作為目的操作數(shù),即它們的值不能隨意修改。同時(shí)IP還不能作為源操作數(shù)。,②兩個(gè)內(nèi)存單元之間,以及兩個(gè)段寄存器之間不能直接傳送數(shù)據(jù)。,③立即數(shù)不能直接傳送給段寄存器,必須通過寄存器傳送給段寄存器。,④當(dāng)指令是給SS段寄存器賦值時(shí),系統(tǒng)會(huì)自動(dòng)禁止外部中斷,等到本條指令和下條指令執(zhí)行之后,又自動(dòng)開中斷。(目的?),針對(duì)第③點(diǎn)說明,我們簡(jiǎn)單了解一下一個(gè)數(shù)據(jù)段的定義,以及段地址→DS?,例如,下面是某個(gè)程序的數(shù)據(jù)段:DATASEGMENT;數(shù)據(jù)段開始AREA1DB14H,3BHAREA2DB3DUP(0)ARRAYDW3100H,01A6HSTRINGDB‘GOOD’DATAENDS;數(shù)據(jù)段結(jié)束,,圖3-13數(shù)據(jù)段占用存儲(chǔ)空間的情況,課堂練習(xí):習(xí)題5、6(1-3-5),(2)PUSH進(jìn)棧指令指令格式:PUSH源指令功能:將源操作數(shù)壓入堆棧?!镌床僮鲾?shù)可以是16位通用寄存器、段寄存器或存儲(chǔ)器中的數(shù)據(jù)字,但不能是立即數(shù)。,(3)POP出棧指令指令格式:POP目的指令功能:將當(dāng)前SP和SP+1所指向的單元內(nèi)容→目的操作數(shù)。★源操作數(shù)可以是16位通用寄存器、段寄存器或存儲(chǔ)器中的數(shù)據(jù)字,但CS不能作為目的操作數(shù)。,例3-29假如當(dāng)前SS=C000H,SP=1000H,AX=1234HBX=5678H,CX=ABCDH,則執(zhí)行指令PUSHAX,PUSHBX,POPCX后,堆棧中的內(nèi)容發(fā)生什么變化,AX,BX,CX中的內(nèi)容又是多少?畫圖說明。,,(4)XCHG交換指令指令格式:XCHG目的,源指令功能:把一個(gè)字或字節(jié)的源操作數(shù)和目的操作數(shù)相交換。,幾點(diǎn)說明:,①段寄存器、IP,立即數(shù)不能作為操作數(shù),②兩個(gè)存儲(chǔ)單元之間不能直接交換數(shù)據(jù),③目的和源操作數(shù)的長度必須一致,(5)XLAT表轉(zhuǎn)換指令(查表指令)指令格式:XLAT轉(zhuǎn)換表指令功能:將一個(gè)字節(jié)從一種代碼轉(zhuǎn)換成另一種代碼。,使用過程:,①在內(nèi)存中建立一個(gè)表格(就是定義一段字節(jié)數(shù)據(jù),這些數(shù)據(jù)就是轉(zhuǎn)換以后的代碼)。,②將表的首地址→BX寄存器中(只能是BX),③在AL中存放一個(gè)數(shù)據(jù)(就是需要轉(zhuǎn)換的代碼),而這個(gè)數(shù)據(jù)實(shí)際是表的首地址與所要查找的某一項(xiàng)之間的位移量(∴表格中最多包含256個(gè)字節(jié)),④執(zhí)行XLAT指令,指令執(zhí)行后,將轉(zhuǎn)換后的代碼(所查的字節(jié)內(nèi)容)就→AL中。,例3-31如下圖所示的8段數(shù)碼管,顯示段碼的格式為:(dpgfedcba)2,當(dāng)相應(yīng)的位為‘1’時(shí),此段就顯示;為‘0’時(shí),就不顯示。如0的段碼為:(00111111)2=3FH;1的段碼為:(00000110)2=06H等等?,F(xiàn)要求編一程序段,通過查表將5的顯示段碼→DL中。,,程序如下:DISPDB3FH,06H,5BH,4FH,66HDB6DH,7DH,07H,7FH,6FH┋MOVBX,OFFSETDISP;表首址→BXMOVAL,5;5的段碼與表首址之間的位移量→ALXLAT(XLATDISP);5的段碼6DH→ALMOVDL,AL;5的段碼6DH保存到DL,,2.輸入輸出指令用來完成I/O端口與累加器之間的數(shù)據(jù)傳送,指令中要給出I/O端口的地址。,(1)IN輸入指令指令格式:①INAL,端口地址;INAX,端口地址②INAL,DX;INAX,DX;指令功能:從8位端口讀一個(gè)字節(jié)→AL,或從16位端口讀一個(gè)字→AX。,INAL,50H;從50H端口讀一個(gè)字節(jié)→AL,(2)OUT輸出指令指令格式:①OUT端口地址,AL;OUT端口地址,AX②OUTDX,AL;OUTDX,AX;,3.地址目標(biāo)傳送指令—用來傳送操作數(shù)的段地址和偏移地址,(1)LEA取有效地址指令指令格式:LEA目的,源指令功能:取源操作數(shù)的偏移地址→目的要求:①源操作數(shù)必須是內(nèi)存單元②目的操作數(shù)必須是一個(gè)16位的寄存器(段寄存器除外)★使用時(shí),要注意與MOV指令的區(qū)別!,(2)LDS將雙字指針?biāo)偷郊拇嫫骱虳S指令指令格式:LDS目的,源指令功能:從源操作數(shù)指定的存儲(chǔ)單元中,取出一個(gè)變量的4字節(jié)地址指針,送到一對(duì)目的寄存器。其中前兩個(gè)字節(jié)(表示變量的偏移地址)送到指令中指定的目的寄存器,后兩個(gè)字節(jié)(表示變量的段地址)送到DS段寄存器中。,要求:①源操作數(shù)必須是內(nèi)存單元,從該單元開始的連續(xù)4個(gè)字節(jié)單元中,存放著一個(gè)變量的地址指針(偏移地址和段地址),②目的操作數(shù)必須是一個(gè)16位的寄存器(段寄存器除外),常使用SI寄存器。,(3)LES將雙字指針?biāo)偷郊拇嫫骱虴S指令指令格式:LES目的,源指令功能:從源操作數(shù)指定的存儲(chǔ)單元中,取出一個(gè)變量的4字節(jié)地址指針,送到一對(duì)目的寄存器。其中前兩個(gè)字節(jié)(表示變量的偏移地址)送到指令中指定的目的寄存器,后兩個(gè)字節(jié)(表示變量的段地址)送到ES段寄存器中。,要求:①源操作數(shù)必須是內(nèi)存單元,從該單元開始的連續(xù)4個(gè)字節(jié)單元中,存放著一個(gè)變量的地址指針(偏移地址和段地址)②目的操作數(shù)必須是一個(gè)16位的寄存器(段寄存器除外),常使用DI寄存器。,4.標(biāo)志傳送指令—對(duì)標(biāo)志寄存器FLAGS進(jìn)行操作,(1)LAHF,標(biāo)志送到AH指令指令格式:LAHF指令功能:把標(biāo)志寄存器的低8位對(duì)應(yīng)→AH,(2)SAHF,AH送到標(biāo)志寄存器指令指令格式:SAHF指令功能:把AH對(duì)應(yīng)→標(biāo)志寄存器的低8位,其高8位保持不變。,(3)PUSHF,標(biāo)志入棧指令指令格式:PUSHF指令功能:把整個(gè)標(biāo)志寄存器的內(nèi)容壓入堆棧,同時(shí)修改SP(SP-2→SP),(4)POPF,標(biāo)志出棧指令指令格式:POPF指令功能:把當(dāng)前堆棧指針SP所指的一個(gè)字,傳送到標(biāo)志寄存器,同時(shí)修改SP(SP+2→SP),二、算術(shù)運(yùn)算指令,算術(shù)運(yùn)算指令可以處理4種類型的數(shù):,①無符號(hào)二進(jìn)制整數(shù),②帶符號(hào)二進(jìn)制整數(shù):用補(bǔ)碼表示,③無符號(hào)壓縮十進(jìn)制整數(shù):一個(gè)字節(jié)中存放兩個(gè)BCD碼十進(jìn)制數(shù)。,④無符號(hào)非壓縮十進(jìn)制整數(shù):只在一個(gè)字節(jié)的低半字節(jié)存放一個(gè)BCD碼十進(jìn)制數(shù),而高半字節(jié)為0。,8086指令系統(tǒng)提供了加、減、乘、除四種基本運(yùn)算指令,可處理無符號(hào)或帶符號(hào)的8位或16位二進(jìn)制數(shù)的算術(shù)運(yùn)算,還提供了各種調(diào)整操作指令,故可進(jìn)行壓縮的或非壓縮的十進(jìn)制數(shù)的算術(shù)運(yùn)算。絕大部分算術(shù)運(yùn)算指令都影響狀態(tài)標(biāo)志位。對(duì)于加法和減法運(yùn)算指令,帶符號(hào)數(shù)和無符號(hào)數(shù)的加法和減法運(yùn)算的操作過程是一樣的故可以用同一條加法或減法指令來完成。而對(duì)于乘法和除法運(yùn)算,帶符號(hào)數(shù)和無符號(hào)數(shù)的運(yùn)算過程完成不同,必須分別設(shè)置無符號(hào)數(shù)的乘除法指令。,1.加法指令,(1)ADD不帶進(jìn)位的加法指令指令格式:ADD目的,源指令功能:源+目的→目的,(2)ADC帶進(jìn)位的加法指令指令格式:ADC目的,源指令功能:源+目的+CF→目的,例3-41求下列指令執(zhí)行后,對(duì)標(biāo)志位有何影響?MOVAL,5EHADDAL,3CH,★上述這些標(biāo)志位我們程序員不是每個(gè)都需要關(guān)心,要分不同情況考慮:①當(dāng)程序員把上兩數(shù)看成是無符號(hào)數(shù)相加時(shí),在這里SF和OF就沒有什么實(shí)際意義了,只要關(guān)心CF就可以了。②當(dāng)程序員把上兩數(shù)看成是有符號(hào)數(shù)相加時(shí),這時(shí)CF位就沒有什么意義了,而需要考慮SF和OF位。③當(dāng)進(jìn)行BCD碼運(yùn)算或需要進(jìn)行奇偶校驗(yàn)時(shí),才考慮AF或PF標(biāo)志位。,(3)INC增量指令指令格式:INC目的指令功能:目的+1→目的,(4)AAA加法的ASCII調(diào)整指令指令格式:AAA指令功能:在用ADD或ADC指令對(duì)兩個(gè)非壓縮十進(jìn)制數(shù)或ASCII碼表示的十進(jìn)制數(shù)作加法后,運(yùn)算結(jié)果已存在AL的情況下,用此指令將AL寄存器中的運(yùn)算結(jié)果調(diào)整為1位非壓縮十進(jìn)制數(shù),仍保留在AL中,如果AF=1,表示向高位有進(jìn)位,則進(jìn)位進(jìn)到AH中。,AAA指令執(zhí)行時(shí),對(duì)AL中的運(yùn)算結(jié)果進(jìn)行調(diào)整的過程如下:若AL低4位>9或輔助進(jìn)位AF=1,則①AL+6→AL;②用與操作將AL高4位清0,低4位不變;③AF置1,CF置1,AH+1→AH否則,僅將AL寄存器的高4位清0。,例3-44若AL=BCD9,BL=BCD5,求兩數(shù)之和。設(shè)AH=0。下面看看運(yùn)算過程:,例3-45求ASCII碼表示的數(shù)9(39H)和5(35H)之和。設(shè)AH=0,則運(yùn)算過程如下:,,(5)DAA加法的十進(jìn)制調(diào)整指令指令格式:DAA指令功能:將兩個(gè)壓縮BCD數(shù)相加后的結(jié)果調(diào)整為正確的壓縮BCD數(shù)。相加后的結(jié)果必須在AL中,才能使用DAA指令。,例3-46若AL=BCD38,BL=BCD15,求兩數(shù)之和。下面看看運(yùn)算過程:,例3-47若AL=BCD88,BL=BCD49,求兩數(shù)之和。下面看看運(yùn)算過程:,2.減法指令,(1)SUB不帶借位的減法指令指令格式:SUB目的,源指令功能:目的-源→目的,(2)SBB帶借位的減法指令指令格式:SBB目的,源指令功能:目的-源-CF→目的,(3)DEC增量指令指令格式:DEC目的指令功能:目的-1→目的,(4)NEG取負(fù)指令(求補(bǔ)指令)指令格式:NEG目的指令功能:0-目的→目的,(5)CMP比較指令指令格式:CMP目的,源,(6)AAS減法的ASCII調(diào)整指令指令格式:AAS指令功能:在用SUB或SBB指令對(duì)兩個(gè)非壓縮十進(jìn)制數(shù)或ASCII碼表示的十進(jìn)制數(shù)作減法后,運(yùn)算結(jié)果已存在AL的情況下,對(duì)AL中的所得結(jié)果調(diào)整,在AL中得到一個(gè)正確的非壓縮十進(jìn)制數(shù)之差,如果有借位,則CF置1。AAS指令必須緊跟在SUB或SBB指令之后。,例3-54設(shè)AL=BCD3,CL=BCD8,求兩數(shù)之差。顯然,結(jié)果為BCD5,但要向高位借位。調(diào)整過程如下:,(7)DAS減法的十進(jìn)制調(diào)整指令指令格式:DAS指令功能:將兩個(gè)壓縮BCD數(shù)相減后的結(jié)果調(diào)整為正確的壓縮BCD數(shù)。相減后的結(jié)果必須在AL中,才能使用DAS指令。,例3-55設(shè)AL=BCD56,CL=BCD98,求兩數(shù)之差。調(diào)整過程如下:,3.乘法指令,(1)MUL無符號(hào)數(shù)乘法指令指令格式:MUL源指令功能:把源操作數(shù)和累加器中的數(shù)都當(dāng)成是無符號(hào)數(shù),然后將兩數(shù)相乘,源操作數(shù)可以是字節(jié)或字。,(2)IMUL有符號(hào)數(shù)乘法指令,指令格式:IMUL源指令功能:把源操作數(shù)和累加器中的數(shù)都當(dāng)成是有符號(hào)數(shù),然后將兩數(shù)相乘,源操作數(shù)可以是字節(jié)或字。,(3)AAM乘法的ASCII調(diào)整指令指令格式:AAM指令功能:對(duì)已存在AL中的兩個(gè)非壓縮十進(jìn)制數(shù)相乘的乘積進(jìn)行十進(jìn)制數(shù)的調(diào)整,使得在AX中得到正確的非壓縮十進(jìn)制數(shù)的乘積,高位放在AH中,低位放在AL中。兩個(gè)ASCII碼數(shù)相乘之前,必須先屏蔽掉每個(gè)數(shù)字的高半字節(jié),從而使每個(gè)字節(jié)包含一個(gè)非壓縮十進(jìn)制數(shù),再用MUL指令相乘,乘積放到AL寄存器中,然后用AAM指令進(jìn)行調(diào)整。,4.除法指令,(1)DIV無符號(hào)數(shù)除法指令指令格式:DIV源指令功能:把源操作數(shù)和累加器中的數(shù)都當(dāng)成是無符號(hào)數(shù),然后將兩數(shù)相除,源操作數(shù)可以是字節(jié)或字。,(2)IDIV帶符號(hào)數(shù)除法指令指令格式:IDIV源指令功能:該指令執(zhí)行的操作與DIV相同,但操作數(shù)都必須是帶符號(hào)數(shù),商和余數(shù)也都是帶符號(hào)數(shù),而且規(guī)定余數(shù)的符號(hào)和被除數(shù)的符號(hào)相同。●–25/3→商=-8,余數(shù)=-1√(規(guī)定)商=-9,余數(shù)=+2,(3)CBW把字節(jié)轉(zhuǎn)換成字指令指令格式:CBW指令功能:把寄存器AL中字節(jié)的符號(hào)位擴(kuò)充到AH的所有位,這時(shí)AH被稱為是AL的符號(hào)擴(kuò)充。,(4)CWD把字轉(zhuǎn)換成雙字指令指令格式:CWD指令功能:把寄存器AX中字的符號(hào)位擴(kuò)展到DX寄存器的所有位中去。,(5)AAD除法的ASCII調(diào)整指令指令格式:AAD指令功能:在做除法之前,把BCD碼轉(zhuǎn)換成二進(jìn)制數(shù)。,三、邏輯運(yùn)算和移位指令邏輯運(yùn)算和移位指令對(duì)字節(jié)或字操作數(shù)進(jìn)行按位操作。,1.邏輯運(yùn)算指令,(1)NOT取反指令指令格式:NOT目的指令功能:將目的操作數(shù)求反,結(jié)果送回目的操作數(shù),即→目的,(2)AND邏輯與指令指令格式:AND目的,源指令功能:對(duì)兩個(gè)操作數(shù)進(jìn)行按位邏輯與操作,結(jié)果送回目的操作數(shù)。,(3)OR邏輯或指令指令格式:OR目的,源指令功能:對(duì)兩個(gè)操作數(shù)進(jìn)行按位邏輯或操作,結(jié)果送回目的操作數(shù)。,(4)XOR異或操作指令指令格式:XOR目的,源指令功能:對(duì)兩個(gè)操作數(shù)進(jìn)行按位邏輯異或操作,結(jié)果送回目的操作數(shù)。,(5)TEST測(cè)試指令指令格式:TEST目的,源指令功能:對(duì)兩個(gè)操作數(shù)進(jìn)行按位邏輯與操作,并修改標(biāo)志位,但不送回結(jié)果到目的,即指令執(zhí)行后,兩個(gè)操作數(shù)都不變,僅影響標(biāo)志位。,2.算術(shù)邏輯移位指令(非循環(huán)移位指令)可對(duì)寄存器或存儲(chǔ)器中的字或字節(jié)的各位進(jìn)行算術(shù)移位或邏輯移位,移位的次數(shù)由指令中的計(jì)數(shù)值決定。,(1)SAL算術(shù)左移指令指令格式:SAL目的,計(jì)數(shù)值(2)SHL邏輯左移指令指令格式:SHL目的,計(jì)數(shù)值,(3)SHR邏輯右移指令指令格式:SHR目的,計(jì)數(shù)值,(4)SAR算術(shù)右移指令指令格式:SAR目的,計(jì)數(shù)值,3.循環(huán)移位指令上述的算術(shù)邏輯移位指令,移出操作數(shù)的數(shù)位均被丟失,而循環(huán)移位指令把操作數(shù)從一端移到操作數(shù)的另一端,這樣從操作數(shù)中移走的位就不丟失了。,(1)ROL循環(huán)左移指令指令格式:ROL目的,計(jì)數(shù)值,,(2)ROR循環(huán)右移指令指令格式:ROR目的,計(jì)數(shù)值,,(3)RCL帶進(jìn)位的循環(huán)左移指令指令格式:RCL目的,計(jì)數(shù)值,(4)RCR帶進(jìn)位的循環(huán)右移指令指令格式:RCR目的,計(jì)數(shù)值,四、字符串處理指令,這里所謂的字符串是指一系列存放在存儲(chǔ)器中的字或字節(jié)數(shù)據(jù),不管它們是不是ASCII碼。字符串長度可達(dá)64K字節(jié),組成字符串的字節(jié)或字稱為字符串元素,每種字符串指令對(duì)字符串中的元素只進(jìn)行同一種操作。,字符串操作指令共有5條,其特點(diǎn)如下:,1.字符串傳送指令MOVSB/MOVSW指令格式:MOVSB目的串,源串或MOVSW目的串,源串,例3-75要求把數(shù)據(jù)段中以SRC_MESS為偏移地址的一串字符“HELLO!”,傳送到附加段中以NEW_LOC開始的單元中。實(shí)現(xiàn)該操作的程序如下:DATASEGMENT;數(shù)據(jù)段SRC_MESSDB‘HELLO’;源串DATAENDS;EXTRASEGMENT;附加段NEW_LOCDB6DUP(?);存放目的串EXTRAENDS;,CODESEGMENT;代碼段ASSUMECS:CODE,DS:DATA,ES:EXTRASTART:MOVAX,DATAMOVDS,AXMOVAX,EXTRAMOVES,AXLEASI,SRC_MESSLEADI,NEW_LOCMOVCX,6CLDREPMOVSBCODEENDSENDSTART,2.字符串比較指令CMPSB/CMPSW指令格式:CMPSB目的串,源串或CMPSW目的串,源串,例3-76比較兩個(gè)字符串,一個(gè)是你在程序中設(shè)定的口令串PASSWORD,另一個(gè)是從鍵盤輸入的字符串IN_WORD,若輸入串與口令串相同,程序?qū)㈤_始執(zhí)。否則,程序驅(qū)動(dòng)PC機(jī)的揚(yáng)聲器發(fā)聲,警告用戶口令不符,拒絕往下執(zhí)行。這可以用CMPSB指令來實(shí)現(xiàn),有關(guān)程序段如下:,DATASEGMENT;數(shù)據(jù)段/附加段PASSWORDDB‘1234EEL’;口令串IN_WORDDB‘1234ELR’;輸入串COUNTEQU7;串長度DATAENDS,CODESEGMENT;代碼段ASSUMEDS:DATA,ES:DATA┅LEASI,PASSWORD;源串指針LEADI,IN_WORD;目的串指針MOVCX,COUNT;串長度CLD;使DF=0,SI、DI自動(dòng)增加REPZCMPSB;CX≠0且串相同時(shí)重復(fù)JNZSOUND;若不相等,轉(zhuǎn)發(fā)聲程序OK:┅;比較完且相同,往下執(zhí)行┅SOUND:┅┅CODEENDS,3.字符串掃描指令SCASB/SCASW指令格式:SCASB目的串或SCASW目的串,MOVDI,OFFSETSTRING;DI=字符串偏移地址=0MOVCX,COUNT;CX=字符串長度MOVAL,’A’;AL=關(guān)鍵字A的ASCII碼CLD;DF=0,DI自動(dòng)加1REPNESCASB;CX≠0(沒查完)且不相同時(shí)重復(fù)JZFIND;若ZF=1,表示已搜索到,轉(zhuǎn)出MOVDI,0;若ZF=0,表示沒搜索到,則DI=0FIND:MOVBX,DI;搜索次數(shù)→BX┅★上述程序中,DI初值存起始地址偏移量0,搜索一次后DI自動(dòng)加1,使DI的值等于1,以后,每執(zhí)行一次搜索操作,DI自動(dòng)加1。所以,正好可用DI的值來表示搜索次數(shù)。,4.取字符串指令LODSB/LODSW指令格式:LODSB源串或LODSW源串,5.存字符串指令STOSB/STOSW指令格式:STOSB目的串或STOSW目的串,五、控制轉(zhuǎn)移指令通常,程序中的指令都是順序地逐條執(zhí)行的,在8086中,指令的執(zhí)行順序由CS和IP決定,每取出一條指令,指令指針I(yè)P自動(dòng)進(jìn)行調(diào)整,一條指令執(zhí)行完后,就從該指令之后的下一個(gè)存儲(chǔ)單元中取出新的指令來執(zhí)行。利用控制轉(zhuǎn)移指令可以改變CS和IP的值,從而改變指令的執(zhí)行順序。為滿足程序轉(zhuǎn)移的不同要求,8086提供了無條件轉(zhuǎn)移和過程調(diào)用、條件轉(zhuǎn)移、循環(huán)控制以及中斷等幾類指令,見下表。,,1.無條件轉(zhuǎn)移和過程調(diào)用指令,(1)JMP無條件轉(zhuǎn)移指令指令格式:JMP目的指令功能:使程序無條件地轉(zhuǎn)移到指令中指定的目的地址去執(zhí)行。,這類指令又分成兩種類型:,不論段內(nèi)還是段間轉(zhuǎn)移,就轉(zhuǎn)移地址提供的方式而言,又可分為兩種方式:,無條件轉(zhuǎn)移指令可分為:①段內(nèi)直接轉(zhuǎn)移②段內(nèi)間接轉(zhuǎn)移③段間直接轉(zhuǎn)移④段間間接轉(zhuǎn)移,①段內(nèi)直接轉(zhuǎn)移指令指令格式:JMPSHORT標(biāo)號(hào)JMPNEARPTR標(biāo)號(hào)或JMP標(biāo)號(hào),②段內(nèi)間接轉(zhuǎn)移指令指令格式:JMP16位寄存器JMPWORDPTR[存儲(chǔ)單元]這類指令轉(zhuǎn)向的16位有效地址存放在一個(gè)16位寄存器或字存儲(chǔ)單元中。,③段間直接(遠(yuǎn))轉(zhuǎn)移指令指令格式:JMPFARPTR標(biāo)號(hào),④段間間接轉(zhuǎn)移指令指令格式:JMPDWORDPTR[存儲(chǔ)單元],(2)過程調(diào)用和返回指令在編寫程序時(shí),往往把某些能完成特定功能而又經(jīng)常要用到的程序段,編寫成獨(dú)立的模塊,并把它稱為過程,習(xí)慣上也稱作子程序,然后在程序中用CALL語句來調(diào)用這些過程,調(diào)用過程的程序稱為主程序。,①段內(nèi)直接調(diào)用和返回例3-83CALLPROG_N;PROG_N是一個(gè)近標(biāo)號(hào)根據(jù)附錄B可知,該指令占3個(gè)字節(jié),機(jī)器碼格式為:,執(zhí)行CALL的過程為:●SP-2→SP,即新的SP=0100H-2=00FEH,●返回地址的IP入棧。,●根據(jù)當(dāng)前IP值和位移量DISP計(jì)算出新的IP值,作為子程序的入口地址。,RET指令的尋址方式與CALL指令的尋址方式一致,在本例中是段內(nèi)直接調(diào)用,所以過程PROG_N中的RET指令將執(zhí)行如下操作:,●(SP+1,SP)單元內(nèi)容→IP,IP=1053H,●SP+2→SP,即新的SP=0100H,②段內(nèi)間接調(diào)用和返回例3-84CALLBXCALLWORDPTR[BX],它們執(zhí)行的操作分三步進(jìn)行,具體為:SP-2→SP;CALL指令的下一條指令的IP入棧;BX→IP或[DS:BX]單元字內(nèi)容→IP;,對(duì)應(yīng)的RET指令執(zhí)行的操作與段內(nèi)直接過程的返回指令相類似。,③段間直接調(diào)用例3-85CALLFARPTRPROG_F;遠(yuǎn)標(biāo)號(hào)該指令占5個(gè)字節(jié),編碼格式為:,執(zhí)行遠(yuǎn)調(diào)用CALL指令的過程為:,●SP-2→SP,然后返回地址段地址CS=1000H入棧;,●SP-2→SP,然后返回地址偏移地址IP=205FH入棧;,●轉(zhuǎn)子程序入口,將PROG_F的段地址和偏移地址分別送到CS和IP寄存器。即3000H→CS,0500H→IP,●執(zhí)行子程序,過程PROG_F中的RET指令的尋址方式也是段間直接調(diào)用,返回時(shí)執(zhí)行的操作為:,●SP+2→SP,然后將棧中內(nèi)容205FH→IP;●SP+2→SP,然后將棧中內(nèi)容1000H→CS;所以程序?qū)⒎祷氐紺S:IP=1000:205FH處即CALL指令的下一條指令處繼續(xù)執(zhí)行。,④段間間接調(diào)用這類調(diào)用指令的操作數(shù)必須是存儲(chǔ)單元,從該單元開始存放的雙字表示過程的入口地址,其中前2個(gè)字節(jié)是偏移量IP,后兩個(gè)字節(jié)是代碼段地址CS。指令中用DWORDPTR說明是對(duì)存儲(chǔ)單元進(jìn)行雙字操作。,2.條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令是根據(jù)上一條指令執(zhí)行后,CPU設(shè)置的狀態(tài)標(biāo)志作為判別測(cè)試條件來決定是否轉(zhuǎn)移。每一種條件轉(zhuǎn)移指令都有它的測(cè)試條件,當(dāng)條件成立,便控制程序轉(zhuǎn)向指令中給出的目的地址,去執(zhí)行那里的指令,否則,程序仍順序執(zhí)行。,條件轉(zhuǎn)移指令通常用在比較指令或算術(shù)運(yùn)算指令之后,根據(jù)比較或運(yùn)算結(jié)果,轉(zhuǎn)向不同的目的地址。在指令中,目的地址均用標(biāo)號(hào)表示,因此指令的格式為:條件操作符標(biāo)號(hào),條件轉(zhuǎn)移指令共有18條,可以歸類成以下兩大類:,(1)直接標(biāo)志轉(zhuǎn)移指令這類轉(zhuǎn)移指令在指令助記符中直接給出標(biāo)志狀態(tài)的測(cè)試條件,它們以CF,ZF,SF,OF和PF等5個(gè)標(biāo)志的10種狀態(tài)為判斷的條件,共形成10條指令。,例3-87求AL和BL寄存器中的兩數(shù)之和,若有進(jìn)位,則AH置1,否則AH清0。可用如下程序段來實(shí)現(xiàn)該操作:ADDAL,BL;兩數(shù)相加JCNEXT;若有進(jìn)位,轉(zhuǎn)NEXTMOVAH,0;無進(jìn)位,AH清0JMPEXIT;往下執(zhí)行NEXT:MOVAH,1;有進(jìn)位,AH置1EXIT:┅;程序繼續(xù)進(jìn)行,(2)間接標(biāo)志轉(zhuǎn)移這類指令的助記符中不直接給出標(biāo)志狀態(tài)位的測(cè)試條件,但仍以某一個(gè)標(biāo)志的狀態(tài)或幾個(gè)標(biāo)志的狀態(tài)組合,作為測(cè)試的條件,若條件成立則轉(zhuǎn)移,否則程序順序往下執(zhí)行。間接標(biāo)志轉(zhuǎn)移指令共有8條,列于下表中。每條指令都有兩種不同的助記符,中間用‘/’隔開。,3.循環(huán)控制指令循環(huán)控制指令是一組增強(qiáng)型的條件轉(zhuǎn)移指令,用來控制一個(gè)程序段的重復(fù)執(zhí)行,重復(fù)次數(shù)由CX寄存器中的內(nèi)容決定。這類指令的長度均2個(gè)字節(jié),第一字節(jié)是操作碼,第二字節(jié)是8位位移量,轉(zhuǎn)移的目標(biāo)都是短標(biāo)號(hào)。,(1)LOOP循環(huán)指令指令格式:LOOP短標(biāo)號(hào),例3-92將位于DS段連續(xù)的100個(gè)字節(jié)的單元內(nèi)容都加1,其中第一個(gè)字節(jié)單元的偏移地址由SI來指定。程序段如下:┋MOVCX,100;共100個(gè)字節(jié)JIA1:ADD[SI],1INCSILOOPJIA1┋,(2)LOOPE/LOOPZ相等或結(jié)果為0循環(huán)指令格式:LOOPE短標(biāo)號(hào)或LOOPZ短標(biāo)號(hào),例3-94設(shè)以SSS開始的內(nèi)存單元中存放了100個(gè)字節(jié)的數(shù)據(jù),編程要求找出其中第一個(gè)非0元素,并記下其偏移地址送到DI中,若全是0,則將DI清0。,(3)LOOPNE/LOOPNZ不相等或結(jié)果不為0循環(huán)指令格式:LOOPNE短標(biāo)號(hào)或LOOPNZ短標(biāo)號(hào),(4)JCXZ若CX為0跳轉(zhuǎn)指令格式:JCXZ短標(biāo)號(hào),4.中斷指令在第八章將詳細(xì)介紹。,六、處理器控制指令,1.標(biāo)志操作指令除了有些指令執(zhí)行后會(huì)影響標(biāo)志位外,8086還提供了一組標(biāo)志操作指令,它們可直接對(duì)CF、DF和IP標(biāo)志位進(jìn)行置1或清0等操作,但不包含TF標(biāo)志。指令執(zhí)行后不影響其他標(biāo)志,只影響本指令指定的標(biāo)志,這些指令的功能和名稱如下表所示。,2.外部同步指令我們前面講過,8086系統(tǒng)可以工作在最大模式,即系統(tǒng)中還有其他微處理器或8086微處理器,為了充分發(fā)揮硬件的功能,設(shè)置了3條使CPU與其他協(xié)處理器同步工作的指令,以便共享系統(tǒng)資源,這幾條指令執(zhí)行后均不影響標(biāo)志位。,(1)ESC換碼指令指令格式:ESC外部操作碼,源操作數(shù)指令功能:換碼指令用來實(shí)現(xiàn)8086對(duì)協(xié)處理器8087的控制。,(2)WAIT等待指令等待指令WAIT通常跟在ESC指令之后,CPU執(zhí)行ESC指令后,表示8086CPU正處于等待狀態(tài),它不斷檢測(cè)8086的測(cè)試引腳,每隔5個(gè)時(shí)鐘周期檢測(cè)一次,若此引腳為高電平,則重復(fù)執(zhí)行WAIT指令,處理器處于等待狀態(tài)。一旦引腳上的信號(hào)變?yōu)榈碗娖剑阃顺龅却隣顟B(tài),執(zhí)行下條指令。,(3)LOCK封鎖總線指令它是一種前綴,可加在任何指令的前端用來維持8086的總線封鎖信號(hào)有效,凡帶有LOCK前綴的指令在執(zhí)行過程中,將禁止其它處理器使用總線。,3.停機(jī)指令和空操作指令,(1)HLT停機(jī)指令它使CPU進(jìn)入暫停狀態(tài),不進(jìn)行任何操作,只有當(dāng)下列情況之一發(fā)生時(shí),CPU才脫離暫停狀態(tài):,●在RESET線上加復(fù)位信號(hào);,●在NMI(不可屏蔽中斷)引腳上出現(xiàn)中斷請(qǐng)求信號(hào);,●在允許中斷的情況下,在INTR引腳上出現(xiàn)中斷請(qǐng)求信號(hào);,在程序中,通常用HLT指令來等待中斷的出現(xiàn)。,(2)NOP空操作指令不完成任何操作,只是簡(jiǎn)單的延時(shí)。執(zhí)行一條NOP需3個(gè)時(shí)鐘周期。,七、指令的執(zhí)行時(shí)間和軟件延時(shí)每條指令的執(zhí)行都需要固定的時(shí)間,我們可以通過計(jì)算指令的執(zhí)行時(shí)間來實(shí)現(xiàn)軟件延時(shí)。,- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 尋址 方式 指令系統(tǒng) 修改
鏈接地址:http://appdesigncorp.com/p-12676294.html