微機(jī)原理與接口技術(shù)匯編語(yǔ)言_第1頁(yè)
微機(jī)原理與接口技術(shù)匯編語(yǔ)言_第2頁(yè)
微機(jī)原理與接口技術(shù)匯編語(yǔ)言_第3頁(yè)
微機(jī)原理與接口技術(shù)匯編語(yǔ)言_第4頁(yè)
微機(jī)原理與接口技術(shù)匯編語(yǔ)言_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、8086指令系統(tǒng)分為以下6組: 數(shù)據(jù)傳送指令 算術(shù)指令 邏輯指令 串處理指令 控制轉(zhuǎn)移指令 處理機(jī)控制指令數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令的功能是把數(shù)據(jù)、地址傳送到寄存器或存儲(chǔ)器單元中。它分為4類(lèi)。 通用數(shù)據(jù)傳送指令 累加器專(zhuān)用傳送指令MOV 傳送 IN 輸入PUSH進(jìn)棧 OUT 輸出POP 出棧 XLAT換碼XCHG交換 地址傳送指令 標(biāo)志寄存器傳送指令LEA 有效地址送寄存器 LAHF標(biāo)志送AHLDS 指針?biāo)图拇嫫骱虳S SAHFAH送標(biāo)志寄存器LES 指針?biāo)图拇嫫骱虴S PUSHF 標(biāo)志進(jìn)棧 POPF標(biāo)志出棧1 通用數(shù)據(jù)傳送指令MOVdst, src;傳送指令(move)執(zhí)行操作:(dst) (

2、src)功能: 將源操作數(shù)(字節(jié)或字)傳送到目的地址。注意: 目的操作數(shù)dst和源操作數(shù)src不能同時(shí)用存儲(chǔ)器尋址方式,這個(gè)限制適用于所有指令; 目的操作數(shù)dst不能是CS,也不能用立即數(shù)方式; 目的操作數(shù)dst和源操作數(shù)src不允許同時(shí)為段寄存器; MOV指令不影響標(biāo)志位。PUSH src ; 進(jìn)棧指令(push onto the stack)執(zhí)行操作: (SP) (SP)2 (SP) (src)POP dst ; 出棧指令(pop from the stack)執(zhí)行操作: (dst) (SP) (SP) (SP)+2PUSH和POP指令分別將數(shù)據(jù)存入堆?;虬讯褩V械臄?shù)據(jù)取出。堆棧是以LIF

3、O(后進(jìn)先出)方式工作的一個(gè)存儲(chǔ)區(qū),程序中定義的堆棧段就是這樣一個(gè)LIFO存儲(chǔ)區(qū)。數(shù)據(jù)存入堆棧單元或從堆棧單元中取出都由堆棧指針SP指示,而SP總是指向棧頂,所以進(jìn)棧和出棧指令都會(huì)自動(dòng)修改SP。PUSH指令執(zhí)行時(shí),SP的內(nèi)容先減2,然后將數(shù)據(jù)壓入SP所指示的字單元,存儲(chǔ)的方法同樣是高8位存入高地址字節(jié),低8位存入低地址字節(jié)。POP指令執(zhí)行時(shí),將SP所指示的棧頂?shù)刂返膬?nèi)容取出放入目的地址,然后SP增2,指向新的棧頂?shù)刂?。注意?PUSH和POP指令只能是字操作,因此存取字?jǐn)?shù)據(jù)后,SP的修改必須是2或2; PUSH和POP指令不能使用立即數(shù)方式; POP指令的dst不允許是CS寄存器; PUSH和

4、POP指令都不影響標(biāo)志位。 PUSH指令在程序中常用來(lái)暫存某些數(shù)據(jù),而POP指令又可將這些數(shù)據(jù)恢復(fù)。XCHG opr1, opr2 ; 交換指令(exchange)執(zhí)行操作:(opr1) (opr2)XCHG指令使兩個(gè)操作數(shù)opr1,和opr2互相交換,其中一個(gè)操作數(shù)必須在寄存器中,另一個(gè)操作數(shù)可以在寄存器或存儲(chǔ)器中。注意: 不允許使用段寄存器 不影響標(biāo)志位 例 假設(shè)(DS)=1000H, (SS)=4000H, (SP)=100H, (BX)=2100H, (12100)=00A8H, 指出連續(xù)執(zhí)行下列各條指令后,有關(guān)寄存器、存儲(chǔ)單元以及堆棧的情況。PUSH DSPUSH BXPUSH BX

5、POP DIPOP WORD PTR DI+2POP DS執(zhí)行結(jié)果: (SP)=100H2=0FEH (SP)=0FE2=0FCH (SP)=0FC-2=0FAH (400FEH)=1000H (400FCH)=2100H (400FAH)=00A8H執(zhí)行結(jié)果: (SP)=0FA+2=0FCH (SP)=0FC+2=0FEH (SP)=0FE+2=100H (DI)=00A8H (100AAH)=2100H (DS)=1000H例 已知(AX)=6634H, (BX)=0F24H, (SI)=0012H, (DS)=1200H, (12F36H)=2500H, 寫(xiě)出下列指令執(zhí)行的結(jié)果。 XCH

