版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、五章80868088指令系統(tǒng)五章80868088指令系統(tǒng)第一節(jié)指令格式和尋址方式一、指令格式二、指令助記符三、尋址方式(一)指令地址的尋址方式(二)操作數(shù)地址尋地方式第一節(jié)指令格式和尋址方式一、指令格式一、指令格式指令是計(jì)算機(jī)用以控制各部件協(xié)調(diào)動(dòng)作的命令指令字是一種二進(jìn)制代碼,它包括兩個(gè)基本部分:操作碼和地址碼。操作碼提供的是操作控制信息,指明計(jì)算機(jī)應(yīng)執(zhí)行什么性質(zhì)的操作,如進(jìn)行+、-、等;地址碼提供參加運(yùn)算操作數(shù)據(jù)的存放地址(即操作數(shù)地址)。只提供一個(gè)操作數(shù)地址的指令,稱為單操作數(shù)指令;提供二個(gè)操作數(shù)地址的指令,稱為雙操作數(shù)指令;不提供操作數(shù)地址的指令,稱為無(wú)操作數(shù)指令。無(wú)操作數(shù)指令只有操作碼
2、部分,它的格式為 其中為操作碼。一、指令格式指令是計(jì)算機(jī)用以控制各部件協(xié)調(diào)動(dòng)作的命令這種指令表示只進(jìn)行某種操作,無(wú)需操作數(shù),如控制機(jī)器的運(yùn)行狀態(tài),暫停(HALT)等,就屬于無(wú)操作數(shù)指令。單操作數(shù)指令格式為 其中為操作碼;D為目標(biāo)操作數(shù)地址,簡(jiǎn)稱目標(biāo)地址。這種指令表示對(duì)目標(biāo)地址D中的內(nèi)容,按操作碼規(guī)定進(jìn)行操作,結(jié)果送目標(biāo)地址。雙操作數(shù)指令格式為 其中,為操作碼,D為目標(biāo)地址,S為源地址(即作數(shù)地址)。這種指令表示對(duì)源地址和目標(biāo)地址中的內(nèi)容,按操作碼規(guī)定的操作進(jìn)行操作,結(jié)果送目標(biāo)地址,即DDS。這種指令表示只進(jìn)行某種操作,無(wú)需操作數(shù),如控制機(jī)器的運(yùn)行狀態(tài)在微型機(jī)中,一般采用可變字長(zhǎng)指令。也就是說(shuō),
3、不同的指令用不同長(zhǎng)度來(lái)表示,但都是字節(jié)的整倍數(shù)。如一字節(jié)、二字節(jié)、三字節(jié)和四字節(jié)指令等。它們?cè)诖鎯?chǔ)器中分別占有14個(gè)存儲(chǔ)單元,其格式如下:?jiǎn)巫止?jié)指令: 操作碼 7 6 5 4 3 2 1 0 在微型機(jī)中,一般采用可變字長(zhǎng)指令。也就是說(shuō),不同的指令用不同 雙字節(jié)指令: 第一字節(jié): 操作碼 第二字節(jié): 操作數(shù)或地址 雙字節(jié)指令: 三字節(jié)指令: 第一字節(jié): 操作碼 第二字節(jié): 操作數(shù)或地址低位 第三字節(jié): 操作數(shù)或地址高位 或: 第一字節(jié): 操作碼 第二字節(jié): 操作碼 第三字節(jié): 操作數(shù)或地址 三字節(jié)指令: 四字節(jié)指令: 第一字節(jié): 操作碼 第二字節(jié): 操作碼 第三字節(jié): 操作數(shù)或地址地位 第四字節(jié)
4、: 操作數(shù)或地址高位 四字節(jié)指令:二、指令助記符機(jī)器指令是二進(jìn)制代碼,二進(jìn)制代碼不易辨識(shí)和記憶。因此,在介紹機(jī)器指令時(shí),除非必要情況下用二進(jìn)制代碼,一般情況下使用指令助記符。指令助記符由操作碼和操作數(shù)的助記符號(hào)表示。通常操作碼用英文單詞或英文縮寫(xiě)單詞來(lái)表示如:ADD,JP(Jump)等。操作數(shù)用表示寄存器存儲(chǔ)器地址的符號(hào)來(lái)表示。我們首先來(lái)學(xué)習(xí)操作數(shù)部分的符號(hào),然后結(jié)合指令來(lái)學(xué)習(xí)表示操作碼的符號(hào)。用助記符來(lái)表示的指令又稱為指令的匯編格式。二、指令助記符機(jī)器指令是二進(jìn)制代碼,二進(jìn)制代碼不易辨識(shí)和記憶指令中要出現(xiàn)的符號(hào)介紹如下:AX,BX,CX,DX 16位通用寄存器AH,BH,CH,DH,AL,B
5、L,CL,DL 8位通用寄存器CS,DS,ES,SS 段寄存器SP,BP ,IP 堆棧指針,基址指針,指令指針DI,SI 目的,源變址寄存器Flags 標(biāo)志寄存r r=AX、BX、CX、DX r=AL、BL、CL、DLa( acc) a=AX AL指令中要出現(xiàn)的符號(hào)介紹如下:Seg seg=CS、DS、ES、SSSrc( source)、dst( dest)源操作數(shù)、目的操作數(shù)Count 計(jì)數(shù)器Oprd 操作數(shù)Im 立即數(shù) n 8位 nn 16位nnnn 32位EA 有效地址Seg seg=三、尋址方式數(shù)據(jù)和程序在存儲(chǔ)器中的位置,稱為地址。存放指令的地址,稱為指令地址;存放數(shù)據(jù)的地址,稱為操作
6、數(shù)地址,簡(jiǎn)稱操作地址。尋找指令地址和操作數(shù)地址的方式,統(tǒng)稱為尋址方式。形成指令地址和操作數(shù)地址的過(guò)程,稱為尋址過(guò)程。(一)指令地址的尋址方式(二)操作數(shù)地址尋地方式三、尋址方式數(shù)據(jù)和程序在存儲(chǔ)器中的位置,稱為地址。存放指令的(一)指令地址的尋址方式在微機(jī)中,指令地址的尋址方式比較簡(jiǎn)單,通常是在CPU中設(shè)置程序計(jì)數(shù)器PC,PC中的內(nèi)容就是指令地址。在一般情況下,程序是順序執(zhí)行的,程序在存儲(chǔ)器中也是按順序存放的。這時(shí),只要將程序計(jì)數(shù)器中的內(nèi)容自動(dòng)遞增,就可以形成下一條指令地址。當(dāng)需要改變程序的執(zhí)行順序時(shí),要使用轉(zhuǎn)移指令,由轉(zhuǎn)移指令給出轉(zhuǎn)移后指令字的起始地址。將此地址送到程序計(jì)數(shù)器,就形成了轉(zhuǎn)移后的
7、地址。然后,程序計(jì)數(shù)器中的內(nèi)容又自動(dòng)遞增,直到再次發(fā)生轉(zhuǎn)移為止。(一)指令地址的尋址方式在微機(jī)中,指令地址的尋址方式比較簡(jiǎn)單(二)操作數(shù)地址尋地方式微機(jī)在工作時(shí),指令地址在程序執(zhí)行過(guò)程中時(shí)自動(dòng)形成的,但指令所需的操作數(shù)地址是隨機(jī)的,要根據(jù)指令的規(guī)定求得,獲得操作數(shù)地址的方式,稱為操作數(shù)尋址方式,有時(shí)也把它稱為尋址方式。在操作數(shù)尋址方式中,除了涉及BP的尋址方式外,一般尋址均在數(shù)據(jù)段內(nèi)(段地址由DS提供),在涉及BP時(shí),則使用堆棧段(段地址由SS提供),在執(zhí)行串操作時(shí),使用附加段ES。在各種尋址方式中,以立即數(shù)和存儲(chǔ)器直接尋址方式,速度最快,因?yàn)榇藭r(shí)8086/8088的執(zhí)行單元EU可以立即從寄存
8、器中或指令隊(duì)列中取出操作數(shù),而無(wú)須再由總線執(zhí)行單元計(jì)算出有效的20位地址,然后再去取操作數(shù)。(二)操作數(shù)地址尋地方式微機(jī)在工作時(shí),指令地址在程序執(zhí)行過(guò)程立即數(shù)尋址在指令中直接給出一個(gè)常數(shù)作為操作數(shù),如: MOV AX,200表示將常數(shù)200送到存儲(chǔ)器AX中,要注意的是在16位操作中,直接數(shù)的取值范圍為32767(7FFFH)到-32768(8000H),當(dāng)為無(wú)符號(hào)數(shù)時(shí)則為0-65535(0FFFFH),對(duì)8位數(shù)應(yīng)為0-255(OFFH),符號(hào)數(shù)為127(7FH)到-128(80H)。立即數(shù)尋址在指令中直接給出一個(gè)常數(shù)作為操作數(shù),如:2.寄存器直接尋址指令中的寄存器存放了操作數(shù),如: ADD C
9、X,BX表示將BX中的值直接相加,然后送到CX中去。2.寄存器直接尋址指令中的寄存器存放了操作數(shù),如:3.寄存器間接尋址在指令中,有操作數(shù)的地址,將該地址同左移4位后的DS值相加,即可得到20位物理地址,從該地址中取出操作數(shù)進(jìn)行指令所要求的操作,這種尋址方法稱為直接尋址,通常該類(lèi)指令中,操作數(shù)的地址用標(biāo)號(hào)表示,例如:ADD AX、TABLE表示將AX中的值和TABLE表示的地址中的內(nèi)容相加,和放在AX中。8086/8088按字存放內(nèi)容時(shí),低字節(jié)方在低地址中,高字節(jié)跟隨其后,方在高地址中。3.寄存器間接尋址在指令中,有操作數(shù)的地址,將該地址同左移45.變址尋址將指令中指令的變址寄存器的內(nèi)容加上偏
10、移值,即成為操作的地址,例如:MOV DI,4MOV AX,TABLEDI表示偏移值TABLE加4(DI的內(nèi)容)作為操作數(shù)地址,取出操作數(shù)送AX。這種尋址方式通常用于讀寫(xiě)表中的元素,如TABLE偏移值表示的首址,加4表示將表中的第三個(gè)量(16位)送AX,讀寫(xiě)數(shù)組元素也采用此法。5.變址尋址將指令中指令的變址寄存器的內(nèi)容加上偏移值,即成為6.基址尋址同變址類(lèi)似,不過(guò)這種尋址中使用基址寄存器BX、BP代替變址寄存器DI和SI。它是將基址寄存器的內(nèi)容加上偏移量而作為操作數(shù)地址的,例如:MOV AX,BX+6表示BX作為基址,距其偏移6字節(jié)的地址便是操作數(shù)地址,在這種尋址中BX基址對(duì)應(yīng)的段地址在當(dāng)前數(shù)
11、據(jù)段中,若基址是BP,則操做數(shù)在堆棧段內(nèi)。IBM匯編允許用三種形式指定基址尋址,它們的效果是一樣的,如:MOV AX,BX+6 ;標(biāo)準(zhǔn)格式MOV AX,6BX ;先寫(xiě)偏移值MOV AX,BX+6 ;偏移值寫(xiě)在括號(hào)內(nèi)6.基址尋址同變址類(lèi)似,不過(guò)這種尋址中使用基址寄存器BX、B7.基址變址尋址基址變址尋址時(shí),操作數(shù)地址是由一個(gè)基址寄存器的內(nèi)容,一個(gè)變址寄存器的內(nèi)容及偏移值(是任選項(xiàng),也可不用)相加和,例如:MOV AX,6BPSI表示距棧頂6個(gè)字節(jié)處作為基址,然后以SI內(nèi)容為相對(duì)基址的偏移作為操作地址,這種尋址方式在訪問(wèn)堆棧數(shù)組時(shí)很有用,如基址為棧頂,則變址寄存器中的值表示堆棧中的相應(yīng)元素。這種尋
12、址方式也多用于對(duì)二維數(shù)組的訪問(wèn),如用BX作為數(shù)組的首地址,變址寄存器及偏移值作為數(shù)組行和列的值,依次尋址,就可找到某個(gè)二維數(shù)組元素。7.基址變址尋址基址變址尋址時(shí),操作數(shù)地址是由一個(gè)基址寄存器第二節(jié)數(shù)據(jù)傳送指令8086/8088有92條指令,按其功能可分為6個(gè)功能組: 1.數(shù)據(jù)才傳送2.算術(shù)運(yùn)算 3.邏輯運(yùn)算 4.串操作 5.控制傳送 6.處理器控制第二節(jié)數(shù)據(jù)傳送指令8086/8088有92條指令,按其功能 數(shù)據(jù)傳送指令又可分為以下七種: (1)通用數(shù)據(jù)傳送指令MOV (2)堆棧操作指令 (3)交換指令 (4)標(biāo)志寄存器傳送指令 (5)輸入輸出指令 (6) 地址目的傳送指令 (7)查表轉(zhuǎn)換指令
13、 這類(lèi)指令用來(lái)在寄存器和存儲(chǔ)單元或輸入/輸出端口傳送數(shù)據(jù)或地址,表5.2.1列出這7種指令: 數(shù)據(jù)傳送指令又可分為以下七種:匯編格式 操作MOV dest,source 傳送一個(gè)字節(jié)或字PUSH source 壓一個(gè)字進(jìn)棧POP dest 彈一個(gè)字進(jìn)棧PUSHF 壓標(biāo)志寄存器進(jìn)棧POPF 彈標(biāo)志寄存器出棧XCHG op1,op2 交換兩個(gè)字節(jié)或字LAHF 將標(biāo)志寄存器內(nèi)容裝入AH中(裝右字節(jié))SAHF 將AH寄存器內(nèi)容存到標(biāo)志寄存器(右字節(jié))IN acc,port 從端口輸入字節(jié)或字到累加器OUT port,acc 從累加器輸出一個(gè)字節(jié)或字到端口LEA dest,source 裝入有效地址,即
14、將存儲(chǔ)器操作數(shù)偏 移地址送目的寄存器LDS dest,source 將段地址裝入DS中,偏移地址裝入 目的寄存器LES dest,source 將段地址裝入ES中,偏移地址裝入目 的寄存器 XLAT 查表轉(zhuǎn)換匯編格式 、MOV指令MOV指令是最基本的通用傳送指令,它把一個(gè)字節(jié)或一個(gè)字從源傳送到目的。這條指令可實(shí)現(xiàn)下述操作:MOV nn,a ;(nn) aMOV a,nn ;a(nn)MOV seg,src ;segsrcMOV dst,seg ;dstsegMOV r,src ;rsrcMOV dst,r ;dstrMOV dst,im ;dstim、MOV指令MOV指令是最基本的通用傳送指令
15、,它把一個(gè)字節(jié)MOV指令可以在寄存器與存儲(chǔ)單元之間,寄存器和寄存器之間傳送字節(jié)或字,也可以將一個(gè)立即數(shù)送寄存器或存儲(chǔ)單元,例如:MOV AX,TABLE ;TABLE存儲(chǔ)地址傳送到AXMOV TABLE,DX ;從DX傳送到存儲(chǔ)地址MOV ES;BX,AX ;指定段寄存器到ES,而不用DSMOV DS,AX ;寄存器間16位數(shù)傳送MOV DL,AL ;8位寄存器間傳送MOV CL,30 ;常數(shù)送寄存器MOV TABLE,05H ;常數(shù)送存儲(chǔ)單元MOV指令可以在寄存器與存儲(chǔ)單元之間,寄存器和寄存器之間傳送2、堆棧操作指令目前,微計(jì)算機(jī)一般都是把內(nèi)存的一個(gè)區(qū)域作為堆棧。這個(gè)堆棧按照后進(jìn)先出的原則組
16、織一段內(nèi)存區(qū)域,由堆棧指針指出它在存儲(chǔ)器中的位置。8086/8088用段寄存器SS和堆棧指針SP指示堆棧在內(nèi)存的位置,這個(gè)堆棧長(zhǎng)度為64KB,因此SP為16位指針的單元。8086/8088規(guī)定SP始終指向堆棧的頂部,即始終指向最后壓入堆棧的信息所在的單元。8086/8088的堆棧是下推式,即隨著壓入堆棧的內(nèi)容的增加,SP的值減小。SP的初值可由MOV SP,im指令來(lái)設(shè)定。堆棧操作指令包括入棧指令和出棧指令。2、堆棧操作指令目前,微計(jì)算機(jī)一般都是把內(nèi)存的一個(gè)區(qū)域作為堆(1)入棧指令 PUSH oprd 入棧指令完成將16位的數(shù)據(jù)送入堆棧的操作,具體入棧指令如下:PUSH r ;(SP) r,S
17、PSP-2PUSH seg ;(SP) seg,SPSP-2PUSH src ;(SP) src,SPSP-2(1)入棧指令 (2) 出棧指令 POP oprd出棧指令完成將16位的數(shù)據(jù)從堆棧彈出的操作,具體出棧指令如下:POP r ;r(SP),SPSP+2POP seg ;seg(SP),SPSP+2POP dst ;dst(DP),SPSP+2(2) 出棧指令 入棧時(shí),把一個(gè)字從上述操作數(shù)傳送到已由SP指向的堆棧頂部,同時(shí)修改SP的值,使SP指向新的棧項(xiàng)單元。出棧時(shí),把堆棧頂部的一個(gè)字,傳送到指定的目標(biāo)操作數(shù),同時(shí)修改SP的值,使SP指向新的棧頂單元。PUSH和POP指令提供一個(gè)先進(jìn)后出
18、的堆棧結(jié)構(gòu),它們用SS棧寄存器來(lái)指向棧的段地址,用SP堆棧指針來(lái)指向棧頂位置,當(dāng)執(zhí)行PUSH指令時(shí),SP減2后,將源操作數(shù)(一個(gè)字)壓入棧內(nèi),相反POP指令則將當(dāng)時(shí)SP所指定的堆棧中的字取出到目的操作數(shù),然后SP加2。入棧時(shí),把一個(gè)字從上述操作數(shù)傳送到已由SP指向的堆棧頂部,同PUSH和POP指令提供了一種存儲(chǔ)的技巧,例如可用于數(shù)據(jù)交換,將DS的值傳給ES,使數(shù)據(jù)段和附加段指向同一個(gè)段地址:PUSH DSPOP ES又如在程序中要用到某一寄存器,它的值在程序中某一段將被改變,而后面又要用到它,且需要它的原先值,可采用如下方法:PUSH AX ;將AX值存入堆棧 ;AX的值被改變的程序段POP
19、AX ;再取回AX的原先值PUSH和POP指令提供了一種存儲(chǔ)的技巧,例如可用于數(shù)據(jù)交換(3)PUSHF和POPF指令PUSHF和POPF是將標(biāo)志寄存器內(nèi)容入棧和出棧,這兩種指令在調(diào)用子程序,保存標(biāo)志寄存器內(nèi)容時(shí)常用到,即在調(diào)用前標(biāo)志寄存器入棧,返回主程序時(shí),恢復(fù)其值。另外,當(dāng)標(biāo)志寄存器TF位為1時(shí),8086/8088在每執(zhí)行一條指令后,便執(zhí)行一條1型中斷指令,即指令執(zhí)行變成單步方式,這在調(diào)試程序時(shí)可用到,以便跟蹤每條指令執(zhí)行情況。由于沒(méi)有任何一條指令能使TF變成1,但這可用下面的方法實(shí)現(xiàn):PUSHF ;標(biāo)志進(jìn)棧POP AX ;標(biāo)志值送AXOR AX ,0100H ;使TF位置1PUSH AX
20、;AX進(jìn)棧 POPF ;將AX值送到標(biāo)志寄存器若要恢復(fù)TF=0,則可將OR AX,0100H換成AND AX,0FEFFH來(lái)清除TF。(3)PUSHF和POPF指令3、交換指令具體的指令如下: XCHG AX,r ;AX r XCHG r,src ;r src XCHG指令用于交換源操作數(shù)和目的操作數(shù)的內(nèi)容,源和目的操作數(shù)可以在寄存器或單元中,但不能同為存儲(chǔ)單元,段寄存器也不能用作操作數(shù)。下面是寄存器交換例如: MOV AX, 50 MOV BX,10 XCHG AX,BX ;現(xiàn)在AX=10,BX=503、交換指令具體的指令如下:4標(biāo)志寄存器傳送指令LAHF和SAHFLAHF指令是將標(biāo)志寄存其
21、中標(biāo)志CF.PF.AF.ZF.和SF分別送到AH的0.2.4.6.7位,而SAHF指令卻相反,它是將AH的相應(yīng)位內(nèi)容送到標(biāo)志寄存器的CF、PF、AF、ZF和SF位。4標(biāo)志寄存器傳送指令LAHF和SAHFLAHF指令是將標(biāo)志5.輸入輸出指令I(lǐng)N和OUTIN和OUT指令用來(lái)讀寫(xiě)I/O口,8086/8088可尋址的口地址可達(dá)64K個(gè),口地址可用DX或立即數(shù)表示,如用立即數(shù),則僅能尋址0-FFH,讀寫(xiě)的數(shù)據(jù)必須從AX中接收或傳送,例如:IN AL,2FH ; 從2FH口輸入一個(gè)字節(jié)到ALOUT 5,AL ; 將AL中的數(shù)送到5口中去MOV DX,3FCH ;3FCH口地址送DXIN AX,DX ; 從
22、3FCH口讀一個(gè)字到AX中這類(lèi)指令在接口技術(shù)中使用較多,當(dāng)讀寫(xiě)一個(gè)字時(shí),先是低字節(jié),然后是高字節(jié)(因?yàn)閿?shù)據(jù)總線是8位,所以必須分兩次讀寫(xiě)),如從3FCH口讀一個(gè)字時(shí),實(shí)際上從3FCH口讀一個(gè)字節(jié)到AL中去.然后從3FCH口再讀一個(gè)字節(jié)到AH中去。5.輸入輸出指令I(lǐng)N和OUTIN和OUT指令用來(lái)讀寫(xiě)I/O口6.地址-目標(biāo)傳送指令8086/8088有三條地址-目標(biāo)傳送指令: LEA r,src LDS r,src LES r,src LEA指令將一個(gè)儲(chǔ)儲(chǔ)器中數(shù)據(jù)的偏移地址送到任一個(gè)通用寄存器.指針寄存器或變址寄存器,例如: LEA BX,TABLEDI 將把TABLE+DI的偏移地址送到BX中.
23、LDS指令將從指定的存儲(chǔ)器地址中取出一個(gè)32位的雙倍字,將其低16位送到指定的字寄存器,而將高16位送到DS,例如:6.地址-目標(biāo)傳送指令8086/8088有三條地址-目標(biāo)傳送 LDS BX,ARRAY ARRAY假如為一個(gè)雙倍字長(zhǎng)的字,比如是代表一個(gè)物理地址的變量,執(zhí)行此指令后將ARRAY高二字節(jié)表示的段地址送入DS中,而將其低二字節(jié)表示的偏移地址送入BX中,這相當(dāng)執(zhí)行了三條指令: MOV BX,ARRAY MOV AX,ARRAY+2 MOV DS,AX LES指令將段地址送入ES中,其別的功能同LDS. LDS BX,ARRAY7.查表轉(zhuǎn)換指令XLATXLAT指令可進(jìn)行查表操作此表可達(dá)2
24、56個(gè)字節(jié).使用該指令時(shí),將表的起始地址送入BX中,將表的位移值(即要查表的位置)送入AL中.。然后執(zhí)行XLAT指令,則將查到的值存入AL中.7.查表轉(zhuǎn)換指令XLATXLAT指令可進(jìn)行查表操作此表可達(dá)2第三節(jié)算術(shù)運(yùn)算指令8086/8088有加、減、乘、除四種基本的運(yùn)算指令,這些指令可用于字節(jié)或字運(yùn)算,可用于帶字號(hào)數(shù)與無(wú)符號(hào)數(shù)的運(yùn)算。如果是符號(hào)數(shù),則用補(bǔ)碼表示。大部分指令操作影響標(biāo)志寄存器響應(yīng)位。算術(shù)運(yùn)算指令如表5.3.1所示8086/8088提供各種矯正操作指令,這些矯枉正操令與二進(jìn)制算術(shù)運(yùn)算指令配合使用,使得8086/8088也能進(jìn)行十進(jìn)制算術(shù)運(yùn)算。十進(jìn)制數(shù)不帶符號(hào),可用壓縮十進(jìn)制數(shù)(BCD
25、),或非壓縮型十進(jìn)制表示,前者每個(gè)字可包含兩個(gè)用場(chǎng)4位二進(jìn)制碼表示的十進(jìn)制數(shù),即十進(jìn)制數(shù)的范圍為0099;對(duì)非壓縮型的數(shù),則一個(gè)字節(jié)僅表示一個(gè)十進(jìn)制數(shù)即09,字節(jié)的高4位在作乘除運(yùn)算時(shí)必須為0 ,加減時(shí)可任意。第三節(jié)算術(shù)運(yùn)算指令8086/8088有加、減、乘、除四種基1、加減法運(yùn)算指令 、2、比較指令3、INC、DNC、NEC指令4、乘法與除法指令MUL、IMUL、DIV、IDIV5、CBW與CWD指令6十進(jìn)調(diào)整指令1、加減法運(yùn)算指令 、五章80868088指令系統(tǒng)五章80868088指令系統(tǒng)1、加減法運(yùn)算指令 、加法指令帶進(jìn)位加法指令減法指令帶借位減法指令1、加減法運(yùn)算指令 、加法指令()、
26、加法指令 , ; , ; , ; , ;()、加法指令 , ;()帶進(jìn)位加法指令 , ; , ;A D C , ;A D C , ;其中為進(jìn)位標(biāo)志的現(xiàn)行值。()帶進(jìn)位加法指令 , ;()減法指令SUB , ;SUB , ;SUB , ; SUB , ; ()減法指令SUB , ;(4) 帶借位減法指令SBB r, src ; r r src cSBB a,im ; a a im c SBB dst,im ; dst dstimcSBB dst,r ; dst dstrc其中c為借位標(biāo)志的現(xiàn)行值(4) 帶借位減法指令SBB r, src 、均是作加減運(yùn)算的指令,其功能是源操作數(shù)與目的操作數(shù)進(jìn)行相
27、加或相減,而與的差別是為帶進(jìn)位的加,同樣是帶借位的減,源操作數(shù)可以在寄存器、存儲(chǔ)器中或立即數(shù),目的操作數(shù)可以在寄存器、存儲(chǔ)器中。這些指令運(yùn)算的結(jié)突目的操作數(shù)中。上述指令可完成位(字節(jié))或位運(yùn)算超過(guò)位則需多條指令。比如操作數(shù)長(zhǎng)度大于位的加法,用下面的指令 , ;低位相加 , ;帶低位進(jìn)位的高位相加這兩條指令將把和中的位數(shù)加到和中的位數(shù)中,縣后面的一條指令,還將低位的進(jìn)位也一起加上,結(jié)果在和中。又比如操作數(shù)長(zhǎng)度大于位的減法,可用下面的指令、均是作加減運(yùn)算的指令,其功能是 , ;低位相減 , ;帶低位借位的高位相減作減法時(shí),不僅和相減,還要減去上條指令執(zhí)行相減后的借位,最后的結(jié)果低位將在中,高位將在
28、中。這類(lèi)指令不能用于存儲(chǔ)單元容的加減,也不能用立即數(shù)作為目的操作數(shù)。它們的運(yùn)算結(jié)果均將影響標(biāo)志寄存器的、和。 , ;低位相減、比較指令比較指令完成兩個(gè)操作數(shù)加減,使結(jié)果反映到標(biāo)志位上,并不送回相減的差值。指令格式如下:CMP , ;CMP , ; CMP , ;CMP , ;指令是比較指令,用于目的操用數(shù) 與源操用數(shù) 進(jìn)行比較,即相減,類(lèi)似于指令,但不同的是,該指令不保存相減的結(jié)果,因而不變操作數(shù) ,它僅影響標(biāo)志寄存器,表.示出了比較指令影響標(biāo)志位的情況。、比較指令比較指令完成兩個(gè)操作數(shù)加減,使結(jié)果反映到標(biāo)五章80868088指令系統(tǒng)一般在使用指令時(shí),后面總是跟著一條條件轉(zhuǎn)移命令,跟據(jù)比較結(jié)果
29、標(biāo)志位的情況決定程序的執(zhí)行方向,由表.可看出:兩位比較要等用零標(biāo)志位ZF,若ZF1則表示相等。不帶符號(hào)數(shù)比較大小時(shí),當(dāng)借位標(biāo)志CF1時(shí),說(shuō)明源目的,否則目的源。帶符號(hào)數(shù)比較大小時(shí),用符號(hào)標(biāo)志SF與溢出OF半加(異或)來(lái)判斷,若SFOF1,則源目的,否則源目的。例如:CMP AX,8000H ;AX 與8000H相比較JL AGAIN ;如AX小于8000H則轉(zhuǎn)AGAIN當(dāng)CMP執(zhí)行后,若SFOF時(shí),(即SFCF1),即源目的,則轉(zhuǎn)移。一般在使用指令時(shí),后面總是跟著一條條件轉(zhuǎn)移命令,跟據(jù)比3、INC、DNC、NEC指令I(lǐng)NC和DEC指令僅有一個(gè)操作數(shù),其操作可以是位或位的通用寄存器值,也可以是存
30、儲(chǔ)單元中的數(shù),將執(zhí)行操作數(shù)加的操作,指令將執(zhí)行操作數(shù)減的操作,結(jié)果仍送回操作的位置中去。這兩條指令操作結(jié)果均不影響CF標(biāo).。NEC指令為求補(bǔ)指令,它是從零中減去操作數(shù),形成2 的補(bǔ),操作數(shù)僅有一個(gè),可以是寄存器的破除儲(chǔ)存單元的數(shù)。例如:NEC DATADATA存儲(chǔ)單元內(nèi)設(shè)有數(shù)為00000101,則執(zhí)行該指令后,其內(nèi)容就變?yōu)?1111011。3、INC、DNC、NEC指令I(lǐng)NC和DEC指令僅有一個(gè)操作當(dāng)從一個(gè)立卻數(shù)中減去寄存器或存儲(chǔ)器中的數(shù)時(shí),不能用SUB指令,但可以減數(shù)變補(bǔ),然后再和其相加得到減的果,如立即數(shù)為100,則可用如下命令:NEG ALADD AL,100當(dāng)從一個(gè)立卻數(shù)中減去寄存器或
31、存儲(chǔ)器中的數(shù)時(shí),不能用SUB指令4、乘法與除法指令MUL、IMUL、DIV、IDIV8088提供乘法與除法指令,具體指令格式如下:MUL src ; AXAL*src(無(wú)符號(hào)數(shù))MUL src ; DX、AXAX*src(無(wú)符號(hào)數(shù))IMUL src ; AXAL*src(符號(hào)數(shù))IMUL src ; DX 、AXAX*src(符號(hào)數(shù))DIV src ; ALAX/src,AH余數(shù)DIV src ; AXDX. AX/src, DX余數(shù)IDIV src ;ALAX/src, AH余數(shù)(符號(hào)數(shù))IDIV src ; AXDX 、 AX/src,DX余數(shù)(符號(hào)數(shù))4、乘法與除法指令MUL、IMUL、
32、DIV、IDIV8088MUL是無(wú)符號(hào)數(shù)乘法指令,IMUL是帶符號(hào)數(shù)的乘法指令(整數(shù)乘法),它們都可以完成字節(jié)與字節(jié)相乘,字與字的相乘,這些乘法指令均認(rèn)為目的操作數(shù)在AL和AX中,源操作數(shù)由指令指出,當(dāng)16位乘法時(shí),32位的乘積規(guī)定高16位在DX中,低16位在AX中。在8位或16乘法若擴(kuò)展部分AH或DX為0則CF=0,OF=0,反之CF=1。OF=1。IMUL是帶符號(hào)數(shù)乘法 ,執(zhí)行情況同MUL,不過(guò)在16位或31位乘積中,包括一位符號(hào)位。DIV是無(wú)符號(hào)除法指令,它可以進(jìn)行字節(jié)或字除法,DIV規(guī)定:對(duì)于8位除法,被除數(shù)在AX 中,對(duì)于16位除法,被除數(shù)則在DX與AX中,而除數(shù)在指令中指出。除完的
33、結(jié)果,對(duì)8位數(shù)除法,商與余數(shù)分別放在AX與DX中。MUL是無(wú)符號(hào)數(shù)乘法指令,IMUL是帶符號(hào)數(shù)的乘法指令(整數(shù)IDIV是帶符號(hào) 數(shù)除法,情況同DIV,除后余數(shù)符號(hào)和被除數(shù)相同 。這兩條除法指令都不能用立即數(shù)作源操作,但若需要時(shí),可用如下指令來(lái)實(shí)現(xiàn),例如: MOV BX,10 DIV BX ;用10去除DX:AXIDIV是帶符號(hào) 數(shù)除法,情況同DIV,除后余數(shù)符號(hào)和被除數(shù)5、CBW與CWD指令上述的除法,被除數(shù)均是除數(shù)的雙倍字長(zhǎng),若要進(jìn)行相同字長(zhǎng)的除法,則需將被除數(shù)擴(kuò)展為雙倍字長(zhǎng),這就要用下面兩條指令:CBW是將字節(jié)擴(kuò)展為字指令,它是將AL 中的符號(hào)擴(kuò)展到AH的所有位去,CWD是擴(kuò)展為雙字指令,
34、它是將AX的符號(hào)(第15)擴(kuò)展到DX的所有位去,例如AL中的內(nèi)容為-2,執(zhí)行CBW后 AH AL 1111111111111110=-25、CBW與CWD指令上述的除法,被除數(shù)均是除數(shù)的雙倍字長(zhǎng),下面是一個(gè)四則運(yùn)算的例子: 設(shè)BH=FB(即-5) BL=FE(-2) CH=(-20) CL=05 計(jì)算(BH*BL)+(CH/CL) AX MOV AL, BH ; AX=FB IMUL BL ; AX=000A=-5(-2) MOV DX,AX ; 暫時(shí)保存結(jié)果 MOV AL,CH ; AX=00EC(-20) CBW ;AX=FFEC,擴(kuò)展為雙 字節(jié) IDIV CL ; AX=00FC(-4)
35、 CBW ; AX=FFFC ADD AX、DX ; AX=0006=+6 下面是一個(gè)四則運(yùn)算的例子:6十進(jìn)調(diào)整指令(1)DAA指令(2)AAA指令(3)DAS和AAS 指令(4)AAM與AAD指令6十進(jìn)調(diào)整指令(1)DAA指令(1)DAA指令當(dāng)BCD碼的十進(jìn)制運(yùn)算用二進(jìn)制進(jìn)行時(shí),有兩種情況需要進(jìn)行調(diào)整:1、運(yùn)算的結(jié)果出現(xiàn)非法的BCD碼(即大于的數(shù));2、運(yùn)算產(chǎn)生半字節(jié)間的進(jìn)位。調(diào)整的方法是加6進(jìn)行修正。DAA指令就是按上述原則進(jìn)行十進(jìn)制調(diào)整的,它是一條無(wú)操作數(shù)指令,與ADD指令配合實(shí)現(xiàn)壓縮型十進(jìn)制加法。(1)DAA指令當(dāng)BCD碼的十進(jìn)制運(yùn)算用二進(jìn)制進(jìn)行時(shí),有兩種(2)AAA指令A(yù)AA是非壓縮
36、型十進(jìn)制加法調(diào)整指令,它的作用是將AL中的數(shù)換成一個(gè)非壓縮型十進(jìn)制數(shù),即AAA指令執(zhí)行時(shí),檢查AL的低4位,若是一個(gè)合法的BCD碼,則清除AL的高4位,否則按上述修正原則進(jìn)行低4位修正,并將AL的高4位清零。例如AL中的內(nèi)容為00001001=9,CL的內(nèi)容為00001000=8,執(zhí)行如下指令:ADD AL,CLAAA執(zhí)行ADD后,AL中的內(nèi)容為00010001,因AF=1,故AAA指令進(jìn)行調(diào)整,將AL中的低4位加6,即變成00010111,然后高4位清零成為00000111,并且AH加1,因此AH中為00000001,AL中為00000111,得到兩個(gè)非壓縮型十進(jìn)制數(shù)。(2)AAA指令A(yù)AA
37、是非壓縮型十進(jìn)制加法調(diào)整指令,它的作用(3)DAS和AAS 指令DAS是壓縮型十進(jìn)制數(shù)減法調(diào)整指令,AAS是非壓縮型十進(jìn)制數(shù)減法調(diào)整指令,它們同ADD和AAA指令一樣,不要操作數(shù),且假定要調(diào)整的數(shù)在AL中。DAS的調(diào)整過(guò)程是:若AL的低4位大于9或AF=1,則從AF中減去6,并置AF=1,若AL的高4位大于9,或CF=1,則從AL中高4位減去6,并置CF=1,如用下述指令:SUB AL,BL ;AL中的數(shù)(壓縮的BCD碼)減去BL(壓縮的BCD碼)DAS ;調(diào)整結(jié)果,AL中為正確的碼。 AAS指令將AL中的內(nèi)容調(diào)整成非壓縮型十進(jìn)制碼,即如果AL低4位大于9,或AF=1,則減去6,AH減1,并置
38、AF=1,CF=1,并清除AL高4位。(3)DAS和AAS 指令DAS是壓縮型十進(jìn)制數(shù)減法調(diào)整指令(4)AAM與AAD指令A(yù)AM是非壓縮型十進(jìn)制乘法調(diào)整指令,它與指令配合使用,把中的兩個(gè)非壓縮型十進(jìn)制數(shù)相乘所得結(jié)果加以校正。AAM指令必須跟在MUL指令后。AAD是非壓縮型十進(jìn)制除法調(diào)整指令,它要在執(zhí)行除法之前使用,它是將非壓縮十進(jìn)制表示的被除數(shù)換成第二進(jìn)制值送到AL中,即AAD將被除數(shù)高位(AH)乘10,然后加到低位(AL)上,并將AH清零,ADD用法如下所示: AAD ;將非壓縮型十進(jìn)制數(shù)調(diào)整 DIV BL ; 完成除法。(4)AAM與AAD指令A(yù)AM是非壓縮型十進(jìn)制乘法調(diào)整指令,第四節(jié)邏輯
39、運(yùn)算指令8086/8088邏輯運(yùn)算指令組包括邏輯運(yùn)算指令、移位指令和循環(huán)移位指令。它們是對(duì)寄存器或存儲(chǔ)單元進(jìn)行位操作的指令,也稱位操作指令。邏輯運(yùn)算指令如表5.4.1所示.一、邏輯運(yùn)算指令二、移位指令三、循環(huán)指令第四節(jié)邏輯運(yùn)算指令8086/8088邏輯運(yùn)算指令組包括邏輯五章80868088指令系統(tǒng)一、邏輯運(yùn)算指令1、NOT指令 這條指令對(duì)原操作數(shù)求反,然后再送回原操作數(shù)。指令格式為: NOT src ; srcsrc,這條指令對(duì)標(biāo)志位無(wú)影響。 一、邏輯運(yùn)算指令1、NOT指令2、AND指令這條指令對(duì)兩個(gè)操作數(shù)按位進(jìn)行邏輯“與”運(yùn)算。與運(yùn)算通常用符號(hào)“X”或“”或“.”來(lái)表示,它的運(yùn)算規(guī)則為:00
40、=0 01=0 10=0 11=1 AND指令可以進(jìn)行字節(jié)操作,也可以進(jìn)行字操作。指令的一般格式為:AND dst, src; dstdstsrc 其中目的操作數(shù)可以用累加器,也可以是任意一通用寄存器,也可以是各種尋址方式的存儲(chǔ)器操作數(shù)。原操作數(shù)可以是立即數(shù),寄存器和各種尋址方式的存儲(chǔ)器操作數(shù)。例如:2、AND指令這條指令對(duì)兩個(gè)操作數(shù)按位進(jìn)行邏輯“與”運(yùn)算。 AND AX, BX AND AL, F0H AND SI, BP AND DATAWORD, AX AND AX, AX某個(gè)操作數(shù)與本身進(jìn)行“與”運(yùn)算,操作數(shù)不變,但可以是進(jìn)位標(biāo)志位CF清“0”。AND指令常用與屏蔽(清除)操作數(shù)的指定
41、位。例如: AND AX, OFFH結(jié)果AH被清“0”,而AL值不變。 AND AX, BX 3、OR指令這條指令對(duì)兩個(gè)操作數(shù)控位進(jìn)行邏輯“或”運(yùn)算,結(jié)果送回目的操作數(shù)?;蜻\(yùn)算通常用符號(hào)“+”或“”表示,它的運(yùn)算規(guī)則為:0v0=0 0v1=1 1v0=1 1v1=1 OR指令可以進(jìn)行字節(jié)操作,也可以進(jìn)行字操作。指令的一般格式為 OR dst ,src ; dstdstsrc其中的目的操作數(shù)河源操作數(shù), 與AND指令相同。某個(gè)操作數(shù)本身進(jìn)行或運(yùn)算,操作數(shù)不變,但可以是進(jìn)位標(biāo)志位CF清“0”。例如:OR AX , AX操作的結(jié)果是:操作數(shù)不變,但使CF清“0”。3、OR指令這條指令對(duì)兩個(gè)操作數(shù)控位
42、進(jìn)行邏輯“或”運(yùn)算,結(jié)果4、XOR指令 XOR指令用于異或操作,將源操作數(shù)與目的操作數(shù)做異或運(yùn)算,然后送目的操作數(shù)。異或運(yùn)算通常用符號(hào)表示,它的運(yùn)算規(guī)則為:00=0 01=110=1 11=0運(yùn)算的結(jié)果相當(dāng)于二個(gè)一位的二進(jìn)制數(shù)做加法的結(jié)果(進(jìn)位丟掉),所以又把異或運(yùn)算稱為“按位加”。 XOR dst, src ;dst dstsrc 其中,目的操作數(shù)和原操作數(shù)與AND指令相同。 4、XOR指令 XOR指令用于異或操作,將源操作數(shù)與目的操作XOR 指令可用對(duì)數(shù)據(jù)指定位進(jìn)行求反。XOR AL, OFFH則將AL 中所有位求反。某操作數(shù)與其本身進(jìn)行異或運(yùn)算可使操作數(shù)和進(jìn)位志位CF都清“0”。例如:X
43、OR AX,AXNOT、 AND 、OR 、 XOR指令都是按位操作的邏輯運(yùn)算指令,運(yùn)算結(jié)果影響標(biāo)志寄存器部分標(biāo)志位。XOR 指令可用對(duì)數(shù)據(jù)指定位進(jìn)行求反。5、TEST指令TEST指令是一條測(cè)試指令,它執(zhí)行的操作與AND相同,不過(guò)它不回送結(jié)果。只影響標(biāo)志位,該指令常與條件轉(zhuǎn)移指令配合使用,以決定程序的轉(zhuǎn)移方向。5、TEST指令TEST指令是一條測(cè)試指令,它執(zhí)行的操作與A二、移位指令8086/8088有四條移為指令: 算術(shù)左移指令 SAL dst,cout 邏輯左移指令 SHL dst,count 算數(shù)右移指令 SAR dst,count 邏輯右移指令 SHR dst,count 其中SAL與S
44、HL 指令功能完全相同。這些指令的功能如圖5.4.1。 移位指令可將通用寄存器或存儲(chǔ)單元的8位或16位的數(shù)左移或右移,其移位方向由指令決定,移動(dòng)位數(shù)由指令中的計(jì)數(shù)值所決定,計(jì)數(shù)值可以是1或存放在CL中的無(wú)符號(hào)數(shù)。二、移位指令8086/8088有四條移為指令:五章80868088指令系統(tǒng)這些移位指令如下所示。例如:MOV D,1將D中的數(shù)邏輯右移1位,D可以是寄存器或存儲(chǔ)器單元。當(dāng)要移多位時(shí),則可用CL作移位計(jì)數(shù)器,例如:MOV CL,2SHL BL,CL;將BL中的低4位左移到高4位,低4位變?yōu)?。常利用移位指令,作快速的乘除法,例如:某數(shù)乘4或除4的運(yùn)算。MOV CL,2SHL AX ,CL
45、 ;AX中的無(wú)符號(hào)數(shù)乘4SAL AX, CL ;AX中帶符號(hào)數(shù)乘4SHR AX, CL ;無(wú)符號(hào)數(shù)除以4SAR AX, CL ;帶符號(hào)數(shù)除以4這些移位指令如下所示。例如:使用移位指令作乘除法,要比用乘除指令快得多,比如實(shí)現(xiàn)AX乘10: MOV BX,AX ;保存AX MOV CL,2 ;移為兩次(乘4) ADD AX,BX ;加上原來(lái)的AX SHL AX,1 ;AX移位一次(實(shí)現(xiàn)乘10)使用移位指令作乘除法,要比用乘除指令快得多,比如實(shí)現(xiàn)AX乘1三、循環(huán)指令8086/8088有四條循環(huán)指令: 循環(huán)左移指令 ROL dst,count 循環(huán)右移指令 ROR dst,count 帶進(jìn)位位循環(huán)左移指
46、令 RCL dst,count 帶進(jìn)位位循環(huán)右移指令 RCR dst,count 前兩條指令未把標(biāo)志位CF包括在循環(huán)的環(huán)中,而后兩條指令把CF包括在循環(huán)中,作為整循環(huán)的一部分。循環(huán)指令的功能如圖5.4.2所示。 循環(huán)指令可以對(duì)字節(jié)操作,也可以對(duì)字操作。操作數(shù)可以是寄存器操作數(shù),也可以是內(nèi)存操作數(shù)。循環(huán)方向由指令決定。循環(huán)移動(dòng)的位數(shù)由指令中的計(jì)數(shù)值決定,計(jì)數(shù)值可以是1或存放在CL中的無(wú)符號(hào)數(shù)。三、循環(huán)指令8086/8088有四條循環(huán)指令:五章80868088指令系統(tǒng)第五節(jié)控制轉(zhuǎn)移指令8086/8088 有四類(lèi)轉(zhuǎn)移指令: (1)轉(zhuǎn)移指令,包括無(wú)條件轉(zhuǎn)移和條件轉(zhuǎn)移指令。 (2)重復(fù)控制指令 (3)調(diào)
47、用和返回指令 (4)中斷指令 8086/8088 使用CS 段寄存器和IP 指令指針寄存器的值來(lái)尋址,以取指令來(lái)執(zhí)行 ,轉(zhuǎn)移指令則可改變CS與IP的值或僅改變IP 的值,使得改變指令執(zhí)行的順序,轉(zhuǎn)移指令如表5.5.1所示指令中的 Target 表示轉(zhuǎn)移的目標(biāo)。 這些指令都將引起程序執(zhí)行方向的轉(zhuǎn)移,不過(guò)轉(zhuǎn)移又段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移之分,所謂段內(nèi)轉(zhuǎn)移是指段地址不變,只是IP改變,而段間轉(zhuǎn)移則CS和IP均發(fā)生改變。第五節(jié)控制轉(zhuǎn)移指令8086/8088 有四類(lèi)轉(zhuǎn)移指令:五章80868088指令系統(tǒng)五章80868088指令系統(tǒng)一、轉(zhuǎn)移指令轉(zhuǎn)移指令分無(wú)條件轉(zhuǎn)移和條件轉(zhuǎn)移指令1.無(wú)條件轉(zhuǎn)移指令無(wú)條件轉(zhuǎn)移指令格式
48、為: JMP TARGET JMP 轉(zhuǎn)移指令分直接轉(zhuǎn)移和間接轉(zhuǎn)移,直接轉(zhuǎn)移又分短程(SHORT),近程(NEAR)和遠(yuǎn)程(FAR) 三種形式,當(dāng)程序中執(zhí)行到JMP 指令時(shí),執(zhí)行就無(wú)條件轉(zhuǎn)移到JMP所指的目標(biāo)(TARGET)去,目標(biāo)可以是一個(gè)標(biāo)號(hào)指出的直接轉(zhuǎn)移地址, 如 : JMP SUM它指出無(wú)條件轉(zhuǎn)向SUM 地址(是段內(nèi)轉(zhuǎn)移)目標(biāo)也可以是用NEAR或FAR 進(jìn)行說(shuō)明,例如:一、轉(zhuǎn)移指令轉(zhuǎn)移指令分無(wú)條件轉(zhuǎn)移和條件轉(zhuǎn)移指令 JMP FAR LABEL 說(shuō)明LABEL 不在現(xiàn)行段內(nèi),則是段間轉(zhuǎn)移。 如果目標(biāo)與JMP 指令的距離在-128到+127個(gè)字節(jié)之間,則可用SHORT 來(lái)說(shuō)明 ,表示為短程轉(zhuǎn)
49、移,這種格式,由于目標(biāo)用位移表示(一個(gè)字節(jié)),所以指令節(jié)省一個(gè)單元,若是目標(biāo)用地址表示,則需兩個(gè)字節(jié),當(dāng)目標(biāo)前不用NEAR說(shuō)明時(shí),隱含著NEAR型的段內(nèi)轉(zhuǎn)移。例如: JMP SHORT NEXT;短程轉(zhuǎn)移 JMP LOOPL ;近程轉(zhuǎn)移JMP指令中的目標(biāo)也可以是由存儲(chǔ)器或寄存器指出的間接轉(zhuǎn)移地址,例如: JMP TARGET BX;轉(zhuǎn)移地址由BX及TARGET變 ;址計(jì)算得到 JMP CX ;以CX的內(nèi)容位轉(zhuǎn)移目的地 ;址 JMP FAR LABEL2.條件轉(zhuǎn)移指令8086/8088有18條不同的條件轉(zhuǎn)移指令。它是根據(jù)標(biāo)志寄存器的標(biāo)志位決定程序是否進(jìn)行轉(zhuǎn)移,條件轉(zhuǎn)移指令的目的地址必須在現(xiàn)行的代
50、碼段內(nèi)(CS)中,并且以下一條指令地址為基準(zhǔn),必須在+127到-128的位移范圍內(nèi),因此條件轉(zhuǎn)移之零轉(zhuǎn)移的范圍是有限的,而不像JMP指令。條件轉(zhuǎn)移指令如表5.5.1所列。從表種可看出條件轉(zhuǎn)移指令有時(shí)根據(jù)兩數(shù)比較結(jié)果來(lái)進(jìn)行轉(zhuǎn)移,有時(shí)指明測(cè)試某些標(biāo)志未來(lái)決定轉(zhuǎn)移,但有時(shí)兩條指令時(shí)實(shí)質(zhì)上是一致的。如:JE/JZ SUM;JE指令的含義若兩數(shù)相等則轉(zhuǎn)SUM,而JZ指令的含義是若標(biāo)志位ZF=1則轉(zhuǎn)SUM。2.條件轉(zhuǎn)移指令8086/8088有18條不同的條件轉(zhuǎn)移指令使用條件轉(zhuǎn)移指令時(shí),經(jīng)常在該指令之前用一條比較指令或減法指令,以建立標(biāo)志位,然后由條件轉(zhuǎn)移指令進(jìn)行判斷是否轉(zhuǎn)移。條件轉(zhuǎn)移指令由對(duì)帶符號(hào)數(shù)比較或
51、測(cè)試的指令,這常對(duì)溢出為OF或符號(hào)為SF及逆行測(cè)試,對(duì)無(wú)符號(hào)數(shù)則常測(cè)試CF,對(duì)帶符號(hào)數(shù)由大于等于小于三種情況,無(wú)符號(hào)數(shù)則有高于等于低于三種情況。使用條件轉(zhuǎn)移指令時(shí),經(jīng)常在該指令之前用一條比較指令或減法指令二、重復(fù)控制指令8086/8088有三條控制重復(fù)控制指令:LOOP、LOOPZ(LOOPE)、LOOPNZ(LOOPNE),還有一條通常用于循環(huán)控制的條件轉(zhuǎn)移指令JCXZ。1、LOOP、LOOPZ、LOOPNZ指令2、JCXZ 指令二、重復(fù)控制指令8086/8088有三條控制重復(fù)控制指令:L1、LOOP、LOOPZ、LOOPNZ指令這類(lèi)指令用于控制程序的循環(huán),其控制轉(zhuǎn)向的目的地址是在以下條指令
52、地址為中心的+127到-128的范圍內(nèi),這類(lèi)指令用CX 作計(jì)數(shù)器,每執(zhí)行該指令,CX便減1,直到減為0為止。例如用LOOP時(shí),規(guī)定循環(huán)次數(shù)放在CX中,每LOOP指令一次,則CX減1,若CX不等于0,則轉(zhuǎn)向目的地址執(zhí)行,如此重復(fù)直到CX減為0為止,例如要重復(fù)執(zhí)行某一程序段100次,可用下面的程序: MOV CX,100;100次輸送CX START: . . ;要執(zhí)行100次的程序段 LOOP START ;CX0,轉(zhuǎn)START執(zhí)行 . . ;CX=0,往下執(zhí)行1、LOOP、LOOPZ、LOOPNZ指令這類(lèi)指令用于控制程在循環(huán)過(guò)程中,常根據(jù)循環(huán)內(nèi)出現(xiàn)的情況來(lái)終止循環(huán),若相等則循環(huán),這可用LOOP
53、指令,若不相等則循環(huán),這可用LOOPNE指令,前者,是當(dāng)CX不等于零,ZF=1時(shí)則循環(huán),后者是CX不等于零 ZF=0時(shí)則循環(huán)。當(dāng)兩個(gè)中的一個(gè)條件滿足一個(gè)不滿足時(shí),則終止循環(huán)。例如在指定的存儲(chǔ)區(qū)中,找第一個(gè)非零字節(jié) ,設(shè)存儲(chǔ)區(qū)開(kāi)始單元的偏移地址在BX中,最后單元的偏移地址在DI中,若找到非零字節(jié),則其偏移地址在BX中,若沒(méi)找到則BX與DI相等,表示已找到最后單元。在循環(huán)過(guò)程中,常根據(jù)循環(huán)內(nèi)出現(xiàn)的情況來(lái)終止循環(huán),若相等則循環(huán) SUB DI,BX INC DI ;字節(jié)數(shù)=(DI)-(BX)+1 MOV CX,DI ;字節(jié)數(shù)送CX DEC BX NEXT: INC BX CMP BYTEPTRBX,0
54、 ;與0比較 LOOPE NEXT ;是0,去比較下一個(gè) JNZ NZ_FOUND ;找到否,即ZF=0? . ;沒(méi)找到NZ_FOUND: ;找到,BX中為非零字節(jié) . SUB DI,BX 2、JCXZ 指令這條指令也是一條轉(zhuǎn)移指令,它的轉(zhuǎn)移條件是CX=0。這條指令在循環(huán)程序的開(kāi)始處,為了能跳過(guò)循環(huán)(只要是CX=0)是有用的。2、JCXZ 指令這條指令也是一條轉(zhuǎn)移指令,它的轉(zhuǎn)移條件是C三、調(diào)用和返回指令 CALL、RETCALL 指令用來(lái)調(diào)用一個(gè)過(guò)程或者程序。當(dāng)調(diào)用的過(guò)程或子程序結(jié)束后,使用RET 指令返回,由于過(guò)程或子程序由段間調(diào)用(即遠(yuǎn)程FAR)和段內(nèi)調(diào)用(及近程N(yùn)EAR)所以CALL也有
55、FAR和NEAR之分,這由被調(diào)用的過(guò)程的定義所決定,因此RET也有段間和段內(nèi)返回兩種。當(dāng)段內(nèi)調(diào)用時(shí),首先將IP內(nèi)容入棧。當(dāng)返回時(shí),從站內(nèi)取出一個(gè)字并放回到IP中,若段間調(diào)用時(shí),則先把CS入棧,在把IP如戰(zhàn),RET返回時(shí),在從棧中去回一個(gè)字放入IP中,然后從棧中取第二個(gè)字放入CS中,作為段間返回地址。三、調(diào)用和返回指令 CALL、RETCALL 指令用來(lái)調(diào)用象JMP指令一樣CALL指令也有兩種得到目標(biāo)地址的辦法:直接和間接。直接調(diào)用目標(biāo)地址在CALL指令中,間接調(diào)用目標(biāo)地址在由指令指定的寄存器或內(nèi)存單元中。象JMP指令一樣CALL指令也有兩種得到目標(biāo)地址的辦法:直接四、中斷指令8088提供三條中
56、斷傳送操作指令: 中斷指令 INT n 溢出中斷指令 INTO 中斷返回指令 IRET 在8086/8088中,程序的執(zhí)行控制可以采用軟中斷的方式。當(dāng)程序中遇到中斷指令時(shí),中止現(xiàn)行程序,保護(hù)斷點(diǎn)和現(xiàn)場(chǎng)后,轉(zhuǎn)去執(zhí)行。四、中斷指令8088提供三條中斷傳送操作指令:1、INT n指令這條指令啟動(dòng)在指令中的中斷類(lèi)型號(hào)(n)規(guī)定的中斷過(guò)程。8088采取向量中斷,中斷類(lèi)型號(hào)0255,規(guī)定了256個(gè)中斷向量。每個(gè)中斷向量包括了四個(gè)字節(jié)的中斷程序的入口地址。其中,有兩個(gè)字節(jié)是中斷程序的代碼段值,另兩個(gè)字節(jié)是中斷程序入口地址偏移量。這256個(gè)入口地址組成一個(gè)表叫中斷向量表,存放在存儲(chǔ)器絕對(duì)地址00000H到00
57、3FFH中。關(guān)于8088中斷系統(tǒng)的介紹請(qǐng)參閱第七章,當(dāng)程序中遇到中斷指令I(lǐng)NT時(shí),便中斷程序的執(zhí)行,而轉(zhuǎn)向由256個(gè)中斷向量提供的地址之一去執(zhí)行。例如: INT 1AH此時(shí)程序?qū)⑥D(zhuǎn)向IA型中斷服務(wù)程序執(zhí)行,此時(shí)中斷向量地址為41AH=68H,即從68H和69H單元中取出IP的值,從6AH和6BH取出CS的值,然后轉(zhuǎn)向該地址執(zhí)行中斷服務(wù)程序。1、INT n指令這條指令啟動(dòng)在指令中的中斷類(lèi)型號(hào)(n)規(guī)2、INTO指令和IRET指令I(lǐng)NTO指令可以寫(xiě)在一條算數(shù)指令的后面,若算數(shù)運(yùn)算指令執(zhí)行的結(jié)果溢出,及溢出標(biāo)志OF=1,則轉(zhuǎn)向溢出中斷處理;否則不進(jìn)行任何操作,接著執(zhí)行下一條指令。 IRET指令的作用
58、是:當(dāng)執(zhí)行完中段服務(wù)程序后,返回主程序。2、INTO指令和IRET指令I(lǐng)NTO指令可以寫(xiě)在一條算數(shù)指第六節(jié)字符串指令存儲(chǔ)器中存放的一串字或字節(jié),它們可以是二進(jìn)制數(shù),也可以是BCD碼或ASCII代碼等相關(guān)的一些信息。它們存放在連續(xù)區(qū)域中,若對(duì)它們的每個(gè)字或字節(jié)均作同樣的操作,就稱為串操作。我們把能夠完成這些功能的指令,稱為字符串操作指令或簡(jiǎn)稱為字串指令這些指令如表5.6.1所列。第六節(jié)字符串指令存儲(chǔ)器中存放的一串字或字節(jié),它們可以是二進(jìn)五章80868088指令系統(tǒng)此表中每一類(lèi)指令的第一個(gè)均帶有操作數(shù),匯編時(shí),匯編程序均將其轉(zhuǎn)換為后面中的一個(gè)(根據(jù)是字節(jié)還是字操作),因此多使用后面的兩種形式在字串操作中假定源串在數(shù)據(jù)中,目的串在附加段中,用作指針對(duì)源尋址,用作指針騍目的串尋址,在每次字串操作后,若是字節(jié)操作,則和(或)的值會(huì)自動(dòng)加或減,若是字操作,則和(或)自動(dòng)加或減,是加還是減由標(biāo)志寄存器的方向標(biāo)志位決定,若:則作加,否則,作減操作在串操作前可用指令來(lái)設(shè)置,用指令來(lái)清此表中每一類(lèi)指令的第一個(gè)均帶有操作數(shù),匯編時(shí),匯編程序均將其一、串操作指令有五種基本的串操作指令:串傳送指令,串比較指令,串掃描指令,串裝入指令和串存儲(chǔ)指令。是串傳送命令。它將把當(dāng)前數(shù)據(jù)串中用指出的源串的一個(gè)字節(jié)或一個(gè)字傳送到用指針指向的附加段目的地址
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 生物標(biāo)志物在糖尿病衰弱早期篩查中的應(yīng)用
- 生物墨水的細(xì)胞外基質(zhì)模擬設(shè)計(jì)
- 生物打印技術(shù)在骨盆缺損修復(fù)中的臨床應(yīng)用
- 生活質(zhì)量評(píng)估指導(dǎo)下的宮頸癌個(gè)體化放化療方案
- 滴工程師面試常見(jiàn)問(wèn)題及答案
- 地勤指揮員面試題集
- 電子商務(wù)平臺(tái)運(yùn)營(yíng)經(jīng)理招聘面試題集
- 項(xiàng)目經(jīng)理專(zhuān)業(yè)面試題集與解答技巧
- 高級(jí)財(cái)務(wù)管理師面試題及解答指南
- 玫瑰痤瘡術(shù)后皮膚抗炎方案設(shè)計(jì)
- 2025年青島市公安局警務(wù)輔助人員招錄筆試考試試題(含答案)
- 科技園區(qū)入駐合作協(xié)議
- 電大專(zhuān)科《個(gè)人與團(tuán)隊(duì)管理》期末答案排序版
- 山東科技大學(xué)《基礎(chǔ)化學(xué)(實(shí)驗(yàn))》2025-2026學(xué)年第一學(xué)期期末試卷
- 2025年吐魯番輔警招聘考試題庫(kù)必考題
- 護(hù)理放射科小講課
- 機(jī)關(guān)黨支部2025年度抓基層黨建工作述職報(bào)告
- 2025年生態(tài)環(huán)境監(jiān)測(cè)系統(tǒng)建設(shè)可行性研究報(bào)告及總結(jié)分析
- 2023北京海淀高一(上)期末英語(yǔ)試卷含答案
- 離心泵課件教學(xué)課件
- 我眼中的爸爸媽媽課件
評(píng)論
0/150
提交評(píng)論