




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 微原指令一、立即尋址方式 所提供的操作數(shù)直接包含在指令中。它緊跟在操作碼的后面,與操作碼一起放在代碼段區(qū)域中,如圖所示。 例如: MOV CX,2A50H 立即尋址方式的指令常用來給寄存器賦初值。立即數(shù)不但可以送到寄存器中,還可以送到一個(gè)存儲(chǔ)單元(8位)中或兩個(gè)連續(xù)的存儲(chǔ)單元(16位)中去。在所有的指令中,立即數(shù)只能作源操作數(shù),不能作目的操作數(shù)。另外要注意,以AF打頭的數(shù)字出理在指令中時(shí),前面一定要加一個(gè)數(shù)字0,以免與其它符號(hào)相混淆。如將立即FF00H送到AX的指令必須寫成如下形式: MOV AX,0FF00H二、寄存器尋址方式 在這種尋址方式下,操作數(shù)包含在寄存器中,由指令指定寄存器的名稱
2、。對(duì)于16位操作數(shù),寄存器可以是AX、BX、CX、DX,SI、D1、SP和BP等。對(duì)于8位操作數(shù),則用寄存器AH、AL、BH、BL、CH、CL、DH和DL。 例如:MOV DX,AX MOV CL,AH注意:源操作數(shù)的長(zhǎng)度必須與目的操作數(shù)一致,否則會(huì)出錯(cuò)。例如,不能將AH寄存器的內(nèi)容傳送到CX中去,盡管CX寄存器放得下AH的內(nèi)容,但匯編程序不知道將它放到CH還是CL中。這種尋址方式的優(yōu)點(diǎn)是:寄存器數(shù)量一般在幾個(gè)到幾十個(gè),比存儲(chǔ)器單元少很多,因此它的地址碼短,從而縮短了指令長(zhǎng)度,節(jié)省了程序存儲(chǔ)空間;另一方面,從寄存器里取數(shù)比從存儲(chǔ)器里取數(shù)的速度快得多,從而提高了指令執(zhí)行速度。三、直接尋址方式1.
3、直接尋址方式在IBM PC機(jī)中,把操作數(shù)的偏移地址稱為有效地址EA。使用直接尋址方式的指令時(shí),存儲(chǔ)單元的有效地址直接由指令給出,在它們的機(jī)器碼中,有效地址存放在代碼段中指令的操作碼之后。而該地址單元中的數(shù)據(jù)總是存放在存儲(chǔ)器中,所以必須先求出操作數(shù)的物理地址,然后再訪問存儲(chǔ)器,才能取得操作數(shù)。當(dāng)采用直接尋址指令時(shí),如果指令中沒有用前綴指明操作數(shù)存放在哪一段,則默認(rèn)為使用的段寄存器為數(shù)據(jù)段寄存器DS,操作數(shù)的物理地址16DSEA10HDSEA。 指令中有效地址上必須加一個(gè)方括號(hào),以便與立即數(shù)相區(qū)別。例如:MOV AX,2000H MOV AL,2000H2.段超越前綴 如果要對(duì)代碼段、堆棧段或附加
4、段寄存器所指出的存儲(chǔ)區(qū)進(jìn)行直接尋址,應(yīng)在指令中指定段超越前綴。例如,數(shù)據(jù)若放在附加段中,則應(yīng)在有效地址前加“ES:”,這里的冒號(hào)“:”稱為修改屬性運(yùn)算符,計(jì)算物理地址時(shí)要用ES作基地址,而不再是默認(rèn)值DS。 例如: MOV AX,ES:500H該指令的源操作數(shù)的物理地址等于16ES500H。 2.段超越前綴如果要對(duì)代碼段、堆棧段或附加段寄存器所指出的存儲(chǔ)區(qū)進(jìn)行直接尋址,應(yīng)在指令中指定段超越前綴。例如,數(shù)據(jù)若放在附加段中,則應(yīng)在有效地址前加“ES:”,這里的冒號(hào)“:”稱為修改屬性運(yùn)算符,計(jì)算物理地址時(shí)要用ES作基地址,而不再是默認(rèn)值DS。 例如: MOV AX,ES:500H該指令的源操作數(shù)的物
5、理地址等于16ES500H。 符號(hào)地址 在匯編語言中還允許用符號(hào)地址代替數(shù)值地址,實(shí)際上就是給存儲(chǔ)單元起一個(gè)名字,這樣,如果要與這些單元打交道,只要使用其名字即可,不必記住具體數(shù)值是多少。例如: MOV AX,AREA1 光從指令的形式上看,AREAl不僅可代表符號(hào)地址,也可以表示它是一個(gè)16位的立即數(shù),兩者之間究竟如何來區(qū)別呢?程序中還必須事先安排說明語句也叫做偽指令來加以說明。例如:AREA1 EQU 0867H MOV AX,AREA1例如:AREA1 DW 0867H MOV AX,AREA1 (該指令也可寫為 MOV AX,AREA1)符號(hào)地址也允許段超越,下面兩條指令是等價(jià)的,即:
6、 MOV AX,ES:AREA1 MOV AX,ES:AREA1源操作數(shù)的物理地址16ESAREA1四、寄存器間接尋址 指令中給出的寄存器中的值不是操作數(shù)本身,而是操作數(shù)的有效地址,這種尋址方式稱為寄存器間接尋址。寄存器名稱外面必須加方括號(hào),以與寄存器尋址方式相區(qū)別。這類指令中使用的寄存器有基址寄存器BX、BP及變址寄存器SI、DI。如果指令中指定的寄存器是BX、SI或DI,則默認(rèn)操作數(shù)存放在數(shù)據(jù)段中,這時(shí)要用數(shù)據(jù)段寄存器DS的內(nèi)容作為段地址,操作數(shù)的物理地址由DS左移4位后與BX、SI或Dl相加形成。例如:MOV BX,SI設(shè)DS1000H,SI2000H,(12000H)=318BH則物理
7、地址16DSSI10000H2000H12000H如果指令中用寄存器BP進(jìn)行間接尋址,則默認(rèn)操作數(shù)在堆棧段中,操作數(shù)的段地址在寄存器SS中,操作數(shù)的物理地址16SSBP。 指令也可以指定段超越前綴來從默認(rèn)段以外的段中取得數(shù)據(jù)。 這種尋址方式一般用于訪問表格,執(zhí)行完一條指令后,通過修改SI、DI、BX或BP的內(nèi)容就可訪問到表格的下一數(shù)據(jù)項(xiàng)的存儲(chǔ)單元。如果指令中用寄存器BP進(jìn)行間接尋址,則默認(rèn)操作數(shù)在堆棧段中,操作數(shù)的段地址在寄存器SS中,操作數(shù)的物理地址16SSBP。指令也可以指定段超越前綴來從默認(rèn)段以外的段中取得數(shù)據(jù)。這種尋址方式一般用于訪問表格,執(zhí)行完一條指令后,通過修改SI、DI、BX或B
8、P的內(nèi)容就可訪問到表格的下一數(shù)據(jù)項(xiàng)的存儲(chǔ)單元。五、寄存器相對(duì)尋址方式 操作數(shù)的有效地址是一個(gè)基址或變址寄存器的內(nèi)容與指令中指定的8位或16位位移量之和。這種尋址方式與寄存器間接尋址十分相似,主要區(qū)別是前者在有效地址上還要加一個(gè)位移量。同樣,當(dāng)指令中使用 BX、SI或DI寄存器時(shí),段寄存器使用DS,當(dāng)指定寄存器是BP時(shí),段寄存器使用SS。例如:MOV BX,COUNTSI六、基址變址尋址方式 操作數(shù)的有效地址是一個(gè)基址寄存器(BX或BP)和一個(gè)變址寄存器(SI或DI)的內(nèi)容之和,兩個(gè)寄存器均由指令指定。若:基址寄存器為BX時(shí),段址寄存器用DS 則:物理地址16DS十BX十SI 或 16DSBX十
9、DI 若:基址寄存器為BP時(shí),段址寄存器應(yīng)用SS 則:物理地址16SS十BPSI 或 16SS十BP十DI例如: MOV AX, BXSI設(shè): DS3000H,BX1200H,SI0500H,(31700H)0ABCDH則: 物理地址16DS十BX十SI 30000H1200H0500H 31700H 執(zhí)行結(jié)果AX0ABCDH。 指令中的方括號(hào)有相加的意思,上述指令也可以寫成:MOV AX, BXSI七、相對(duì)基址變址尋址方式 操作數(shù)的有效地址是一個(gè)基址寄存器和一個(gè)變址寄存器的內(nèi)容,再加上指令中指定的8位或16位位移量之和。若:基址寄存器為BX時(shí),用DS作段寄存器則:物理地址l6DS十BX十SI
10、8位或16位位移量或 l6DS十BX十DI8位或16位位移量。若:基址寄存器為BP時(shí),用SS作段寄存器則:物理地址l6DS十BP十SI8位或16位位移量或l6DS十BP十DI8位或16位位移量例如:MOV AX,MASKBXSI設(shè):DS=2000H,BX=1500H,SI0300H, MASK0200H,(21A00H)=26BFH則:物理地址=16DSBXSIMASK20000H1500H0300H+0200H21A00H執(zhí)行結(jié)果,AX26BFH。同樣,上述指令也可寫成: MOV AX,MASKBXSIMOV AX,200HBXSIMOV AX,MASKBXSI八、其它1. 隱含尋址 指令中
11、不指明操作數(shù),但有隱含規(guī)定的尋址方式,例如指令DAA,它的含義是對(duì)寄存器AL中的數(shù)據(jù)進(jìn)行十進(jìn)制數(shù)調(diào)整,結(jié)果仍保留在AL中。2. I/O端口尋址 8086有直接端口和間接端口兩種尋址方式。在直接端口尋址方式中,端口地址由指令直接提供,它是一個(gè)8位立即數(shù)。由于一個(gè)8位二進(jìn)制數(shù)的最大值為255,所以在這種尋址方式中,能訪問的端口號(hào)為00FFH,即256個(gè)端口。例如:IN AL,63H在間接尋址方式中,被尋址的端口號(hào)由寄存器DX提供,這種尋址方式能訪問多達(dá)64K個(gè)I/O端口,端口號(hào)為00000FFFFH。例如:MOV DX,213H IN AL,DX 3.一條指令有幾種尋址方式 上面介紹的各種尋址方式
12、都是針對(duì)源操作數(shù)的,目的操作數(shù)均用寄存器來表示。實(shí)際上,目的操作數(shù)也可以用除立即尋址方式以外的所有尋址方式指定,許多指令還具有各自的隱含規(guī)則,所以一條指令可能包含幾種尋址方式。例如:MOV BX,AL設(shè):BX3600H,DI1000H,AL05H目的操作數(shù)的物理地址16DS十BX10000H十3600H13600H指令執(zhí)行結(jié)果為(13600H)05H。 1) 通用傳送指令MOV 可實(shí)現(xiàn)寄存器之間、寄存器和存儲(chǔ)器之間傳送數(shù)據(jù),還可實(shí)現(xiàn)將立即數(shù)送至寄存器或存儲(chǔ)單元的操作。 匯編格式:MOV 目的操作數(shù),源操作數(shù) 執(zhí)行的操作:(目的操作數(shù))源操作數(shù) 功能:將源操作數(shù)存入目的操作數(shù)的寄存器或存儲(chǔ)單元中
13、去。 注意: 目的操作數(shù)不能是立即尋址方式。 源操作數(shù)與目的操作數(shù)不能同時(shí)為存儲(chǔ)器尋址方式,即兩個(gè)內(nèi)存單元之間不能直接傳送數(shù)據(jù)。 立即數(shù)不能直接送段寄存器,即段寄存器只能通過寄存器或存儲(chǔ)單元傳送數(shù)據(jù)。 兩個(gè)段寄存器之間不允許直接傳送數(shù)據(jù)。 不允許給CS、IP、PSW三個(gè)寄存器傳送數(shù)據(jù),即這3個(gè)寄存器的值用戶無權(quán)改變。 源操作數(shù)和目的操作數(shù)必須字長(zhǎng)相等。 MOV指令不影響標(biāo)志位。例:DATA是用戶定義的一個(gè)數(shù)據(jù)段的段名。則:MOV AX,DATAMOV DS,AX兩條指令完成對(duì)DS段寄存器的賦值。若寫成:MOV DS,DATA則是錯(cuò)誤的。如果把CPU內(nèi)部的寄存器細(xì)分為段寄存器和寄存器的話,則MO
14、V指令有九種形式: 從寄存器到寄存器; 從寄存器到段寄存器; 從寄存器到存儲(chǔ)器; 從段寄存器到寄存器; 從存儲(chǔ)器到寄存器; 從段寄存器到存儲(chǔ)器; 從存儲(chǔ)器到段寄存器; 從立即數(shù)到寄存器; 從立即數(shù)到存儲(chǔ)器。MOV指令的九種形式如下圖所示。 MOV指令的九種形式說明:寄存器尋址有直接、寄存器間接、寄存器相對(duì)、基址變址和相對(duì)基址變址五種存儲(chǔ)器尋址方式。2) 進(jìn)棧指令PUSH及出棧指令POP 堆棧是由若干個(gè)連續(xù)存儲(chǔ)單元組成的“后進(jìn)先出”或“先進(jìn)后出”存儲(chǔ)區(qū)域,它的段地址存于SS寄存器中,它只有一個(gè)數(shù)據(jù)出入口,堆棧指針寄存器SP任何時(shí)候都指向當(dāng)前的棧頂,入棧出棧都必須通過SP來確定。如果有數(shù)據(jù)PUSH
15、壓入或POP彈出,SP必須及時(shí)修改,以保證(SP)始終指向當(dāng)前的棧頂位置。 在子程序調(diào)用和中斷處理過程中,分別需要保存返回地址和斷點(diǎn)地址,即將當(dāng)前CS和IP的值壓棧;在進(jìn)入子程序和中斷處理后,還需要保存通用寄存器的值;子程序和中斷處理程序?qū)⒁祷貢r(shí),則要恢復(fù)通用寄存器的值;子程序和中斷處理程序返回時(shí),要將返回地址或斷點(diǎn)地址出棧。這些功能都要通過堆棧指令來實(shí)現(xiàn)。 PUSH指令匯編格式:PUSH源操作數(shù)執(zhí)行的操作:(SP)(SP)2 先修改指針 (SP)+1,(SP)操作數(shù)功能:將16位寄存器、段寄存器、16位存儲(chǔ)單元數(shù)據(jù)壓入堆棧。 POP指令匯編格式:POP目的操作數(shù)執(zhí)行操作:(操作數(shù))(SP)
16、+1,(SP) (SP)(SP)+2 后修改指針功能:將堆棧中的16位數(shù)據(jù)送入16位寄存器、段寄存器、16位存儲(chǔ)單元中。說明: 在8086/8088中,PUSH、POP指令的操作數(shù)不能使用立即尋址方式。POP指令的操作數(shù)還不能使用CS寄存器。 堆棧中數(shù)據(jù)的壓入、彈出必須以字為單位,所以PUSH和POP指令只能作字操作。 這兩條堆棧指令不影響標(biāo)志位。例 : MOV AX,1234H PUSH AX 設(shè)執(zhí)行前(SS)=2000H, (SP)=00FEH,指令執(zhí)行過程如下圖所示,執(zhí)行后(SS)=2000H, (SP)=00FCH。3) PUSHF指令。匯編格式:PUSHF執(zhí)行的操作:(SP)(SP)
17、2 (SP)+1,(SP)PSW功能:將標(biāo)志寄存器內(nèi)容壓入堆棧。4) POPF指令匯編格式:POPF執(zhí)行的操作:(PSW)(SP)+1,(SP) (SP)(SP)+2功能:將16位堆棧數(shù)據(jù)彈出送入標(biāo)志寄存器中。說明:8086/8088指令系統(tǒng)中沒有設(shè)置改變TF標(biāo)志位的指令。若要改變TF值,先用PUSHF指令將標(biāo)志壓棧,然后設(shè)法改變對(duì)應(yīng)TF標(biāo)志位的位值,再用POPF指令彈出送給PSW,即可完成改變PSW中TF標(biāo)志位的值。 例:若想設(shè)置TF=1,程序段如下:PUSHFPOP AXOR AH,01H ;修改TF位PUSH AXPOPF5) XCHG指令 互換指令XCHG可以實(shí)現(xiàn)字互換或字節(jié)互換。互換
18、可以在寄存器之間進(jìn)行,也可以在寄存器和存儲(chǔ)單元之間進(jìn)行。 匯編格式:XCHG 目的操作數(shù),源操作數(shù) 執(zhí)行的操作:互換源、目的兩個(gè)操作數(shù)的存放位置。說明: 源、目的操作數(shù)的尋址方式不允許是立即尋址方式。 兩個(gè)尋址方式中,必須有一個(gè)是寄存器尋址,即兩個(gè)存儲(chǔ)單元之間不能直接互換數(shù)據(jù)。 所有的段寄存器以及IP寄存器不允許使用本條指令與其他寄存器互換數(shù)據(jù)。 此指令不影響標(biāo)志位。例 XCHG BX,BP+SI 指令執(zhí)行前,(BX)=1234H,(BP)=0100H,(SI)=0020H,(SS)=1F00H,(1F120H)=0000H,則源操作數(shù)物理地址=1F00H10H+0100H+0020H =1F
19、00H10H+0120H=1F120H指令執(zhí)行后:(BX)=0000H,(1F120H)=1234H 3) XLAT換表指令匯編格式:XLAT或XLAT 轉(zhuǎn)換表執(zhí)行的操作:(AL)(BX)+(AL)說明: XLAT指令是將AL的內(nèi)容替換成存儲(chǔ)單元中的一個(gè)數(shù),往往用于代碼轉(zhuǎn)換,例如,把字符的掃描碼轉(zhuǎn)換成ASCII碼或者把十六進(jìn)制數(shù)0F轉(zhuǎn)換成七段數(shù)碼管顯示代碼。使用此指令前,先在數(shù)據(jù)段建立一個(gè)表格,表格首地址存入BX寄存器,欲取代碼的表內(nèi)位移量存入AL寄存器中。XLAT指令將(AL)值擴(kuò)展成16位,與(BX)相加形成一個(gè)段偏移地址,段地址取(DS),據(jù)此讀出代碼送入AL寄存器。 該指令有兩種格式,
20、第二種格式中的地址標(biāo)號(hào)是指代碼表的表首地址。它只是為提高程序可讀性而設(shè)置的,指令執(zhí)行時(shí)只使用預(yù)先存入BX中的代碼表首地址,而并不用匯編格式中指定的地址標(biāo)號(hào)。 (AL)是一個(gè)8位無符號(hào)數(shù),所以表格中最多只能存放256個(gè)代碼。 此指令的執(zhí)行結(jié)果不影響標(biāo)志位?!纠?-21】 一個(gè)七段LED顯示代碼轉(zhuǎn)換表存于TABLE開始的存儲(chǔ)區(qū),則TABLE DB 40H,79H,24H,30H,19H DB 12H,02H,78H,00H,18H . . . MOVAL,4 MOVBX,OFFSETTABLE XLAT 完成了將4 BCD碼轉(zhuǎn)換成七段LED顯示代碼的工作。2. 輸入輸出指令 這類指令都僅限于I/O
21、端口或存儲(chǔ)單元與累加器AL(AX)之間傳送數(shù)據(jù)。具體包括IN輸入指令、OUT輸出指令。 1) IN輸入指令 匯編格式: IN AL,端口地址表達(dá)式或IN AX,端口地址表達(dá)式 IN AL,DX ;端口地址存放在DX寄存器中 或 IN AX,DX 執(zhí)行的操作:AL(端口地址表達(dá)式)或AX(端口地址表達(dá)式+1),(端口地址表達(dá)式) 說明: 該指令的目的操作數(shù)僅限于累加器,即8位操作采用AL,16位操作采用AX,不能由其他任何寄存器代替。 如果I/O尋址的口地址號(hào)在8位以內(nèi),可以用直接尋址方式,地址表達(dá)式則由一個(gè)8位立即數(shù)表示;如果I/O尋址的口地址號(hào)在16位以內(nèi),可以用寄存器間接尋址方式,所尋址的
22、地址口號(hào)則裝入DX,間接尋址僅可以使用DX。2) OUT輸出指令 匯編格式 OUT 地址表達(dá)式,AL或 OUT 地址表達(dá)式,AX OUT DX,AL ;DX端口地址或 OUT DX,AX執(zhí)行的操作:端口地址(AL)或 (端口地址+1),(端口地址)(AX) 1) LEA取有效地址指令匯編格式:LEA 16位寄存器名,存儲(chǔ)器尋址方式執(zhí)行的操作:(16位寄存器)源操作數(shù)的偏移地址說明: 這條指令常用在初始化程序段中使一個(gè)寄存器成為指針。 16位寄存器不包括段寄存器。 這條指令不影響標(biāo)志位。例 LEA BX,TABLE TABLE是數(shù)據(jù)段中定義的地址標(biāo)號(hào),指令執(zhí)行前,如果(BX)=0000H,(DS
23、)=2000H,TABLE=20020H,則指令執(zhí)行后,(BX)=0020H。2) LDS指針?biāo)椭付拇嫫骱虳S寄存器指令 匯編格式:LDS 16位寄存器名,存儲(chǔ)器尋址方式 執(zhí)行的操作:將尋址到的存儲(chǔ)單元的第一個(gè)源操作數(shù)(字)送16位寄存器,第二個(gè)源操作數(shù)(字)送DS寄存器。說明: 本條指令中的16位寄存器不允許是段寄存器。 本條指令不影響標(biāo)志位。例 LDS AX,TABLESI假設(shè)(20050H)=12345678H,指令執(zhí)行前,如果(AX)=0000H,(DS)=2000H,TABLE=0020H,(SI)=0030H,則物理地址=20000H+0020H+0030H=20050H;指令執(zhí)
24、行后,(AX)=5678H,(DS)=1234H。3) LES指針?biāo)椭付拇嫫骱虴S寄存器指令 匯編格式:LES 16位寄存器名,存儲(chǔ)器尋址方式 執(zhí)行的操作:將尋址到的存儲(chǔ)單元的第一個(gè)源操作數(shù)(字)送16位寄存器,第二個(gè)源操作數(shù)(字)送ES寄存器。說明: 16位寄存器不允許是段寄存器。 本條指令不影響標(biāo)志位。 4. 標(biāo)志傳送指令這組指令包括LAHF標(biāo)志送AH和SAHF AH送標(biāo)志寄存器。1) LAHF標(biāo)志送AH指令匯編格式:LAHF執(zhí)行的操作:(AH)(PSW的低8位)說明:此指令具體操作如下圖所示。2) SAHF AH送標(biāo)志寄存器指令匯編格式:SAHF執(zhí)行的操作:(PSW的低8位)(AH)3
25、.3.2算術(shù)運(yùn)算指令 算術(shù)運(yùn)算指令包括二進(jìn)制數(shù)的運(yùn)算及十進(jìn)制數(shù)的運(yùn)算指令。算術(shù)運(yùn)算指令用來執(zhí)行加、減、乘、除算術(shù)運(yùn)算,它們有雙操作數(shù)指令,也有單操作數(shù)指令,單操作數(shù)指令不允許使用立即尋址方式。乘法和除法指令的目的操作數(shù)采用隱含尋址方式,匯編指令只指定源操作數(shù),源操作數(shù)不允許使用立即尋址方式。雙操作數(shù)指令不允許目的操作數(shù)為立即尋址,不允許兩個(gè)操作數(shù)同時(shí)為存儲(chǔ)器尋址。另外,不論是雙操作數(shù)還是單操作數(shù),都不允許使用段寄存器。段寄存器只能被傳送、壓棧、出棧。特別要強(qiáng)調(diào)的是,當(dāng)匯編程序無法確定指令中操作數(shù)的長(zhǎng)度時(shí),必須用BYTE PTR、WORD PTR、DWORD PTR偽指令來指定操作數(shù)的長(zhǎng)度。1)
26、 ADD加法指令匯編格式:ADD目的操作數(shù),源操作數(shù)執(zhí)行的操作:(目的操作數(shù))源操作數(shù)+目的操作數(shù)2) ADC帶進(jìn)位加法指令匯編格式:ADC目的操作數(shù),源操作數(shù)執(zhí)行的操作:(目的操作數(shù))源操作數(shù)+目的操作數(shù)+CF3) INC增量指令匯編格式:INC操作數(shù)執(zhí)行的操作:(操作數(shù))操作數(shù)+1以上三條指令都可作字或字節(jié)運(yùn)算,除INC指令不影響CF標(biāo)志位外,其他標(biāo)志位都受指令操作結(jié)果的影響。 PSW中的標(biāo)志位共有9位,其中最主要的是ZF、SF、CF、OF四位。ZF表示結(jié)果是否為零,SF表示結(jié)果的符號(hào)位,CF表示最高有效位是否有向更高位的進(jìn)位,OF表示結(jié)果是否溢出。對(duì)加法指令來講,如果操作數(shù)是無符號(hào)數(shù),則
27、最高有效位有向更高位的進(jìn)位說明運(yùn)算結(jié)果超出了機(jī)器位數(shù)所能表示的最大數(shù)。因此,CF標(biāo)志位實(shí)質(zhì)上是表示無符號(hào)數(shù)有無溢出。而OF標(biāo)志位表示有符號(hào)數(shù)有無溢出。例 : 完成雙字長(zhǎng)相加,被加數(shù)存放在DX與AX中,加數(shù)放在BX與CX中,和放在DX與AX中。程序段如下:ADDAX,CXADCDX,BX ;高位運(yùn)算時(shí)要考慮低位的進(jìn)位1) SUB減法指令匯編格式:SUB目的操作數(shù),源操作數(shù)執(zhí)行的操作:(目的操作數(shù))目的操作數(shù)源操作數(shù)2) SBB帶借位減法指令匯編格式:SBB目的操作數(shù),源操作數(shù)執(zhí)行的操作:(目的操作數(shù))目的操作數(shù)源操作數(shù)CF3) DEC減量指令匯編格式:DEC操作數(shù)執(zhí)行的操作:(操作數(shù))操作數(shù)14
28、) NEG求補(bǔ)指令匯編格式:NEG操作數(shù)執(zhí)行的操作:(操作數(shù))0操作數(shù)說明: 0操作數(shù) = 操作數(shù),在微型計(jì)算機(jī)中,帶符號(hào)的二進(jìn)制數(shù)值數(shù)據(jù)都采用補(bǔ)碼編碼,因此,此處的操作數(shù)是補(bǔ)碼,所以求負(fù)的操作數(shù)實(shí)質(zhì)上是求補(bǔ)操作。 只有當(dāng)操作數(shù)為0時(shí)求補(bǔ)運(yùn)算的結(jié)果使CF=0,其他情況則均為1;只有當(dāng)操作數(shù)為128或32768時(shí)使OF=1,其他情況則均為05) CMP比較指令匯編格式:CMP目的操作數(shù),源操作數(shù)執(zhí)行的操作:目的操作數(shù)源操作數(shù)。說明:本條指令相減結(jié)果不保存,只是根據(jù)結(jié)果設(shè)置標(biāo)志位。在實(shí)際應(yīng)用中,CMP指令后往往跟著一個(gè)條件轉(zhuǎn)移指令,根據(jù)比較結(jié)果產(chǎn)生不同的分支。 以上五條指令都可作字或字節(jié)運(yùn)算。另外
29、,除DEC指令不影響CF標(biāo)志位外,其他指令都對(duì)標(biāo)志位有影響。減法指令對(duì)標(biāo)志位的影響與加法指令類似,所不同的是CF位。前面說過,CF表示機(jī)器的最高有效位有向更高位的進(jìn)位。對(duì)減法指令來講,恰好相反,若機(jī)器最高有效位沒有向更高位的進(jìn)位時(shí),CF=1,否則CF=0。對(duì)用戶來講,減數(shù)大于被減數(shù),此時(shí)有借位則CF=1,否則CF=0。例: 完成雙字長(zhǎng)相減操作,被減數(shù)存放在DX與AX中,減數(shù)存放在BX與CX中,差放在DX和AX中。程序段如下:SUB AX,CX SBB DX,BX3. 乘法指令 乘法指令可對(duì)字節(jié)、字進(jìn)行操作,且可對(duì)有符號(hào)數(shù)整數(shù)或無符號(hào)數(shù)整數(shù)進(jìn)行操作。兩個(gè)8位數(shù)相乘,結(jié)果為16位數(shù);兩個(gè)16位數(shù)相
30、乘,結(jié)果為32位數(shù)。乘法指令有兩條。1) MUL無符號(hào)數(shù)乘法指令匯編格式:MUL源操作數(shù)執(zhí)行的操作:若為字節(jié)操作 (AX)(AL)源操作數(shù)若為字操作 (DX), (AX)(AX)源操作數(shù)2) IMUL有符號(hào)數(shù)乘法指令 匯編格式:IMUL源操作數(shù)執(zhí)行的操作:與MUL相同,只是處理的數(shù)據(jù)是有符號(hào)數(shù),而MUL處理的數(shù)據(jù)是無符號(hào)數(shù)。說明: 在乘法指令中,被乘數(shù)(即目的操作數(shù))隱含在AX(字運(yùn)算)或AL(字節(jié)運(yùn)算)中,乘數(shù)(即源操作數(shù))由指令尋址,其尋址方式可以是除立即尋址方式之外的任何數(shù)據(jù)尋址方式,它同時(shí)也決定了乘法是字運(yùn)算還是字節(jié)運(yùn)算。兩個(gè)8位數(shù)相乘其積是16位,存放在AX中;兩個(gè)16位數(shù)相乘其積是
31、32位,存放在DX、AX中,DX存放高位字,AX存放低位字。 乘法指令對(duì)除CF和OF以外的標(biāo)志位無定義(即這些標(biāo)志位的狀態(tài)是不定的)。對(duì)于MUL指令,如果乘積的高一半為0,則CF和OF均為0;否則CF和OF均為1。對(duì)IMUL指令,如果乘積的高一半是低一半的符號(hào)擴(kuò)展,則CF和OF均為0;否則均為1。測(cè)試這兩個(gè)標(biāo)志位,可知道乘積的高位字節(jié)或高位字是否是有效數(shù)字。 例 MUL CL IMUL DL MUL BYTE PTRBX IMUL NUMR ;NUMR是變量名4. 除法指令 與乘法指令一樣,除法指令也可對(duì)字節(jié)、字?jǐn)?shù)據(jù)進(jìn)行操作,而且這些數(shù)可以是有符號(hào)數(shù)整數(shù)或無符號(hào)數(shù)整數(shù)。除法指令要求被除數(shù)的長(zhǎng)度
32、必須是除數(shù)的兩倍,也就是說,字節(jié)除法是用16位數(shù)除以8位數(shù);字除法是用32位數(shù)除以16位數(shù)。除法指令也有兩條。1) DIV無符號(hào)數(shù)除法指令匯編格式:DIV源操作數(shù)執(zhí)行的操作:若為字節(jié)操作:(AL)(AX)/源操作數(shù)的商 (AH)(AX)/源操作數(shù)的余數(shù) 若為字操作: (AX)(DX、AX)/源操作數(shù)的商 (DX)(DX、AX)/源操作數(shù)的余數(shù)商和余數(shù)均為無符號(hào)數(shù)。2) IDIV有符號(hào)數(shù)除法指令 匯編格式:IDIV源操作數(shù)執(zhí)行的操作:與DIV相同,只是操作數(shù)是有符號(hào)數(shù),商和余數(shù)均為有符號(hào)數(shù),余數(shù)符號(hào)同被除數(shù)符號(hào)。說明: 在除法中,被除數(shù)(即目的操作數(shù))隱含在AX(字節(jié)運(yùn)算)或DX,AX(字運(yùn)算)
33、中,除數(shù)(即源操作數(shù))由指令尋址,其尋址方式可以是除立即尋址方式之外的任何數(shù)據(jù)尋址方式,尋址方式同時(shí)也決定了除法是字節(jié)運(yùn)算還是字運(yùn)算。16位數(shù)除以8位數(shù),商是8位,存放在AL中,余數(shù)是8位,存放在AH中;32位數(shù)除以16位數(shù),商是16位,存放在AX中,余數(shù)是16位,存放在DX中。 一條除法指令可能導(dǎo)致兩類錯(cuò)誤:一類是除數(shù)為零;另一類是除法溢出。當(dāng)被除數(shù)的絕對(duì)值大于除數(shù)的絕對(duì)值時(shí),商就會(huì)產(chǎn)生溢出。如,(AX)=2000被2除,由于8位除法的商將存于AL中,而結(jié)果1000無法存入AL中,導(dǎo)致除法溢出。當(dāng)產(chǎn)生這兩類除法錯(cuò)誤時(shí),微處理器就會(huì)產(chǎn)生除法錯(cuò)中斷警告。 除法指令對(duì)所有標(biāo)志位無定義。 例 : D
34、IV CL ;AX的內(nèi)容除以CL的內(nèi)容,無符號(hào)商存于AL,余數(shù)存于AH IDIV DL;AX的內(nèi)容除以DL的內(nèi)容,帶符號(hào)商存于AL,余數(shù)存于AH DIV BYTE PTRBP;AX的內(nèi)容除以堆棧段中由BP尋址的字節(jié)存儲(chǔ)單元的內(nèi)容,無符號(hào)的商存于AL中,余數(shù)存于AH中 IDIV WORD PTRAX ;DX,AX的內(nèi)容除以數(shù)據(jù)段 中由AX尋址的字存儲(chǔ)單元的 內(nèi)容,帶符號(hào)的商存于AX中,余數(shù)存于DX中5. 符號(hào)擴(kuò)展指令 由于乘法指令要求字運(yùn)算時(shí),被乘數(shù)必須為16位;除法指令要求字節(jié)運(yùn)算時(shí),被除數(shù)必須為16位,字運(yùn)算時(shí),被除數(shù)必須為32位。因此,往往需要用擴(kuò)展的方法獲得所需長(zhǎng)度的操作數(shù),而完成這一轉(zhuǎn)
35、換,對(duì)無符號(hào)數(shù)和帶符號(hào)數(shù)是不同的。對(duì)無符號(hào)數(shù)來說,必須進(jìn)行零擴(kuò)展,也就是說,AX的高8位必須清零或DX必須清零。對(duì)帶符號(hào)數(shù)來說,必須用下面介紹的兩條符號(hào)擴(kuò)展指令來擴(kuò)展。1) CBW字節(jié)轉(zhuǎn)換為字指令 匯編格式:CBW執(zhí)行的操作:將(AL)的符號(hào)擴(kuò)展到(AH)中去。如果(AL)的最高有效位為0,則(AH)=00H;如(AL)的最高有效位為1,則(AH)=0FFH。2) CWD字轉(zhuǎn)換為雙字指令 匯編格式:CWD 執(zhí)行的操作:將(AX)的符號(hào)擴(kuò)展到(DX)中去。如果(AX)的最高有效位為0,則(DX)=0000H;如(AX)的最高有效位為1,則(DX)=0FFFFH。這兩條指令都不影響標(biāo)志位。例 :
36、使NUMB字節(jié)存儲(chǔ)單元的內(nèi)容除以NUMB1字節(jié)存儲(chǔ)單元的內(nèi)容,將商存于ANSQ字節(jié)單元中,余數(shù)存于ANSR字節(jié)單元中。程序段如下:MOV AL,NUMBCBWDIV NUMB1MOV ANSQ,ALMOV ANSR,AH6. 十進(jìn)制調(diào)整指令 計(jì)算機(jī)不但能進(jìn)行二進(jìn)制運(yùn)算,還能進(jìn)行十進(jìn)制運(yùn)算。進(jìn)行十進(jìn)制運(yùn)算時(shí),首先將十進(jìn)制數(shù)據(jù)編碼為BCD碼,然后用前面介紹的二進(jìn)制算術(shù)運(yùn)算指令進(jìn)行運(yùn)算,之后再進(jìn)行十進(jìn)制調(diào)整,即可得正確的十進(jìn)制結(jié)果。BCD碼有兩種存儲(chǔ)格式:壓縮和非壓縮。壓縮BCD碼指每個(gè)字節(jié)存儲(chǔ)兩個(gè)BCD碼;非壓縮BCD碼指每個(gè)字節(jié)存儲(chǔ)一個(gè)BCD碼,其中低4位存儲(chǔ)數(shù)字的BCD碼,高4位為0。數(shù)字09
37、的ASCII碼是一種準(zhǔn)非壓縮BCD碼,即低四位為BCD值,高四位有數(shù)值,處理掉高四位的數(shù)值即為非壓縮BCD碼。1) 壓縮的BCD碼調(diào)整指令 DAA:加法的十進(jìn)制調(diào)整指令 匯編格式: DAA 執(zhí)行的操作:調(diào)整(AL)中的二進(jìn)制BCD碼的和。調(diào)整方法如下: 若AF=1或者(AL)的低4位是在AHFH之間,則(AL)加06H,且自動(dòng)置AF=1; 若CF=1或者(AL)的高4位是在AHFH之間,則(AL)加60H,且自動(dòng)置CF=1。說明: 本條指令對(duì)PSW中的OF標(biāo)志無定義,會(huì)影響所有其他標(biāo)志位。 使用本條指令之前,需將十進(jìn)制數(shù)先用ADD或ADC指令相加,和存入AL中。 DAS:減法的十進(jìn)制調(diào)整指令匯
38、編格式:DAS執(zhí)行的操作:調(diào)整(AL)中的差。調(diào)整方法如下:若AF=1,則(AL)減06H;若CF=1,則(AL)減60H。說明: 本條指令對(duì)PSW中的OF標(biāo)志無定義,會(huì)影響其他所有標(biāo)志位。 使用本條指令之前,需將十進(jìn)制數(shù)BCD碼用SUB或SBB指令相減,差存入(AL)中。2) 非壓縮的BCD碼調(diào)整指令 AAA:加法的非壓縮調(diào)整指令匯編格式:AAA執(zhí)行的操作:調(diào)整(AL)中的和,其中和是非壓縮BCD碼或準(zhǔn)非壓縮BCD格式。調(diào)整步驟: (1) 若AF=1或者(AL)的低4位在AHFH之間,則(AL)+06H,(AH)(AH)+1,置AF=1。 (2) 清除(AL)的高4位。 (3) CFAF。說
39、明: 本條指令除影響AF和CF標(biāo)志位外,對(duì)其余標(biāo)志位均無定義。 使用本條指令前,先將非壓縮BCD碼的和存入AL中。 AAS:減法壓縮調(diào)整指令。匯編格式:AAS執(zhí)行的操作:調(diào)整(AL)中的差,其中AL中的內(nèi)容是非壓縮的BCD碼或準(zhǔn)非壓縮BCD格式。調(diào)整步驟:(1) 若AF=1,則(AL)06H,(AH)(AH)1。(2) 清除(AL)高4位。(3) CFAF。說明: 本條指令除影響AF和CF標(biāo)志位外,對(duì)其余標(biāo)志位均無定義。 使用本條指令之前,先將非壓縮BCD碼的差存入AL中。 3)AAM:乘法的ASCII調(diào)整指令 指令格式:AAM 指令功能:對(duì)已存在AL中的兩個(gè)非壓縮十進(jìn)制數(shù)相乘的乘積進(jìn)行十進(jìn)制
40、數(shù)的調(diào)整,使得在AX中得到正確的非壓縮十進(jìn)制數(shù)的乘積,高位放在AH中,低位在AL中。兩個(gè)ASCII碼數(shù)相乘之前,必須先屏蔽掉每個(gè)數(shù)字的高半字節(jié),從而使每個(gè)字節(jié)包含一個(gè)非壓縮十進(jìn)制數(shù)(BCD數(shù)),再用MUL指令相乘,乘積放到AL寄存器中,然后用AAM指令進(jìn)行調(diào)整。 調(diào)整過程為:把AL寄存器內(nèi)容除以10,商放在AH中,余數(shù)在AL中。即 AHAL/10所得的商 ALAL/10所得的余數(shù)指令執(zhí)行后,將影響ZF、SF和PF,但AF、CF和OF無定義。 4)AAD除法的ASCII調(diào)整指令指令格式:AAD指令功能:在做除法前,把BCD碼轉(zhuǎn)換成二進(jìn)制數(shù)。 在把AX中的兩位非壓縮格式的BCD數(shù)除以一個(gè)非壓縮的B
41、CD數(shù)前,要先用AAD指令把 AX中的被除數(shù)調(diào)整成二進(jìn)制數(shù),并存到AL中,才能用DIV指令進(jìn)行運(yùn)算。調(diào)整的過程為: ALAHl0AL AH 00 本指令根據(jù)AL寄存器的結(jié)果影響SF、ZF和PF,對(duì)OF、CF和AF無定義。AND、OR、XOR和TEST四條指令的使用形式很相似,都是雙操作數(shù)指令,操作數(shù)的尋址方式的規(guī)定與算術(shù)運(yùn)算指令相同,對(duì)標(biāo)志位的影響也相同,使CF=0,OF=0,AF位無定義,SF、ZF、PF根據(jù)運(yùn)算結(jié)果設(shè)置。1) AND邏輯與指令 匯編格式:AND目的操作數(shù),源操作數(shù) 執(zhí)行的操作:(尋址到的目的地址)目的操作數(shù)源操作數(shù) 說明: 符號(hào)“”表示邏輯與操作。 本條指令通常用于使某個(gè)操
42、作數(shù)中的若干位維持不變,而使另外若干位為0的操作,也稱屏蔽某些位。要維持不變的位必須和“1”相“與”,而要置為0的位必須和“0”相“與”。 例: 屏蔽(AL)中的高4位。 ANDAL,00001111B 例 :AND AL,AL 此指令執(zhí)行前后,(AL)無變化,但執(zhí)行后使標(biāo)志位發(fā)生了變化,即CF=0,OF=0。2) OR邏輯或指令 匯編格式:OR目的操作數(shù),源操作數(shù) 執(zhí)行的操作:(尋址到的目的地址)目的操作數(shù)源操作數(shù) 說明: 符號(hào)“”表示邏輯或操作。 本條指令通常用于使某個(gè)操作數(shù)中的若干位維持不變,而使另外若干位置1的場(chǎng)合。要維持不變的位必須和“0”相“或”,而要置為1的位必須和“1”相“或”
43、。例: OR AL,10000000B 若執(zhí)行前(AL)=0FH,則執(zhí)行后(AL)=8FH。 例: OR AL,AL 指令執(zhí)行前后,(AL)不變,但執(zhí)行后標(biāo)志位發(fā)生了變化,即CF=0,OF=0。3) XOR邏輯異或指令 匯編格式:XOR目的操作數(shù),源操作數(shù) 執(zhí)行的操作:(尋址到的目的地址)目的操作數(shù)源操作數(shù) 說明: 符號(hào)表示異或操作。 本條指令通常用于使某個(gè)操作數(shù)清為零,同時(shí)使CF=0;或常用于判斷兩個(gè)數(shù)是否相等;也可用于使操作數(shù)中的若干位維持不變,而使另外若干位取反的操作。維持不變的這些位與“0”相“異或”,而要取反的那些位與“1”相“異或”。 例:XOR AL,AL 指令執(zhí)行后,(AL)=
44、0,CF=0,OF=0。 例: 測(cè)試(AL)是否等于33H。 XOR AL,33H JZ MATCH這種方法常用于檢測(cè)數(shù)值是否匹配。 例: 使(AL)中的最高位和最低位取反,其他位保持不變。 XOR AL,10000001B4) TEST測(cè)試指令 匯編格式:TEST 目的操作數(shù),源操作數(shù) 執(zhí)行的操作:目的操作數(shù)源操作數(shù) 說明: 本條指令中兩操作數(shù)相與的結(jié)果不保存。 本條指令通常用于在不改變?cè)胁僮鲾?shù)的情況下,用來檢測(cè)某一位或某幾位的條件是否滿足,用于條件轉(zhuǎn)移指令的先行指令。不檢測(cè)的那些位與“0”相“與”,即將不檢測(cè)的位屏蔽掉;檢測(cè)的那些位與“1”相“與”,保持不變。例:檢測(cè)(AL)的最高位是否
45、為1,若為1則轉(zhuǎn)移,否則順序執(zhí)行。TEST AL,10000000BJNZ AAAA:5) NOT邏輯非指令匯編格式:NOT目的操作數(shù)執(zhí)行的操作:(尋址到的地址)(操作數(shù)) 說明: 尋址方式不允許為立即尋址方式及段寄存器。 本條指令不影響標(biāo)志位。 例:NOT AL若執(zhí)行前(AL)=00111100B,則執(zhí)行后(AL)=11000011B。6) 邏輯運(yùn)算指令對(duì)標(biāo)志位的影響 由于邏輯運(yùn)算操作是按位進(jìn)行的,所以對(duì)標(biāo)志位的影響不同于算術(shù)運(yùn)算操作,對(duì)標(biāo)志位的具體影響見下表。 邏輯運(yùn)算指令對(duì)標(biāo)志位的影響指令OFCFSFPFZFAFAND=0=00或10或10或1無定義OR=0=00或10或10或1無定義X
46、OR=0=00或10或10或1無定義TEST=0=00或10或10或1無定義NOT不影響不影響不影響不影響不影響不影響2. 移位指令 這組指令可以對(duì)8位或16位操作數(shù)進(jìn)行操作,按移位方式分為三種。 1) 邏輯移位指令 SHL邏輯左移指令 匯編格式:SHL 除立即數(shù)及段寄存器之外的操作數(shù),移位次數(shù) 執(zhí)行的操作:將操作數(shù)邏輯左移指定次數(shù),如圖(a)所示。 說明:移位次數(shù)可以指定為1或大于1的數(shù)。若大于1次,則在該移位指令之前把移位次數(shù)存入CL寄存器中,而在移位指令中的移位次數(shù)寫為CL即可。移位次數(shù)的規(guī)定同樣適用于以下所有的移位指令。 SHR邏輯右移指令 匯編格式:SHR 除立即數(shù)及寄存器之外的操作
47、數(shù),移位次數(shù) 執(zhí)行的操作:將操作數(shù)邏輯右移指定次數(shù),如圖(b)所示。2) 算術(shù)移位指令 SAL算術(shù)左移指令匯編格式:SAL 除立即數(shù)及段寄存器之外的操作數(shù),移位次數(shù)執(zhí)行的操作:將操作數(shù)算術(shù)左移指定次數(shù),如圖(c)所示。由上可看出,SAL和SHL執(zhí)行的操作一樣。 SAR算術(shù)右移指令匯編格式:SAR 除立即數(shù)及段寄存器之外的操作數(shù),移位次數(shù)執(zhí)行的操作:將尋址到的操作數(shù)算術(shù)右移指定次數(shù),如圖(d)所示。 上述兩類移位指令對(duì)標(biāo)志位的影響是一樣的:CF位根據(jù)各條指令的移動(dòng)結(jié)果設(shè)置;OF位只有當(dāng)移動(dòng)次數(shù)為1時(shí)才是有效的,當(dāng)移位前后最高有效位的值發(fā)生了變化,則置OF=1,否則置OF=0;SF、ZF、PF位則
48、根據(jù)移位后的結(jié)果而設(shè)置。 上述兩類移位指令的處理對(duì)象有所不同:邏輯移位適用于對(duì)無符號(hào)數(shù)的處理,算術(shù)移位適用于對(duì)有符號(hào)數(shù)的處理。每左移一位相當(dāng)于乘以2,每右移一位相當(dāng)于除以2。3) 小循環(huán)移位指令 循環(huán)移位按是否與“進(jìn)位”位CF一起循環(huán)的情況,又分為小循環(huán)(自身循環(huán))和大循環(huán)(包括CF一起)兩種。 ROL循環(huán)左移指令匯編格式:ROL 除立即數(shù)和段寄存器之外的操作數(shù),移位次數(shù)執(zhí)行的操作:操作數(shù)循環(huán)左移指定次數(shù),如圖(e)所示。 ROR循環(huán)右移指令匯編指令:ROR 除立即數(shù)和段寄存器之外的操作數(shù),移位次數(shù)執(zhí)行的操作:操作數(shù)循環(huán)右移指定次數(shù),如圖(f)所示。4) 大循環(huán)移位指令 RCL帶進(jìn)位循環(huán)左移指
49、令匯編格式:RCL 除立即數(shù)和段寄存器之外的操作數(shù),移位次數(shù)執(zhí)行的操作:操作數(shù)循環(huán)左移指定次數(shù),如圖(g)所示。 RCR帶進(jìn)位循環(huán)右移指令匯編格式:RCR 除立即數(shù)和段寄存器之外的操作數(shù),移位次數(shù)執(zhí)行的操作:操作數(shù)循環(huán)右移指定次數(shù),如圖(h)所示。循環(huán)移位指令只影響CF和OF標(biāo)志位,具體規(guī)則同移位指令,不影響其他標(biāo)志位。這類指令一般用于實(shí)現(xiàn)循環(huán)式控制、高低字節(jié)互換或與算術(shù)、邏輯移位指令一起實(shí)現(xiàn)雙倍字長(zhǎng)或多倍字長(zhǎng)的移位。例:將(AX)乘以10。 十進(jìn)制數(shù)10的二進(jìn)制形式為1010,即權(quán)為2和權(quán)為8的位為1,故采用2(AX)+8(AX),結(jié)果為10(AX)。程序段如下:SHL AX,1MOV BX
50、,AXSHL AX,1SHL AX,1ADD AX,BX上例說明,左移一位相當(dāng)于乘2,右移一位相當(dāng)于除2,意味著利用移位指令可以完成乘除運(yùn)算。由于利用移位做乘除運(yùn)算的程序運(yùn)行速度大大快于乘除運(yùn)算指令的執(zhí)行速度,所以,移位指令適用于乘除運(yùn)算的程序設(shè)計(jì)。3.3.4串操作指令 1. 串傳送指令 每條串傳送指令都可傳送一個(gè)字節(jié)或一個(gè)字。如果加上前綴REP可實(shí)現(xiàn)重復(fù)傳送,傳送一個(gè)字節(jié)塊或一個(gè)字塊,具體格式如下:REP MOVS/LODS/STOS執(zhí)行的操作:(1) 如(CX)=0,則退出本條指令的執(zhí)行,否則繼續(xù)執(zhí)行。(2) (CX)(CX)1。(3) 執(zhí)行REP之后的串傳送指令。(4) 重復(fù)(1)(3)
51、。1) MOVS指令匯編格式1:MOVSB匯編格式2:MOVSW匯編格式3:MOVS目的操作數(shù),源操作數(shù) 格式說明:匯編格式1、2中明確注明了是傳送字節(jié)還是字。若使用匯編格式3,則在操作數(shù)的尋址方式中(除數(shù)據(jù)段定義的變量名外)應(yīng)表明是傳送字還是字節(jié)。例如 MOVS ES:BYTEPTRDI,DS:SI 因?yàn)镸VOS的源操作數(shù)及目的的操作數(shù)的存放地點(diǎn)是隱含規(guī)定好了的(這在下面的介紹中可以看出),所以第1種格式中的源目的操作數(shù)只供匯編程序作類型檢查用。 執(zhí)行的操作: (1) (ES):(DI)(DS):(SI) (2) 若傳送字節(jié)是:(SI)(SI)1,(DI)(DI)1時(shí),則當(dāng)方向標(biāo)志位DF=0
52、時(shí)用“+”,DF=1時(shí)用“”;若傳送字是:(SI)(SI)2,(DI)(DI)2時(shí),則方向標(biāo)志位DF=0時(shí)用“+”,DF=1時(shí)用“”。說明: 本條指令不影響標(biāo)志位。 MOVS指令采用隱含尋址方式,實(shí)現(xiàn)將數(shù)據(jù)段中由(SI)指向的一個(gè)字節(jié)或字傳送到附加數(shù)據(jù)段中由(DI)指向的一個(gè)字節(jié)或字存儲(chǔ)單元中去,然后根據(jù)DF和字或字節(jié)的規(guī)定對(duì)SI和DI指針進(jìn)行修改。一般情況下源操作數(shù)在數(shù)據(jù)段,目的操作數(shù)在附加段。如果同段數(shù)據(jù)傳送,允許源操作數(shù)使用段超越前綴來修改所在段,也可以采用兩段合一的方法,即DS和ES同時(shí)指向同一數(shù)據(jù)段。 若想實(shí)現(xiàn)傳送一個(gè)字節(jié)塊或一個(gè)字塊,必須先把傳送字或字節(jié)的長(zhǎng)度送CX寄存器中去,MO
53、VS指令加前綴REP。 指令在操作之前必須做好以下初始化工作: (1) 把存放于數(shù)據(jù)段中的源數(shù)據(jù)串的首地址(如反向傳送則應(yīng)是末地址)存入(SI)。 (2) 把將要存放于附加段中的目的數(shù)據(jù)串的首地址(如反向傳送則應(yīng)是末地址)存入(DI)。 (3) 把數(shù)據(jù)串長(zhǎng)度存入(CX)。 (4) 設(shè)置方向標(biāo)志位DF的值(CLD指令使DF=0,STD指令使DF=1)。2) LODS指令匯編格式1:LODSB匯編格式2:LODSW匯編格式3:LODS源操作數(shù)存儲(chǔ)器尋址方式執(zhí)行的操作:(1) 若字節(jié):AL(DS):(SI) 若 字:AX(DS):(SI)(2) 若字節(jié):(SI)(SI)1 (DF=0用“+”,否則用
54、“”) 若 字:(SI)(SI)2 (DF=0用“+”,否則用“”)說明: 本條指令不影響標(biāo)志位。 本條指令是隱含尋址,將數(shù)據(jù)段中(SI)指向的一個(gè)字或字節(jié)送入AL或AX,格式3中的源操作數(shù)只供匯編程序作類型檢查。 本條指令一般不與REP聯(lián)用。因?yàn)槊恐貜?fù)傳送一次數(shù)據(jù),累加器中的內(nèi)容就被改寫,執(zhí)行重復(fù)傳送操作后,只能保留最后寫入的那個(gè)數(shù)據(jù)。 3) STOS指令匯編格式1:STOSB匯編格式2:STOSW匯編格式3:STOS目的操作數(shù)執(zhí)行的操作:(1) 若字節(jié):(ES):(DI)AL 若 字:(ES):(DI)AX(2) 若字節(jié):(DI)(DI)1 (DF=0用“+”,否則用“”) 若 字:(DI
55、)(DI)2 (DF=0用“+”,否則用“”)說明: 本條指令不影響標(biāo)志位。 與上兩條指令相同,匯編格式3中的目的操作數(shù)只供匯編程序作類型檢查。 本條指令可與REP聯(lián)合使用,一般用來實(shí)現(xiàn)清除內(nèi)存某一區(qū)域。2. 串比較指令 每條串比較指令都可比較兩個(gè)字或字節(jié)操作數(shù)的大小,但不保存結(jié)果。若加上重復(fù)前綴REPE/REPZ或REPNE/REPNZ,可按一定條件重復(fù)比較。 REPE/REPZ 該前綴的含義是:當(dāng)相等/為零時(shí)重復(fù)比較。 匯編格式:REPE/REPZ CMPS/SCAS執(zhí)行的操作: (1) 當(dāng)(CX)=0(即數(shù)據(jù)串比較完成)或ZF=0(即某次比較結(jié)果不相等)時(shí)退出,否則(即(CX)0且ZF=
56、1)往下執(zhí)行。(2) (CX)(CX)1。(3) 執(zhí)行其后的串比較指令。(4) 執(zhí)行(1)(3)。說明: REPE與REPZ是完全相同的,只是表達(dá)式不同而已。與REP相比,退出重復(fù)執(zhí)行的條件除(CX)=0外,還增加了ZF=0的條件,也就是說,只要兩數(shù)相等就可繼續(xù)比較,如果遇到兩數(shù)不相等可提前結(jié)束比較操作。 (CX)的遞減不影響標(biāo)志位。 REPNE/REPNZ 該前綴的含義是:當(dāng)不相等/不為零時(shí)重復(fù)比較。 匯編格式:REPNE/REPNZ CMPS/SCAS 執(zhí)行的操作:除退出條件為(CX)=0或ZF=1外,其他操作與REPE/REPZ相同。也就是說,只要兩數(shù)不相等就可繼續(xù)比較,如果遇到兩數(shù)相等
57、可提前結(jié)束比較操作。 1) CMPS指令 匯編格式1:CMPSB 匯編格式2:CMPSW 匯編格式3:CMPS源操作數(shù)存儲(chǔ)器尋址方式,目的操作數(shù)存儲(chǔ)器尋址方式執(zhí)行的操作: (1) (DS):(SI)(ES):(DI) (2) 若字節(jié)是(SI)(SI)1,(DI)(DI)1時(shí),則方向標(biāo)志位DF=0用“+”,否則用“”;若字是(SI)(SI)2(DI)(DI)2時(shí),則方向標(biāo)志位DF=0用“+”,否則用“”。說明: 本條指令執(zhí)行后,根據(jù)兩操作數(shù)相減結(jié)果置標(biāo)志位,但不保存結(jié)果。 本條指令與REPE/REPNE相聯(lián)合可實(shí)現(xiàn)兩個(gè)數(shù)據(jù)串的比較。2) SCAS指令匯編格式1:SCASB匯編格式2:SCASW匯
58、編格式3:SCAS目的操作數(shù)執(zhí)行的操作:(1) 若字節(jié)是:(AL)(ES):(DI) 若字:(AX)(ES):(DI) 說明: 本指令根據(jù)相減結(jié)果置標(biāo)志位。 本指令與REPE/REPNE相聯(lián)合可實(shí)現(xiàn)從一個(gè)字符串中查找一個(gè)指定的字符的功能。例: 假設(shè)有一起始地址為BLOCK,長(zhǎng)度為100個(gè)字節(jié)的存儲(chǔ)區(qū),現(xiàn)要對(duì)這一存儲(chǔ)區(qū)進(jìn)行測(cè)試,看其中是否有內(nèi)容為00H的存儲(chǔ)單元。MOV DI,OFFSETBLOCKCLDMOV CX,100XOR AL,ALREPNE SCASBJZ FOUNDFOUND:3.3.5控制轉(zhuǎn)移指令 控制轉(zhuǎn)移指令中包括四類指令:無條件轉(zhuǎn)移和條件轉(zhuǎn)移指令;子程序調(diào)用和返回指令;循環(huán)控
59、制指令;中斷指令及中斷返回指令。 轉(zhuǎn)移指令是一種主要的程序控制指令,其中無條件轉(zhuǎn)移指令使編程者能夠跳過程序的某些部分轉(zhuǎn)移到程序的任何分支去。條件轉(zhuǎn)移指令可使編程者根據(jù)測(cè)試結(jié)果來決定轉(zhuǎn)移到何處去。測(cè)試的結(jié)果保存在標(biāo)志位中,然后又被條件轉(zhuǎn)移指令檢測(cè)。1. 無條件轉(zhuǎn)移指令JMP JMP指令的功能就是無條件地轉(zhuǎn)移到指令指定的地址去執(zhí)行從該地址開始的指令序列。它在實(shí)際使用中有以下四種格式。1) 段內(nèi)直接轉(zhuǎn)移 (1) 段內(nèi)直接短轉(zhuǎn)移。 匯編格式:JMP SHORT轉(zhuǎn)移地址標(biāo)號(hào) 機(jī)器指令的格式:如下圖所示。 執(zhí)行的操作:(IP)(當(dāng)前IP)+8位位移量 轉(zhuǎn)移的范圍:轉(zhuǎn)到本條指令的下一條指令的128+127個(gè)
60、字節(jié)的范圍內(nèi)。功能:無條件轉(zhuǎn)移到指定的地址標(biāo)號(hào)處開始往下執(zhí)行指令。 段內(nèi)直接短轉(zhuǎn)移指令格式注意:短轉(zhuǎn)移的位移量是一個(gè)由128+127之間1字節(jié)帶符號(hào)數(shù)所表示的距離,當(dāng)執(zhí)行短轉(zhuǎn)移指令時(shí),位移量被符號(hào)擴(kuò)展并與指令指針(IP)相加生成一個(gè)當(dāng)前代碼段中轉(zhuǎn)移的目的地址,然后轉(zhuǎn)移到這一新地址繼續(xù)執(zhí)行下一條指令。另外,從上面的執(zhí)行過程可看出,短轉(zhuǎn)移又屬于相對(duì)轉(zhuǎn)移,因?yàn)樗D(zhuǎn)移的目標(biāo)地址是相對(duì)當(dāng)前位置偏移了若干字節(jié),故它又是可重定位的。這是因?yàn)椋魧⒋a段移到存儲(chǔ)器中一個(gè)新地方,轉(zhuǎn)移指令與轉(zhuǎn)移目標(biāo)地址指令之間的差保持不變,因此,可簡(jiǎn)單地用移位代碼來實(shí)現(xiàn)對(duì)它的重定位。例: 設(shè)有一段程序如下表所示,假定(CS)=1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 大連民族大學(xué)《機(jī)械工程專題講座》2023-2024學(xué)年第二學(xué)期期末試卷
- 許昌職業(yè)技術(shù)學(xué)院《美國(guó)文學(xué)史及作品選讀》2023-2024學(xué)年第二學(xué)期期末試卷
- 福州墨爾本理工職業(yè)學(xué)院《PA財(cái)務(wù)機(jī)器人開發(fā)》2023-2024學(xué)年第二學(xué)期期末試卷
- 河南醫(yī)學(xué)高等??茖W(xué)校《設(shè)計(jì)與開發(fā)》2023-2024學(xué)年第二學(xué)期期末試卷
- 第14課 新年賀卡-綜合制作 教學(xué)設(shè)計(jì) -2023--2024學(xué)年清華大學(xué)版(2012)初中信息技術(shù)八年級(jí)上冊(cè)
- 貴州文化旅游職業(yè)學(xué)院《建筑空間設(shè)計(jì)研究》2023-2024學(xué)年第二學(xué)期期末試卷
- 江蘇科技大學(xué)《室內(nèi)綜合實(shí)踐》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣州華商職業(yè)學(xué)院《環(huán)境工程設(shè)備》2023-2024學(xué)年第二學(xué)期期末試卷
- 洛陽商業(yè)職業(yè)學(xué)院《建筑工程估價(jià)課程設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 電影包場(chǎng)合同范本
- 人教版八年級(jí)下冊(cè)生物全冊(cè)教案完整版教學(xué)設(shè)計(jì)含教學(xué)反思
- 無人機(jī)警用方向應(yīng)用簡(jiǎn)介課件
- 變電站一次系統(tǒng)圖
- 《思想道德修養(yǎng)與法律基礎(chǔ)》說課(獲獎(jiǎng)版)課件
- 幼兒園中班居家安全教案
- 網(wǎng)頁設(shè)計(jì)和制作說課稿市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件
- 《新媒體營(yíng)銷》新媒體營(yíng)銷與運(yùn)營(yíng)
- 食用油營(yíng)銷整合規(guī)劃(含文字方案)
- 蘇教版科學(xué)五年級(jí)下15《升旗的方法》教案
- 現(xiàn)代工業(yè)發(fā)酵調(diào)控緒論
- 超高性能混凝土項(xiàng)目立項(xiàng)申請(qǐng)(參考模板)
評(píng)論
0/150
提交評(píng)論