6、G AH,AL ; 執(zhí)行前: (AH)=66H, (AL)=34H; 執(zhí)行后: (AH)=34H, (AL)=66H XCHG AX,BX+SI; 執(zhí)行前: (AX)=6634H, (12F36H)=2500H; 執(zhí)行后: (AX)=2500H, (12F36H)=6634HH  2 累加器專(zhuān)用傳送指令這組指令只限于使用累加器(ac:AX 或AL)傳送信息。IN ac, port; 輸入指令(input), port0FFH執(zhí)行操作:(AL) (port) 傳送字節(jié)或 (AX) (port+1,port) 傳送字IN ac, DX ; 輸入指令, DX中的port0FFH執(zhí)行操作:(

7、AL) (DX) 傳送字節(jié)或 (AX) (DX)+1,(DX) 傳送字OUT port, ac ; 輸出指令(output), port0FFH執(zhí)行操作:(port) (AL) 傳送字節(jié)或 (port+1,port) (AX) 傳送字 OUT DX, ac ; 輸出指令(output), DX中的 port0FFH 執(zhí)行操作:(DX) (AL) 傳送字節(jié)或 (DX)+1,(DX) (AX) 傳送字對(duì)8086及其后繼機(jī)型的微處理機(jī),所有I/O端口與CPU之間的通信都由輸入輸出指令I(lǐng)N和OUT來(lái)完成。IN指令將信息從I/O輸入到CPU,OUT指令將信息從CPU輸出到I/O端口,因此,IN和OUT指

8、令都要指出I/O端口地址。微處理機(jī)分配給外部設(shè)備最多有64K個(gè)端口,其中前256個(gè)端口(0FFH)稱(chēng)為固定端口,可以直接在指令中指定。當(dāng)端口地址超過(guò)8位(256),稱(chēng)為可變端口,它必須先送到DX寄存器,然后再用IN或OUT指令傳送信息。CPU與I/O端口傳送信息的寄存器只限于累加器ac (AX或AL),傳送16位信息用AX,傳送8位信息用AL,這取決于外設(shè)端口的寬度。注意: 只限于在AL或AX與I/O端口之間傳送信息 不影響標(biāo)志位XLAT ; 換碼指令(translate)執(zhí)行操作: (AL) (DS)×16(BX)+(AL)這條指令根據(jù)AL寄存器提供的位移量,將BX指示的字節(jié)表格中

9、的代碼換存在AL中。該指令還可寫(xiě)為:XLAT opr,opr為字節(jié)表格的首地址,因?yàn)閛pr所表示的偏移地址已存入BX寄存器,所以opr在換碼指令中可有可無(wú),有則可提高程序的可讀性。注意: 所建字節(jié)表格的長(zhǎng)度不能超過(guò)256字節(jié),因?yàn)榇娣盼灰屏康氖?位寄存器AL; XLAT指令不影響標(biāo)志位。  例 IN AL, 61H ; (AL) 端口61H的內(nèi)容MOV DX, 278H ; (DX) 端口地址278H IN AL, DX ; (AL) 端口278H的內(nèi)容例 OUT 61H, AL ; 61H端口 (AL)MOV DX, 279H ; (DX) 端口地址279HOUT DX, AX ;

10、 279H端口 (AX)  3 地址傳送指令這組指令完成把地址送到指定寄存器的功能。LEA reg, src ; 有效地址送寄存器(load effective address)執(zhí)行操作:(reg) offset of srcLEA指令把源操作數(shù)的有效地址送到指定的寄存器,這個(gè)有效地址是由src選定的一種存儲(chǔ)器尋址方式確定的。LDS reg, src ; 指針?biāo)图拇嫫骱虳S(load DS with point)執(zhí)行操作: (reg) (src)(DS) (src+2)LES reg, src ; 指針?biāo)图拇嫫骱虴S(load ES with point)執(zhí)行操作: (reg) (s

11、rc)(ES) (src+2)LDS和LES指令把確定內(nèi)存單元位置的偏移地址送寄存器,段地址送DS或ES。這個(gè)偏移地址和段地址(也稱(chēng)地址指針)是由src指定的兩個(gè)相繼字單元提供的。 注意: 指令中的reg不能是段寄存器; 指令中的src必須使用存儲(chǔ)器尋址方式; 該指令不影響標(biāo)志位。   例假設(shè)某數(shù)據(jù)段定義如下:0000 DATASEGMENT0000 0040 TABLE DW 0040H0002 3000 DW 3000H0004 DATAENDS請(qǐng)指出下列指令的執(zhí)行結(jié)果,并說(shuō)明它們之間的區(qū)別。 MOV BX, TABLE LEA BX, TABLE MOV BX, OF

12、FSET TABLE 答:第條指令執(zhí)行后,(BX)=0040H,第條指令執(zhí)行后,(BX)=0000,第條指令執(zhí)行后,(BX)=0000。比較兩條指令,第條MOV指令是用直接尋址方式把變量TABLE的內(nèi)容送入BX,而LEA指令是把TABLE的地址送入BX。比較兩條指令可以看到,LEA和用OFFSET指示符實(shí)現(xiàn)的功能是相同的,都是將TABLE的偏移地址0000送BX。既然功能相同,它們之間還有什么區(qū)別呢?首先,LEA指令可以使用各種存儲(chǔ)器尋址方式,如,LEA BX,DI,LEA BX,TABLEDI,LEA SI,BX+DI等,這些指令都是把計(jì)算出來(lái)的有效地址送目的寄存器,而OFFSET不能使用這

13、些尋址方式,它只作用于像TABLE這樣的簡(jiǎn)單變量(或標(biāo)號(hào))。 其次,對(duì)簡(jiǎn)單變量,OFFSET指示符比LEA執(zhí)行速度快,因?yàn)镸OV BX, OFFSET TABLE指令在匯編時(shí),由匯編程序計(jì)算出了TABLE的偏移地址,并被匯編成立即數(shù)傳送指令,因此效率很高,而LEA指令是在執(zhí)行時(shí)才計(jì)算地址,然后再傳送到指定寄存器,因此執(zhí)行速度相對(duì)慢一些。 例 對(duì)例3.17的數(shù)據(jù)定義,下列兩條指令的執(zhí)行結(jié)果是什么? LDS BX, TABLE LES BX, TABLE答:LDS指令執(zhí)行后,(BX)=0040H, (DS)=3000HLES指令執(zhí)行后,(BX)=0040H, (ES)=3000H4 標(biāo)志寄存器傳送

14、指令這組指令完成和標(biāo)志位有關(guān)的操作。LAHF 標(biāo)志寄存器的低字節(jié)送AH(load AH with flags)SAHF AH送標(biāo)志寄存器低字節(jié)(store AH into flags)PUSHF 標(biāo)志進(jìn)棧(push the flags)POPF 標(biāo)志出棧(pop the flags)注意: LAHF和SAHF指令隱含的操作寄存器是AH和FLAGS LAHF和PUSH不影響標(biāo)志位,SAHF和POPF則由裝入的值來(lái)確定標(biāo)志位的值。LAHF 標(biāo)志寄存器的低字節(jié)送AH(load AH with flags) 執(zhí)行操作: (AH) (FLAGS)0-7SAHF AH送標(biāo)志寄存器低字節(jié)(store AH

15、into flags) 執(zhí)行操作: (FLAGS) 0-7 (AH)PUSHF 標(biāo)志進(jìn)棧(push the flags) 執(zhí)行操作: (SP) (SP)2 (SP)+1,(SP) (FLAGS)0-15POPF 標(biāo)志出棧(pop the flags) 執(zhí)行操作: (FLAGS) 0-15 (SP)+1,(SP) (SP) (SP)+2算術(shù)指令包括加、減、乘、除指令,它包括對(duì)二進(jìn)制數(shù)進(jìn)行的算術(shù)運(yùn)算的指令,以及對(duì)十進(jìn)制數(shù)(用BCD碼表示)運(yùn)算進(jìn)行調(diào)整的指令。執(zhí)行算術(shù)指令都會(huì)影響條件標(biāo)志位,條件標(biāo)志位包括CF、PF、AF、ZF、SF和OF,它們標(biāo)志算術(shù)運(yùn)算結(jié)果的特征。   加法指令 減法指

16、令A(yù)DD 加法 SUB 減法ADC 帶進(jìn)位加 DEC 減1INC 加1 NEG 求補(bǔ) CMP 比較 乘法指令 除法指令MUL 無(wú)符號(hào)數(shù)乘法 DIV 無(wú)符號(hào)數(shù)除法IMUL帶符號(hào)數(shù)乘法IDIV帶符號(hào)數(shù)除法 符號(hào)擴(kuò)展指令 十進(jìn)制調(diào)整指令CBW 字節(jié)轉(zhuǎn)換為字 DAA加法的十進(jìn)制調(diào)整CWD 字轉(zhuǎn)換為雙字 DAS 減法的十進(jìn)制調(diào)整 AAA 加法的ASCII調(diào)整 AAS 減法的ASCII調(diào)整 AAM 乘法的ASCII調(diào)整 AAD 除法的ASCII調(diào)整1 加法指令A(yù)DD dst,src 加法指令(addition)執(zhí)行操作: (dst) (src)(dst)ADC dst,src 帶進(jìn)位加指令(add wit

17、h carry)執(zhí)行操作: (dst) (src)(dst)CFINC opr 加1指令(increment)執(zhí)行操作: (opr) (opr)1ADD和ADC指令是雙操作數(shù)指令,它們的兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器尋址方式,也就是說(shuō),除源操作數(shù)為立即數(shù)的情況外,源和目的操作數(shù)必須有一個(gè)是寄存器尋址方式。INC指令是單操作數(shù)指令,它可以使用除立即數(shù)方式外的任何尋址方式。ADD和ADC指令影響條件標(biāo)志位(也稱(chēng)條件碼),INC指令影響除CF外的其它條件碼。條件碼中最主要的是SF、ZF、CF和OF,加法運(yùn)算對(duì)這四個(gè)條件碼的設(shè)置方法如下:SF=1 加法結(jié)果為負(fù)數(shù)(符號(hào)位為1)SF=0 加法結(jié)果為正數(shù)(符號(hào)

18、位為0)ZF=1 加法結(jié)果為零ZF=0 加法結(jié)果不為零CF=1 最高有效位向高位有進(jìn)位CF=0 最高有效位向高位無(wú)進(jìn)位OF=1 兩個(gè)同符號(hào)數(shù)相加(正數(shù)+正數(shù),或負(fù)數(shù)加負(fù)數(shù)),結(jié)果符號(hào)與其相反OF=0 不同符號(hào)數(shù)相加時(shí),或同符號(hào)數(shù)相加,結(jié)果符號(hào)與其相同計(jì)算機(jī)在執(zhí)行運(yùn)算時(shí),并不區(qū)別操作數(shù)是帶符號(hào)數(shù)還是無(wú)符號(hào)數(shù),一律按上述規(guī)則設(shè)置條件碼,因此,程序員要清楚當(dāng)時(shí)處理的是什么類(lèi)型的數(shù)據(jù)。例如,當(dāng)加法運(yùn)算結(jié)果的最高有效位為1時(shí),機(jī)器將SF置1。如果參加運(yùn)算的是兩個(gè)帶符號(hào)數(shù),那么和的最高有效位是符號(hào)位,SF置1說(shuō)明結(jié)果是一個(gè)負(fù)數(shù)。如果參加運(yùn)算的是兩個(gè)無(wú)符號(hào)數(shù),那么和的最高有效位也是數(shù)值位,此時(shí)SF置0或置1

19、都失去了表示正負(fù)數(shù)的意義。對(duì)帶符號(hào)數(shù)和無(wú)符號(hào)數(shù),它們表示結(jié)果溢出的條件標(biāo)志位也是不同的。上述OF位的設(shè)置條件顯然只符合帶符號(hào)數(shù)的溢出情況,OF=1表示運(yùn)算結(jié)果是錯(cuò)誤的。而無(wú)符號(hào)數(shù)溢出(運(yùn)算結(jié)果超出了有限位的表示范圍)時(shí),表現(xiàn)為最高有效位產(chǎn)生進(jìn)位,因此,CF=1是無(wú)符號(hào)數(shù)溢出的標(biāo)志。另外,在雙字長(zhǎng)數(shù)運(yùn)算時(shí),低位字相加設(shè)置的CF,說(shuō)明低位字向高位字有無(wú)進(jìn)位的情況。 例 MOV BX,9B8CH ; (BX)=9B8CHADD BX,6478H ; now (BX)=0000H9B8A1001 1011 1000 1010+ 6476 + 0110 0100 0111 0110- -1 0000 1

20、 0000 0000 0000 0000條件碼設(shè)置: SF=0 最高有效位(D15)為0 ZF=1 結(jié)果為0 CF=1 最高有效位向高位有進(jìn)位 OF=0 不同符號(hào)數(shù)相加,不產(chǎn)生溢出例 編寫(xiě)執(zhí)行雙精度數(shù)(DX,CX)和(BX,AX)相加的指令序列,DX是目的操作數(shù)的高位字,BX是源操作數(shù)的高位字。指令執(zhí)行前:(DX,CX)= A248 2AC0H,(BX,AX)= 088A E25BH。 指令序列: ADD CX, AX ;(CX)= 0D1BHADC DX, BX ; now,(DX)=0AAD3H 執(zhí)行ADD指令:2AC0 0010 1010 1100 0000+ E25B + 1110 0

21、010 0101 1011- -1 0D1B 1 0000 1101 0001 1011條件碼設(shè)置: SF=0 最高有效位(D15)為0,無(wú)符號(hào)位意義 F=0結(jié)果不為0 CF=1 最高有效位向高位有進(jìn)位 OF=0 加數(shù)最高位分別為0、1,溢出位置0,OF對(duì)低位字無(wú)溢出意義執(zhí)行ADC指令: A248 1010 0010 0100 1000 088A 0000 1000 1000 1011 + 1 + 1CF- - AAD3 1010 1010 1101 0011條件碼設(shè)置: SF=1 最高有效位(D31)為1,對(duì)帶符號(hào)數(shù)運(yùn)算表示結(jié)果為負(fù) ZF=0 結(jié)果不為0 CF=0 最高有效位向高位無(wú)進(jìn)位 O

22、F=0 結(jié)果符號(hào)與操作數(shù)相同,未產(chǎn)生溢出2 減法指令SUB dst,src 減法指令(subtract)執(zhí)行操作: (dst) (dst)(src)SBB dst,src 帶借位減法指令(subtract with borrow)執(zhí)行操作: (dst) (dst)(src)CFDEC opr 減1指令(decrement)執(zhí)行操作: (opr) (opr)1CMP opr1,opr2 比較指令(compare)執(zhí)行操作: (opr1)(opr2),根據(jù)相減結(jié)果設(shè)置條件碼,但不回送結(jié)果以上指令除DEC指令不影響CF外,其他都影響條件碼。與加法類(lèi)似,SF和ZF分別表示減法結(jié)果的符號(hào)以及為零的情況;

23、CF表明無(wú)符號(hào)數(shù)相減結(jié)果溢出與否;OF表明帶符號(hào)數(shù)相減結(jié)果溢出與否。但在對(duì)CF和OF位的設(shè)置方法上減法和加法有所不同,下面對(duì)此做進(jìn)一步說(shuō)明:CF=1 二進(jìn)制減法運(yùn)算中最高有效位向高位有借位(被減數(shù)減數(shù),不夠減的情況)CF=0 二進(jìn)制減法運(yùn)算中最高有效位向高位無(wú)借位(被減數(shù)減數(shù),夠減的情況)OF=1 兩數(shù)符號(hào)相反(正數(shù)負(fù)數(shù),或負(fù)數(shù)正數(shù)),而結(jié)果符號(hào)與減數(shù)相同OF=0 同符號(hào)數(shù)相減時(shí),或不同符號(hào)數(shù)相減,其結(jié)果符號(hào)與減數(shù)不同NEG opr 求補(bǔ)指令(negate)執(zhí)行操作: (opr) (opr),求補(bǔ)操作即把操作數(shù)變?yōu)榕c其符號(hào)相反的數(shù):。機(jī)器在執(zhí)行求補(bǔ)指令時(shí),把操作數(shù)各位求反后末位加1,因此執(zhí)行的

24、操作也可表示為:(opr) 0FFFFH(opr)1NEG指令的條件碼設(shè)置方法為:CF=1 不為0的操作數(shù)求補(bǔ)時(shí)CF=0 為0的操作數(shù)求補(bǔ)時(shí)OF=1 當(dāng)求補(bǔ)運(yùn)算的操作數(shù)為128(字節(jié))或32768(字)時(shí)OF=0 當(dāng)求補(bǔ)運(yùn)算的操作數(shù)不為128(字節(jié))或32768(字)時(shí) 例 字長(zhǎng)為8位的兩數(shù)相減,其可表示數(shù)的范圍為:帶符號(hào)數(shù)128127(80H7FH),無(wú)符號(hào)數(shù)0255(0FFH)。運(yùn)算結(jié)果超出可表示數(shù)范圍即為溢出,說(shuō)明結(jié)果錯(cuò)誤。 43H16H=2DH 0100 0011 0100 0011 條件碼設(shè)置:CF=0 0001 0110 + 1110 1010 OF=0- - 0010 1101

25、1 0010 1101說(shuō)明:機(jī)器作減法運(yùn)算時(shí),先將減數(shù)求補(bǔ),然后轉(zhuǎn)化為加法運(yùn)算,所以實(shí)際上機(jī)器設(shè)置CF的方法是:最高有效位不產(chǎn)生進(jìn)位時(shí),CF=1;最高有效位產(chǎn)生進(jìn)位時(shí),CF=0。這和做減法時(shí)有借位CF=1,無(wú)借位CF=0是一致的。本例參加運(yùn)算的數(shù)無(wú)論是看作帶符號(hào)數(shù)還是無(wú)符號(hào)數(shù),運(yùn)算結(jié)果均有效。 0C8H66H=62H 1100 1000 1100 1000 條件碼設(shè)置:CF=0 0110 0110 + 1001 1010 OF=1- - 0110 0010 1 0110 0010說(shuō)明:如果是無(wú)符號(hào)數(shù)的運(yùn)算,被減數(shù)夠減無(wú)借位,所以CF置0,表明結(jié)果有效。如果操作數(shù)是帶符號(hào)數(shù),且被減數(shù)與減數(shù)符號(hào)相

26、反,而結(jié)果符號(hào)與減數(shù)符號(hào)相同,所以O(shè)F置1,表明結(jié)果無(wú)效。 54H-76H=0DEH0101 0100 0101 0100 條件碼設(shè)置:CF=1 0111 0110 + 1000 1010 OF=0 - -1101 1110 1101 1110說(shuō)明:如果是無(wú)符號(hào)數(shù)的運(yùn)算,本例中被減數(shù)減數(shù),減運(yùn)算向高位有借位(或加運(yùn)算無(wú)進(jìn)位),則CF置0,表明結(jié)果無(wú)效。如果是帶符號(hào)數(shù)的運(yùn)算,同符號(hào)數(shù)相減,OF置0,結(jié)果有效。 4BH0B6H=0DEH0100 1011 0100 1011 條件碼設(shè)置:CF=1 1011 0110 + 0100 1010 F=1 - -1001 0101 1001 0101說(shuō)明:

27、如果是無(wú)符號(hào)數(shù)的運(yùn)算,本例中被減數(shù)減數(shù),減運(yùn)算向高位有借位(或加運(yùn)算無(wú)進(jìn)位),則CF置0,表明結(jié)果無(wú)效。如果是帶符號(hào)數(shù)的運(yùn)算,不同符號(hào)數(shù)相減,且結(jié)果符號(hào)與減數(shù)符號(hào)相同,OF置1,結(jié)果也是無(wú)效的。例 分析下列程序的執(zhí)行情況:DATA_A DD 62562FAHDATA_B DD 412963BHRESULT DD ? MOV AX, WORD PTR DATA_A ; (AX)=62FAHSUBAX, WORD PTR DATA_B ; sub 963BH from AXMOVWORD PTR RESULT, AX ; save the resultMOVAX, WORD PTR DATA_A+

28、2 ; (AX)=0625HSBBAX, WORD PTR DATA_B+2 ; sub 0412H with borrowMOVWORD PTR RESULT, AX ; save the result答:SUB指令執(zhí)行后,(AX)= 62FAH963BH=0CCBFH,CF=1(有借位)。執(zhí)行SBB指令后,(AX)= 625H412H1=212H,CF=0,OF=0,因此,保存于RESULT的結(jié)果數(shù)據(jù)為0212CCBFH。  3 乘法指令MUL src 無(wú)符號(hào)數(shù)乘法(unsigned multiple)IMULsrc 帶符號(hào)數(shù)乘法(signed multiple)字節(jié)操作: (A

29、X) (AL)×(src)字操作: (DX, AX) (AX)×(src)MUL和IMUL指令的區(qū)別僅在于操作數(shù)是無(wú)符號(hào)數(shù)還是帶符號(hào)數(shù),它們的共同點(diǎn)是,指令中只給出源操作數(shù)src,它可以使用除立即數(shù)方式以外的任一種尋址方式。目的操作數(shù)是隱含的,它只能是累加器(字運(yùn)算為AX,字節(jié)運(yùn)算為AL)。隱含的乘積寄存器是AX或DX(高位)和AX(低位)。乘法指令只影響CF和OF,其它條件碼位無(wú)定義。無(wú)定義是指指令執(zhí)行后,條件碼位的狀態(tài)不確定,因此它們是無(wú)用的。MUL指令的條件碼設(shè)置為:CF OF= 0 0 乘積的高一半為0(字節(jié)操作的(AH)或字操作的(DX))CF OF= 1 1 乘

30、積的高一半不為0這樣的條件碼設(shè)置可以指出字節(jié)相乘的結(jié)果是8位(CF=0)還是16位(CF=1),字相乘的結(jié)果是16位(CF=0)還是32位(CF=1)。IMUL指令的條件碼設(shè)置為:CF OF= 0 0 乘積的高一半為低一半的符號(hào)擴(kuò)展CF OF= 1 1 其他情況符號(hào)擴(kuò)展是指做字節(jié)乘法時(shí),乘積低8位的最高位為0,高8位也擴(kuò)展為0,或者低8位的最高位為1,高8位也擴(kuò)展為1的情況。對(duì)兩個(gè)字相乘,符號(hào)擴(kuò)展是指乘積的低16位的最高位為0,高16位也擴(kuò)展為0,或者低16位的最高位為1,高16位也擴(kuò)展為1的情況。 例 無(wú)符號(hào)數(shù)乘法; from the data segmentDATA1 DB 25HDATA

31、2 DB 65HRESULTDW ?; from the code segmentMOV AL,DATA1MOV BL,DATA2MUL BL ; register addressing modeMOV RESULT,AXorMOV AL,DATA1MUL DATA2 ; direct addressing modeMOV RESULT,AXorMOV AL,DATA1MOV SI,OFFSET DATA2MUL BYTE PTR SI ;register indirect addressing modeMOV RESULT,AX本例25H×65H=0E99H,高16位不為0,所以C

32、F=1,OF=1。例DATA3 DW 2378HDATA4 DW 2F79HRESULT1 DW 2 DUP(?) MOV AX, DATA3 ; load first operand into AXIMUL DATA4 ; multiply it by the second operandMOV RESULT1, AX ; store the lower word resultMOV RESULT1+2, DX ; store the higher word result本例2378H×2F79H=0693 CBB8H,即(DX)=0693H,(AX)=0CBB8H。因?yàn)楦?6位不

33、是低16位的符號(hào)擴(kuò)展,所以條件碼設(shè)置為CF=1,OF=1。4 除法指令DIV src 無(wú)符號(hào)數(shù)除法(unsigned divide)IDIVsrc 帶符號(hào)數(shù)除法(signed divide)字節(jié)操作: (AL) (AX) / src 的商(AH) (AX) / src 的余數(shù)字操作: (AX) (DX, AX) / src 的商(DX) (DX, AX) / src 的余數(shù) 參加運(yùn)算的除數(shù)和被除數(shù)是無(wú)符號(hào)數(shù)時(shí),使用DIV指令,其商和余數(shù)也均為無(wú)符號(hào)數(shù)。IDIV指令執(zhí)行的操作與DIV相同,但操作數(shù)必須是帶符號(hào)數(shù),商和余數(shù)也均為帶符號(hào)數(shù),而且余數(shù)的符號(hào)與被除數(shù)的符號(hào)相同。這兩條除法指令的被除數(shù)必須

34、存放在AX或DX,AX中,源操作數(shù)src作為除數(shù),可用除立即數(shù)以外的任一種尋址方式來(lái)取得。除法指令對(duì)所有條件碼均無(wú)定義,因此對(duì)除法指令產(chǎn)生的錯(cuò)誤,如除數(shù)為0或商溢出等錯(cuò)誤,程序員都不能用條件碼進(jìn)行判斷,而是由系統(tǒng)直接轉(zhuǎn)入0型中斷來(lái)處理。所謂商溢出,是指被除數(shù)高一半的絕對(duì)值大于除數(shù)的絕對(duì)值時(shí),商超出了16位的表示范圍(字操作)或8位的表示范圍(字節(jié)操作)。由于使用除法指令的需要,經(jīng)常要將字節(jié)數(shù)據(jù)擴(kuò)展為字?jǐn)?shù)據(jù),或者將字?jǐn)?shù)據(jù)擴(kuò)展為雙字?jǐn)?shù)據(jù),所以我們先介紹下面的符號(hào)擴(kuò)展指令,然后再對(duì)除法指令舉例。3.3.2.5 符號(hào)擴(kuò)展指令CBW 字節(jié)擴(kuò)展為字(convert byte to word)執(zhí)行操作:(A

35、H)= 00H 當(dāng)(AL)的最高有效位為0時(shí)(AH)= FFH 當(dāng)(AL)的最高有效位為1時(shí)CWD 字?jǐn)U展為雙字(convert word to double word)執(zhí)行操作:(DX)=0000H當(dāng)(AX)的最高有效位為0時(shí)(AH)=FFFFH當(dāng)(AX)的最高有效位為1時(shí)這是兩條無(wú)操作數(shù)指令,進(jìn)行符號(hào)擴(kuò)展的操作數(shù)必須存放在AL寄存器或AX寄存器中。這兩條符號(hào)擴(kuò)展指令都不影響條件碼。注意:除法指令要求字操作時(shí),被除數(shù)必須為32位,除數(shù)是16位,商和余數(shù)是16位的;字節(jié)操作時(shí),被除數(shù)必須為16位,除數(shù)是8位,得到的商和余數(shù)是8位的。 例 假設(shè)(AX)= 0BA45H,下列指令分別執(zhí)行后的結(jié)果是

36、什么? CBW ; 執(zhí)行后,(AH)=00, (AL)=45H, 或 (AX)=0045H CWD ; 執(zhí)行后,(DX)=0FFFFH, (AX)=0BA45H 例 編寫(xiě)程序,分別實(shí)現(xiàn)下列數(shù)據(jù)的無(wú)符號(hào)除法和帶符號(hào)除法。 DATA7 DW 9400H ; numerator DATA8 DW 0060H ; denominator QUOT DW ? ; quotient REMAINDW ? ; remainder ; unsigned divideMOV AX,DATA7 ; AX holds numeratorMOV DX,0 ; (DX,AX)= 0000 9400HDIV DATA8

37、; unsigned divideMOV QUOT,AX ; quotient is in AX,(AX)=018AHMOV REMAIN,DX; remainder is in DX,(DX)=0040H ; signed divideMOV AX,DATA7 ; (AX)=9400HCWD ; (DX,AX)=0FFFF, 9400HIDIVDATA8; signed divideMOV QUOT,AX; quotient is in AX,(AX)=0FEE0HHMOV REMAIN,DX; remainder is in DX,(DX)=03.3.2.6 十進(jìn)制調(diào)整指令80x86微型機(jī)

38、提供了一組十進(jìn)制調(diào)整指令,用來(lái)處理ASCII碼和BCD碼表示的數(shù)。BCD碼:BCD(Binary Coded Decimal)是用二進(jìn)制編碼表示的十進(jìn)制數(shù)(見(jiàn)表3.3),十進(jìn)制數(shù)采用09十個(gè)數(shù)字,是人們最常用的。在計(jì)算機(jī)中,同一個(gè)數(shù)可以用兩種BCD格式來(lái)表示:壓縮的BCD碼 非壓縮的BCD碼壓縮的BCD碼:壓縮的BCD碼用4位二進(jìn)制數(shù)表示一個(gè)十進(jìn)制數(shù)位,整個(gè)十進(jìn)制數(shù)用一串BCD碼來(lái)表示。例如,十進(jìn)制數(shù)59表示成壓縮的BCD碼為0101 1001,十進(jìn)制數(shù)1946表示成壓縮的BCD碼為0001 1001 0100 0110。非壓縮的BCD碼:非壓縮的BCD碼用8位二進(jìn)制數(shù)表示一個(gè)十進(jìn)制數(shù)位,其中

39、低4位是BCD碼,高4位是0。例如,十進(jìn)制數(shù)78表示成壓縮的BCD碼為0000 0111 0000 1000。 從鍵盤(pán)輸入數(shù)據(jù)時(shí),計(jì)算機(jī)接收的是ASCII碼,要將ASCII碼表示的數(shù)轉(zhuǎn)換成BCD碼是很簡(jiǎn)單的,只要把ASCII碼的高4位清零即可。壓縮的BCD碼調(diào)整指令DAA和DAS指令完成加法和減法的調(diào)整功能。DAA 加法的十進(jìn)制調(diào)整(decimal adjust for addition)執(zhí)行操作:(AL) 把AL中的和調(diào)整為壓縮的BCD格式DAS 減法的十進(jìn)制調(diào)整(decimal adjust for subtraction)執(zhí)行操作:(AL) 把AL中的差調(diào)整為壓縮的BCD格式DAA和DA

40、S指令的調(diào)整方法如下:執(zhí)行加法指令(ADD、ADC)或減法指令(SUB、SBB)后,1如果結(jié)果的低4位 (AL)039或AF=1,則(AL)(AL)±06H,且AF置1;2如果結(jié)果的高4位 (AL)479或CF=1,則(AL)(AL)±60H,且CF置1。對(duì)上述方法,加法調(diào)整作+06H和+60H,減法調(diào)整作06H和60H。這兩個(gè)調(diào)整的條件,如果滿足其一,則±06H或±60H;如果同時(shí)滿足,則±06H后,再±60H。非壓縮的BCD碼調(diào)整指令A(yù)AA 加法的ASCII調(diào)整(ASCII adjust for add)執(zhí)行操作:(AL) 把AL

41、中的和調(diào)整為非壓縮的BCD格式(AH)(AH)+ 調(diào)整產(chǎn)生的進(jìn)位值A(chǔ)AS 減法的ASCII調(diào)整(ASCII adjust for sub)執(zhí)行操作:(AL) 把AL中的差調(diào)整為非壓縮的BCD格式(AH)(AH) 調(diào)整產(chǎn)生的借位值加法和減法的操作數(shù)可以直接使用ASCII碼,而不必把高位0011清為0000,AAA和AAS指令就是專(zhuān)門(mén)為ASCII碼操作數(shù)或非壓縮BCD碼操作數(shù)的加減法而設(shè)計(jì)的。AAA和AAS的調(diào)整方法如下:執(zhí)行加法指令(ADD、ADC)或減法指令(SUB、SBB)后,結(jié)果存放在AL寄存器中:(1)如果(AL)03= 09,且AF=0,則(AL)47= 0,AF的值送CF;(2)如果

42、(AL)03=AF,或AF=1,則(AL)(AL)±06H,(AL)47= 0,(AH)(AH)±1,AF的值送CF。AAA和AAS指令除影響AF和CF標(biāo)志外,其余標(biāo)志位均無(wú)定義。AAM 乘法的ASCII調(diào)整(ASCII adjust for mul)執(zhí)行操作:(AX) 把AX中的積調(diào)整為非壓縮的BCD格式AAD 除法的ASCII調(diào)整(ASCII adjust for div)執(zhí)行操作:(AX) AX中的被除數(shù)(非壓縮的BCD格式)轉(zhuǎn)化為二進(jìn)制數(shù)以上兩條指令是專(zhuān)為非壓縮的BCD碼的乘除法而設(shè)計(jì)的,它們將乘法和除法的結(jié)果轉(zhuǎn)換為非壓縮的BCD碼。注意:AAM和AAD都只對(duì)AX寄

43、存器中的數(shù)進(jìn)行調(diào)整,它們只影響SF、ZF和PF標(biāo)志位,其它標(biāo)志位無(wú)定義。AAM的調(diào)整方法為:執(zhí)行乘法指令(MUL)后,調(diào)整存放在AL寄存器中的乘積:(AH)(AL)/ 0AH的商(AL)(AL)/ 0AH的余數(shù)AAM實(shí)際上是將兩個(gè)一位數(shù)的非壓縮BCD碼相乘后得到的乘積進(jìn)行二化十的轉(zhuǎn)換,十位數(shù)放在AH中,個(gè)位數(shù)放在AL中,那么AX中就是乘積的非壓縮BCD碼。注意:如果是兩個(gè)ASCII碼數(shù)相乘,要先將它們轉(zhuǎn)換成非壓縮BCD碼。AAD的調(diào)整方法為:執(zhí)行除法指令之前,對(duì)AX中的非壓縮BCD碼(被除數(shù))執(zhí)行:(AL)(AH)×10(AL)(AH) 0與其它調(diào)整指令不同的是,AAD用在DIV指令

44、之前,即先將AX中的被除數(shù)調(diào)整成二進(jìn)制數(shù),并存放在AL中,再用DIV指令作二進(jìn)制數(shù)的除法。AX中的被除數(shù)是二位非壓縮BCD碼,AH中的十位數(shù)乘10,再加上AL中的個(gè)位數(shù),即轉(zhuǎn)換為二進(jìn)制數(shù)。表3.3 ASCII和BCD碼十進(jìn)制數(shù)字ASCII碼壓縮BCD碼非壓縮BCD碼00011 000000000000 000010011 000100010000 000120011 001000100000 001030011 001100110000 001140011 010001000000 010050011 010101010000 010160011 011001100000 011070011

45、011101110000 011180011 100010000000 100090011 100110010000 1001例 ASCII碼轉(zhuǎn)換為BCD碼。ASC DB '9562481273' ; ASCII stringORG 0010HUNPACKDB 10 DUP(?); store BCD number MOV CX,10 ; load the counterSUB BX,BX ; clear BXAGAIN:MOV AL,ASCBX; move to AL content of mem BX+ASCAND AL,0FH ; mask the upper nibbl

46、eMOV UNPACKBX,AL ; move to mem BX+UNPACK the ALNC BX ; make the pointer to point at next ASCII numberLOOP AGAIN ; loop until finished上例中的AND指令完成邏輯與操作,AL寄存器的內(nèi)容和0FH相與,結(jié)果使ASCII碼的高4位清零,低4位保持不變,于是一個(gè)ASCII碼數(shù)就轉(zhuǎn)換成了BCD碼。 例 編寫(xiě)程序,實(shí)現(xiàn)BCD數(shù)據(jù)的加法和減法。 BCD3BCD1BCD2 ; BCD3=27841839=4623 BCD3BCD1BCD2 ; BCD3=27841839=0945編寫(xiě)程序如下:DATA SEGEMENTBCD1 DB 84H,27H ; BCD format of 2784BCD2 DB 39H,18H ; BCD format

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論