第3章微機(jī)原理_第1頁(yè)
第3章微機(jī)原理_第2頁(yè)
第3章微機(jī)原理_第3頁(yè)
第3章微機(jī)原理_第4頁(yè)
第3章微機(jī)原理_第5頁(yè)
已閱讀5頁(yè),還剩112頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

NanjingUniversityofScience&Technology微機(jī)原理及應(yīng)用南京理工大學(xué)第3章8086/8088指令系統(tǒng)微機(jī)原理及應(yīng)用例題8086/8088的指令系統(tǒng)8086/8088指令的尋址方式指令及指令系統(tǒng)指令及指令系統(tǒng)指令

指示計(jì)算機(jī)執(zhí)行某種特定操作的“命令”指令系統(tǒng)

計(jì)算機(jī)所能執(zhí)行的全部指令的集合稱(chēng)為計(jì)算機(jī)的指令系統(tǒng),即它的機(jī)器語(yǔ)言指令及指令系統(tǒng)指令應(yīng)該簡(jiǎn)單,簡(jiǎn)單才能提高速度!操作功能要簡(jiǎn)單,不宜太多、太復(fù)雜指令的格式要統(tǒng)一:固定長(zhǎng)度、統(tǒng)一分段操作數(shù)的來(lái)源要有限制Intel處理器的指令系統(tǒng)由于歷史的原因,并不符合上述原則!關(guān)于指令的操作功能指令系統(tǒng)中的指令分成許多類(lèi),例如Intel公司的80x86系列處理器中,共有七大類(lèi)指令:數(shù)據(jù)傳送類(lèi) ■算術(shù)運(yùn)算類(lèi)邏輯運(yùn)算類(lèi) ■移位操作類(lèi)位(位串)操作類(lèi) ■控制轉(zhuǎn)移類(lèi)輸入/輸出類(lèi)等每一類(lèi)指令(如數(shù)據(jù)傳送類(lèi)、算術(shù)運(yùn)算類(lèi))又按照操作數(shù)的性質(zhì)(如整數(shù)還是實(shí)數(shù))、長(zhǎng)度(16位、32位、64位、128位等)而區(qū)分為許多不同的指令,因此Intel公司CPU有數(shù)以百計(jì)的不同的指令關(guān)于Intel公司CPU的指令系統(tǒng)產(chǎn)品發(fā)展過(guò)程為:8088(8086)→80286→80386→80486→Pentium→PentiumPRO→PentiumII→PentiumIII→Pentium4→奔騰D→奔騰至尊→酷?!犷?→Corei3/i5/i7為解決軟件兼容性問(wèn)題,采用“向下兼容方式”開(kāi)發(fā)新的處理器,即所有新處理器均保留老處理器的全部指令,同時(shí)還擴(kuò)充功能更強(qiáng)的新指令。例如:Pentium比80386增加了的80多條浮點(diǎn)指令,PentiumII比Pentium增加了50多條處理多媒體信息的指令(MultimediaExtension,稱(chēng)為MMX),PentiumIII比PentiumII增加了70條處理128位長(zhǎng)操作數(shù)的流式單指令多數(shù)據(jù)指令(StreamingSIMDExtention,SSE)Pentium4又比PentiumIII增加了144條指令(稱(chēng)為SSE2)奔騰D、奔騰至尊、酷睿2等又增加了13條SSE3指令Corei5和Corei7又增加了40多條SSE4指令關(guān)于CPU的兼容性不同公司生產(chǎn)不同的CPU產(chǎn)品,一般互不兼容:Intel公司:奔騰、賽揚(yáng)、酷睿、靈動(dòng)等AMD公司:獨(dú)龍、閃龍、炫龍等IBM公司:Power5、6、7等SUN公司:UltraSPARC處理器HP公司:PA-RISC、Itanium處理器同一公司同一系列的CPU具有向下兼容性:A計(jì)算機(jī)(使用新型號(hào)CPU)的程序不能在B計(jì)算機(jī)(使用老型號(hào)CPU)上運(yùn)行,B計(jì)算機(jī)的程序卻能在A計(jì)算機(jī)上運(yùn)行互不兼容A計(jì)算機(jī)的程序不能在B上直接運(yùn)行,B計(jì)算機(jī)的程序也不能在A上直接運(yùn)行互相兼容指令及其格式指令采用二進(jìn)位表示,大多數(shù)情況下由兩個(gè)部分組成:操作碼操作數(shù)或操作數(shù)地址指出CPU應(yīng)執(zhí)行何種操作的一個(gè)命令詞,例如加、減、乘、除等指出該指令所操作(處理)的數(shù)據(jù)或者數(shù)據(jù)所在位置指令的格式:操作碼用幾位表示?(多少種不同的操作功能)操作數(shù)地址是1個(gè)還是2個(gè),還是操作數(shù)隱含?如何指出內(nèi)存地址?(尋址方式)指令長(zhǎng)度是多少位,固定長(zhǎng)度/可變長(zhǎng)度?指令在計(jì)算機(jī)中的執(zhí)行過(guò)程取指令:CPU的控制器從存儲(chǔ)器讀取一條指令并放入指令寄存器指令譯碼:指令寄存器中的指令經(jīng)過(guò)譯碼,決定該指令應(yīng)進(jìn)行何種操作、操作數(shù)在哪里執(zhí)行指令取操作數(shù)進(jìn)行運(yùn)算修改指令計(jì)數(shù)器,決定下一條指令的地址1取指令4修改指令計(jì)數(shù)器3執(zhí)行指令2指令譯碼指令執(zhí)行周期通常,每一步需要1個(gè)或幾個(gè)時(shí)鐘周期才能完成操作數(shù)的類(lèi)型立即數(shù)匯編時(shí)緊跟在操作碼之后,立即可以找到。MOVAL,07HB007ADDAL,0AH040A操作數(shù)的類(lèi)型立即數(shù)只能作為源操作數(shù),不能作為目的操作數(shù);8086/8088指令中,立即數(shù)可以是8位或者16位帶符號(hào)數(shù)或無(wú)符號(hào)數(shù);8086/8088指令中,立即數(shù)只能是整數(shù),不能是小數(shù)、變量或其他數(shù)據(jù);必須以數(shù)字開(kāi)頭,字母開(kāi)頭的16進(jìn)制數(shù)前加0;操作數(shù)是算術(shù)表達(dá)式、邏輯表達(dá)式等,匯編時(shí)自動(dòng)轉(zhuǎn)換為相應(yīng)的立即數(shù);立即數(shù)編譯成二進(jìn)制數(shù),負(fù)數(shù)編譯成補(bǔ)碼機(jī)器數(shù)。操作數(shù)的類(lèi)型寄存器操作數(shù)----CPU內(nèi)部存放于8086/8088CPU內(nèi)部的寄存器中,包括通用寄存器、地址指針寄存器、變址寄存器以及段寄存器。段寄存器DS、ES、SS存放段基址,也可以作為源操作數(shù)或目的操作數(shù),但禁止將一個(gè)立即數(shù)直接傳送給段寄存器。CS只能作為源操作數(shù),不能作為目的操作數(shù),不允許對(duì)其直接賦值,由系統(tǒng)安排。操作數(shù)的類(lèi)型存儲(chǔ)器操作數(shù)----內(nèi)存中指令所需的操作數(shù)存儲(chǔ)于內(nèi)存單元中,可以是8位、16位或32位的二進(jìn)制數(shù)。大多數(shù)指令不允許源操作數(shù)和目的操作數(shù)同時(shí)為存儲(chǔ)器操作數(shù),即不允許從存儲(chǔ)器到存儲(chǔ)器的操作??梢允褂弥付ǖ亩渭拇嫫鞔婺J(rèn)的段寄存器,叫做段超越。操作數(shù)的類(lèi)型執(zhí)行速度:寄存器操作數(shù)>立即數(shù)>存儲(chǔ)器操作數(shù)操作數(shù)的類(lèi)型I/O端口地址操作數(shù)----外部設(shè)備CPU與外部設(shè)備之間使用專(zhuān)用指令I(lǐng)N和OUT指令實(shí)現(xiàn)數(shù)據(jù)傳送,其中一個(gè)操作數(shù)必須是端口地址。

movcx,cont ;數(shù)組元素個(gè)數(shù)送cx deccx ;比較次數(shù)送cxloop1: movdi,cx movsi,10hloop2: movax,buff[si] ;第一個(gè)數(shù)送ax cmpax,buff[si+2] ;和后面的數(shù)比較

jgectnu ;若≥則繼續(xù)比較

xchgax,buff[si+2] ;若<則交換

movbuff[si],axctnu: addsi,2 looploop2 ;結(jié)果使小數(shù)放后面

movcx,di looploop1指令示例所謂尋址就是尋找操作數(shù)的地址。

在指令的執(zhí)行過(guò)程中,為了取得操作數(shù),既可能要訪問(wèn)存儲(chǔ)單元又可能要訪問(wèn)寄存器。如何正確的獲得指令所需要的操作數(shù)就是尋址方式要討論的問(wèn)題。

尋址方式:尋找操作數(shù)所在地址的方式稱(chēng)為尋址方式。立即尋址

操作數(shù)緊跟在操作碼的后面,與操作碼一起放在存儲(chǔ)器的代碼段區(qū)域中。在取出指令的同時(shí),也就取出了操作數(shù)。立即尋址主要用來(lái)給寄存器或存儲(chǔ)單元賦初值,也可以與寄存器操作數(shù)或存儲(chǔ)器操作數(shù)進(jìn)行算術(shù)邏輯運(yùn)算。立即尋址寄存器尋址

操作數(shù)存放在指令規(guī)定的8、16位Reg中,Reg名字出現(xiàn)在指令中。說(shuō)明:①Reg可為CPU中的通用RegAX,BX,CX……BPAH,AL…………等②因操作數(shù)在Reg中,無(wú)需訪問(wèn)存儲(chǔ)器,執(zhí)行速度快。③若選用AX寄存器,執(zhí)行指令時(shí)間更短。寄存器尋址直接尋址

操作數(shù)在某個(gè)存儲(chǔ)單元中,其偏移地址由指令直接給出。段地址在不作專(zhuān)門(mén)說(shuō)明時(shí)一般在DS段寄存器中。若在其他段中,則應(yīng)在偏移地址前加段名和冒號(hào)。此16位的偏移量與操作碼一起存放在代碼段中。

直接尋址AX

AHAL寄存器間接尋址操作數(shù)在某個(gè)存儲(chǔ)單元中,其偏移地址在指令給出的方括號(hào)中的寄存器中,即寄存器的內(nèi)容為操作數(shù)的偏移地址。所使用的段寄存器由指令中的間址寄存器確定。若用BX、SI、DI寄存器間址,則操作數(shù)在當(dāng)前數(shù)據(jù)段中,即段地址在DS中。若用BP間址,則操作數(shù)在堆棧段SS中。只有上述4個(gè)寄存器可以用于間接尋址。間接尋址的優(yōu)點(diǎn):只要對(duì)間址用的寄存器作適當(dāng)修改,一條指令就可以對(duì)許多不同的存儲(chǔ)單元進(jìn)行訪問(wèn)。循環(huán)程序設(shè)計(jì)中,多用間接尋址。寄存器間接尋址基址相對(duì)尋址操作數(shù)的有效地址是基址寄存器(BX)或基址指針寄存器(BP)的內(nèi)容與指令中指定的8位或16位位移量之和。例如:MOV[BX+6],AL或MOV6[BX],ALMOV[BP+6],AX或MOV6[BP],AX段地址依據(jù)使用的寄存器的不同而不同,默認(rèn)為DS:SX和SS:BP,允許段超越。[BX][BP]EA=8位偏移量16位偏移量+變址相對(duì)尋址除了存放偏移地址的寄存器為變址寄存器SI和DI外,這種尋址方式和基址相對(duì)尋址方式的操作過(guò)程是一樣的。段寄存器默認(rèn)使用DS,允許段超越。例如:MOV[DI+6],AL或MOV6[DI],ALMOVAX,[SI+10H]

或MOVAX,10H[SI]段地址依據(jù)使用的寄存器的不同而不同,默認(rèn)為DS:SX和SS:BP,允許段超越。[SI][DI]EA=8位偏移量16位偏移量+相對(duì)尋址的速度比直接尋址慢,因?yàn)镃PU必須執(zhí)行一次加法操作才能獲得有效地址?;纷冎穼ぶ?/p>

操作數(shù)在某個(gè)存儲(chǔ)器單元中,其偏移地址是指令中指定的基址寄存器和變址寄存器的內(nèi)容與位移量3項(xiàng)相加之和。段地址由基址寄存器約定在哪一個(gè)段寄存器中。不允許將兩個(gè)基址寄存器或兩個(gè)變址寄存器組合在一起尋址!例如: MOV[BX+SI+5],AX

或 MOV5[BX][SI],AX[BX][BP]EA=8位偏移量16位偏移量+[SI][DI]+隱含尋址80X86的指令系統(tǒng)中,少數(shù)指令沒(méi)有操作數(shù),或者指令中只有一個(gè)操作數(shù),另一個(gè)操作數(shù)是隱含的這種尋址方式稱(chēng)為隱含尋址。

例如: ADDAL,BLDAAMULBL8086/8088指令集指令的分類(lèi):1、數(shù)據(jù)傳送指令(DataTransfer)2、算術(shù)運(yùn)算指令(Arithmetic)3、邏輯運(yùn)算指令(Logic)4、程序控制指令(ProgramControl)5、處理器控制指令(ProcessorControl)6、串操作指令(StringMenpulation)數(shù)據(jù)傳送類(lèi)指令不論是專(zhuān)用計(jì)算機(jī),還是通用計(jì)算機(jī),也不管是數(shù)值計(jì)算或信息處理,還是實(shí)時(shí)控制,都需要傳送數(shù)據(jù)。因此,數(shù)據(jù)傳送是最大量、最基本、最主要的操作。傳送類(lèi)指令的特點(diǎn)是把數(shù)據(jù)從計(jì)算機(jī)的一個(gè)部位傳送到另一個(gè)部位。把發(fā)送的部位稱(chēng)之為“源”,接收的部位稱(chēng)之為“目的地”。

數(shù)據(jù)傳送指令用于實(shí)現(xiàn)寄存器陣列、存儲(chǔ)器、累加器、I/O接口之間數(shù)據(jù)的傳遞,可按字或字節(jié)進(jìn)行數(shù)據(jù)傳送。它包括以下4類(lèi)指令:(1)通用傳送指令:它又包括:基本傳送指令:MOV

堆棧指令:PUSH和POP

數(shù)據(jù)交換指令:XCHG(2)累加器專(zhuān)用傳送指令:它又包括: 輸入輸出指令:IN,OUT

查表轉(zhuǎn)換指令:XLAT(3)地址傳送指令(4)標(biāo)志傳送指令注:除特別說(shuō)明外,數(shù)據(jù)傳送類(lèi)指令一般不影響標(biāo)志位。數(shù)據(jù)傳送類(lèi)指令通用傳送指令格式:MOVdest,source功能:把一個(gè)字節(jié)或一個(gè)字操作數(shù)從源傳送到目的地(源保持不變),結(jié)果不影響標(biāo)志位。通用傳送指令的操作數(shù)及其傳送方向如圖所示:

立即數(shù)IMM存儲(chǔ)器MEM通用寄存器REGDSESSS(CS)使用該指令需注意以下幾點(diǎn):(1)

源和目的操作數(shù)不能同時(shí)為存儲(chǔ)器操作數(shù)(2)

兩操作數(shù)的位數(shù)、類(lèi)型和屬性要一致 如:MOVAX,BL (3)

操作數(shù)不能出現(xiàn)二義性 如:MOV[BX],1

操作數(shù)的類(lèi)型不明確(字/字節(jié)?)(4)

CS,IP和立即數(shù)不能作目的操作數(shù);(5)不允許兩個(gè)段寄存器之間傳送數(shù)據(jù)(6)立即數(shù)不能直接送段寄存器通用傳送指令堆棧的設(shè)置主要用來(lái)解決多級(jí)中斷,子程序嵌套和遞歸等程序設(shè)計(jì)中難以處理的實(shí)際問(wèn)題;還可以用來(lái)保護(hù)現(xiàn)場(chǎng),寄存中間結(jié)果,并為主、子程序的轉(zhuǎn)返提供強(qiáng)有力的依托。

8086/8088的堆棧操作都是字操作,將一個(gè)數(shù)壓入堆棧稱(chēng)為進(jìn)棧,SP自動(dòng)減2,進(jìn)棧的字就存放在新增加的兩個(gè)單元內(nèi)。將一個(gè)數(shù)從堆棧彈出稱(chēng)為出棧,出棧時(shí),SP自動(dòng)加2。棧頂隨進(jìn)?;虺鰲2僮鞫兓?。堆棧的基本知識(shí)堆棧操作指令格式:PUSHsource功能:將通用寄存器、段寄存器或存儲(chǔ)器中的一個(gè)字壓入棧頂。同時(shí)進(jìn)行修改堆棧指針的操作,即:SP←SP-2SP=0040HSP=003EH12341234AHAL下圖是執(zhí)行PUSHAX的具體過(guò)程:執(zhí)行前執(zhí)行后格式:

POPdest功能:將SP所指向的棧頂?shù)囊粋€(gè)字傳送給通用寄存器、段寄存器(CS除外)或存儲(chǔ)器。同時(shí)進(jìn)行修改堆棧指針的操作,即:

SP←SP+2例如: POPDX POPCX堆棧操作指令數(shù)據(jù)交換指令格式:XCHGdest,source功能:將源和目的操作數(shù)中的內(nèi)容交換。注意:1)交換只能在通用寄存器之間、通用寄存器和存儲(chǔ)單元之間進(jìn)行,段寄存器、立即數(shù)不能作為操作數(shù),即:

XCHGREG,REG XCHGREG,MEM XCHGMEM,REG

2)兩個(gè)存儲(chǔ)單元之間禁止直接交換數(shù)據(jù)!例如:將數(shù)據(jù)段中的字變量DATA1和DATA2互換

MOVAX,DATA1

XCHGAX,DATA2 MOVDATA1,AX輸入輸出指令1)格式: INAL,Port

或 INAL,DX INAX,Port 或 INAX,DX功能:對(duì)于8088,將一個(gè)字節(jié)由輸入端口傳送至AL;對(duì)于8086,可將一個(gè)字由輸入端口傳送至AX。注意:端口地址若是由指令中的port所規(guī)定,則只可尋址0~255,端口地址若用DX間址,則允許尋址64K個(gè)輸入端口。2)格式: OUTPort,AL

或 OUTDX,AL OUTPort,AX

或 OUTDX,AX例1:

INAL,06H OUT06H,AL端口地址在(00H~FFH)之間,可以用直接輸入輸出指令例2:

MOVDX,330H INAL,DX OUTDX,AL端口地址超過(guò)255,必須用DX間址訪問(wèn)。這里的DX表示的是寄存器間接尋址的外設(shè)地址,而不是寄存器尋址。查表轉(zhuǎn)換指令格式:XLAT[source-table]功能:該指令的操作數(shù)都是隱含的,它將BX為偏移地址、AL為位移量的存儲(chǔ)單元中的數(shù)據(jù)送AL,即[BX+AL]→AL。該指令可以方便地將一種代碼轉(zhuǎn)換為另一種代碼。例:從5號(hào)端口輸入一位十進(jìn)制數(shù)碼,將其轉(zhuǎn)換后再輸出到10號(hào)端口(見(jiàn)P33) MOVBX,OFFSETTABLE INAL,5

XLATTABLE OUT10,AL地址傳送指令1.偏移地址傳送指令格式:LEAREG16,MEM功能:將存儲(chǔ)單元的偏移地址送16位通用寄存器。該指令常用來(lái)給某個(gè)16位通用寄存器設(shè)置地址初值,以便從此開(kāi)始存取數(shù)據(jù)。例:LEABX,[1200H] ;執(zhí)行后BX=1200H另外:MOVBX,OFFSETTABLE

LEABX,TABLE作用相同地址傳送指令2.傳送數(shù)據(jù)段偏移地址及數(shù)據(jù)段段地址指令格式:LDSREG16,MEM32功能:將32位存儲(chǔ)器操作數(shù)的段地址送DS,偏移地址送16位寄存器。這條指令為存取非當(dāng)前數(shù)據(jù)段中的數(shù)據(jù)作地址準(zhǔn)備。例: LDSSI,[BX];則將[BX+3]和[BX+2]送DS,[BX+1]和[BX]送SI3.傳送附加段偏移地址和附加段段地址指令格式:LESREG16,MEM32功能:除了將段地址送ES外,其余和LDS指令類(lèi)似。例: LESDI,[BX];則將[BX+3]和[BX+2]送ES,[BX+1]和[BX]送DI標(biāo)志傳送指令1.標(biāo)志寄存器低8位送AH

格式:LAHF

功能:將標(biāo)志寄存器中的SF,ZF,AF,PF,CF送至AH中的相應(yīng)位。2.AH內(nèi)容送標(biāo)志寄存器低8位格式:SAHF

說(shuō)明:影響標(biāo)志3.標(biāo)志寄存器內(nèi)容進(jìn)棧格式:PUSHF4.標(biāo)志寄存器內(nèi)容出棧格式:POPF

說(shuō)明:影響標(biāo)志XXXXOFDFIFTFSFZFXAFXPFXCF小結(jié)——數(shù)據(jù)傳送類(lèi)指令通用數(shù)據(jù)傳送指令MOVPOPPUSHXCHG累加器專(zhuān)用傳送指令XLAT地址傳送指令LEAINLDSOUTLES標(biāo)志傳送指令LAHFPUSHFSAHFPOPF共14條,分為4組算術(shù)運(yùn)算指令

算術(shù)運(yùn)算指令用于實(shí)現(xiàn)加、減、乘、除等算術(shù)運(yùn)算,執(zhí)行后影響狀態(tài)標(biāo)志。它包括以下5類(lèi)指令:

(1)加法指令:

(2)減法指令:

(3)乘法指令

(4)除法指令

(5)BCD碼運(yùn)算指令算術(shù)運(yùn)算指令加減法運(yùn)算的操作數(shù)如下:說(shuō)明:(1)

源和目的操作數(shù)不能同時(shí)為存儲(chǔ)器單元(2)立即數(shù)不能作目的操作數(shù)REGIMMREGMEMMEMIMMREG±±加法類(lèi)指令1、不帶進(jìn)位位的加法指令格式:ADDdest,source

功能:將源和目的數(shù)相加,結(jié)果送目的,源保持不變。例:

ADDAL,20H

ADDAX,BX2、帶進(jìn)位位的加法指令(例:P75多字節(jié)加法)

格式:ADCdest,source

功能:將源、目的和CF相加,然后送目的操作數(shù)。例:

ADCAL,20H3、增量指令格式:INCdest

功能:將操作數(shù)加1后,再送回至該操作數(shù)中。例: INCCL對(duì)狀態(tài)標(biāo)志位的影響:CF:當(dāng)結(jié)果的最高位產(chǎn)生進(jìn)位,CF=1,否則CF=0;ZF:當(dāng)結(jié)果為0時(shí),ZF=1,否則ZF=0;SF:當(dāng)結(jié)果的最高位為1時(shí),SF=1,否則SF=0;OF:當(dāng)超出字或字節(jié)的表示范圍時(shí)OF=1,否則OF=0;PF:當(dāng)結(jié)果中1的個(gè)數(shù)為偶數(shù)時(shí),PF=1,否則PF=0;AF:當(dāng)運(yùn)算中D3產(chǎn)生進(jìn)位時(shí),AF=1,否則AF=0。其中:INC指令對(duì)CF標(biāo)志沒(méi)有影響。加法類(lèi)指令減法類(lèi)指令減法類(lèi)指令對(duì)標(biāo)志位的影響,除將進(jìn)位改為借位外,與加法類(lèi)指令相同。1、不考慮借位的減法指令格式:SUBdest,source功能:dest-sourcedest例:

SUBAX,BX2、考慮借位的減法指令格式:SBBdest,source功能:dest-source-CFdest例:

SBB

AX,2020H3、減量指令格式:DECdest功能:dest-1dest例:

DEC

CX減法類(lèi)指令求補(bǔ)指令格式:NEGdest功能:對(duì)操作數(shù)求補(bǔ)(對(duì)所有位求反后在最低位加1)。說(shuō)明:該指令是求補(bǔ)指令,不是求補(bǔ)碼指令。若將求補(bǔ)指令前后的數(shù)均視作補(bǔ)碼形式的符號(hào)數(shù),求補(bǔ)指令相當(dāng)于0-destdest,即將該數(shù)變?yōu)榻^對(duì)值相等符號(hào)相反的另一數(shù)。例:設(shè)AX=0FFFBH,則執(zhí)行NEGAX后,AX=0005H注:0FFFFBH可看作補(bǔ)碼形式的數(shù)-5比較指令格式:CMPdest,source功能:dest-source說(shuō)明:該指令主要用來(lái)判斷兩數(shù)的大小與是否相等,其后常常是條件轉(zhuǎn)移指令,根據(jù)比較的結(jié)果實(shí)現(xiàn)程序的分支。乘法除法指令乘除法指令包括無(wú)符號(hào)數(shù)乘除法指令和符號(hào)數(shù)乘除法指令。之所以分成兩類(lèi),是因?yàn)槌顺ú煌诩訙p法,無(wú)符號(hào)數(shù)的乘法和除法指令用于符號(hào)數(shù)運(yùn)算時(shí)不能得到正確結(jié)果。例:FFH乘以FFH,結(jié)果為FE01H

把它看作無(wú)符號(hào)數(shù)時(shí)結(jié)果是正確的;但若把它們看作符號(hào)數(shù)為(-1)×(-1)=-511,顯然是錯(cuò)誤的。因此符號(hào)數(shù)必須用專(zhuān)門(mén)的乘除法指令。乘法指令無(wú)符號(hào)數(shù)的乘法指令MUL和有符號(hào)數(shù)的乘法指令I(lǐng)MUL格式:MULsource

IMULsource說(shuō)明:源操作數(shù)為乘數(shù),可以是寄存器或存儲(chǔ)器操作數(shù),目的操作數(shù)隱含為AL或AX,也就是說(shuō)在使用乘法指令前必須先將被乘數(shù)送AL(字節(jié)乘)或AX(字乘)中。

ALSource8DXAXAXSource16AX××8位數(shù)乘法16位數(shù)乘法乘法指令乘法指令只影響CF和OF標(biāo)志位,對(duì)其他標(biāo)志無(wú)定義。乘法指令不會(huì)產(chǎn)生溢出和進(jìn)位,故用CF和OF來(lái)表示乘積有效數(shù)字的長(zhǎng)度。1、對(duì)于MUL指令,如果乘積的高一半為0(即字節(jié)操作的AH=0或字操作的DX=0),則CF和OF均為0,否則都為1。2、對(duì)于IMUL指令,如果乘積的高一半是低一半的符號(hào)擴(kuò)展,則CF和OF均為0,否則均為1(表示高半部分包含有結(jié)果的有效數(shù))。除法指令無(wú)符號(hào)數(shù)的除法指令DIV和符號(hào)數(shù)除法指令I(lǐng)DIV格式:DIVsource

IDIVsource除法指令所執(zhí)行的操作如下:商余數(shù)Source8AXAHALSource16DXDXAXAX商余數(shù)除法指令除法指令要求被除數(shù)的長(zhǎng)度為除數(shù)長(zhǎng)度的2倍。除法指令對(duì)所有的標(biāo)志位均無(wú)定義。當(dāng)除數(shù)為字節(jié)時(shí),商的范圍是-128~127;當(dāng)除數(shù)為字時(shí),商的范圍為-32768~32767;如果超出了該范圍,就作為除數(shù)為0的情況來(lái)處理,產(chǎn)生0號(hào)中斷,而不是使溢出標(biāo)志OF置1。符號(hào)擴(kuò)展指令擴(kuò)展指令CBW和CWD

在做8位除8位的除法前先要把8位的被除數(shù)擴(kuò)展為16位;同樣在做16位除16位之前要把16位被除數(shù)擴(kuò)展為32位,才能保證除法指令的正確執(zhí)行。對(duì)于無(wú)符號(hào)數(shù),只要簡(jiǎn)單地將AH和DX清零即可。對(duì)于符號(hào)數(shù),則需要用專(zhuān)門(mén)的擴(kuò)展指令將被除數(shù)的位數(shù)擴(kuò)展為原來(lái)的2倍。 格式:CBW ;字節(jié)擴(kuò)展

CWD ;字?jǐn)U展為雙字 說(shuō)明:上述指令對(duì)標(biāo)志位不影響。實(shí)例例:若在內(nèi)存的數(shù)據(jù)段中,有一個(gè)緩沖區(qū),第一個(gè)字為帶符號(hào)的被除數(shù),第二個(gè)字是除數(shù),實(shí)現(xiàn)這兩個(gè)數(shù)據(jù)相除,商和余數(shù)存放到后面的字節(jié)中。其程序段如下:

MOVBX,OFFSETBUFFER

(或LEABX,BUFFER)

MOVAX,[BX]

CWD

IDIVWORDPTR[BX+2] MOV[BX+4],AX MOV[BX+6],DX BCD運(yùn)算指令前面介紹的加減乘除指令都是針對(duì)二進(jìn)制數(shù)進(jìn)行的,若套用這些指令對(duì)BCD數(shù)進(jìn)行運(yùn)算,則需要使用BCD碼專(zhuān)用調(diào)整指令轉(zhuǎn)換后才能得到正確結(jié)果。BCD碼有兩類(lèi):1、組合的BCD數(shù):8位二進(jìn)制數(shù)表示兩位BCD碼,如:01001001表示49,也稱(chēng)作壓縮的BCD碼。2、非組合的BCD數(shù):8位二進(jìn)制數(shù)只用低4位表示1位BCD碼,高4位為0。如00000100表示4,也稱(chēng)作非壓縮的BCD碼。BCD碼的運(yùn)算

BCD數(shù)的低4位與高4位之間是“逢十進(jìn)一”,而4位二進(jìn)制數(shù)之間是“逢十六進(jìn)一”。故若用二進(jìn)制的運(yùn)算法則進(jìn)行BCD碼的運(yùn)算則需要進(jìn)行調(diào)整。當(dāng)兩個(gè)BCD數(shù)相加時(shí),相加的結(jié)果都在0~9之間,則其加法運(yùn)算規(guī)則完全同二進(jìn)制的加法規(guī)則;若低4位大于9或AF=1,則應(yīng)對(duì)其進(jìn)行加6調(diào)整。例:BCD數(shù)48+59相加,結(jié)果應(yīng)為BCD數(shù)107:

01001000

+ 01011001 10100001 即A1,結(jié)果錯(cuò)誤

+ 01100110

1 0000

0111

即(107)BCD,結(jié)果正確

107BCD運(yùn)算指令組合的BCD碼加法調(diào)整指令DAA格式:DAA含義:對(duì)隱含操作數(shù)AL的結(jié)果進(jìn)行調(diào)整,得到正確的組合的BCD碼十進(jìn)制和。具體操作是:若AL中的低4位大于9或AF=1,則將AL中的低4位+0110,并將AF=1若AL的高4位大于9或CF=1,則將AL中的高4位+0110,并將CF=1因調(diào)整時(shí)要用到標(biāo)志位CF和AF,因此調(diào)整指令要緊跟在加法指令后。所謂“緊跟”,也就是在加法指令和調(diào)整指令之間不得有其他改變這兩個(gè)標(biāo)志位的指令。BCD運(yùn)算指令例:若AL=28(BCD),BL=68(BCD),結(jié)果應(yīng)為96

ADDAL,BL ;結(jié)果為90H DAA ;調(diào)整過(guò)后為96H 00101000

+ 01101000 10010000 (90H,AF=1)

+ 0110 10010110 (96H,結(jié)果正確)BCD運(yùn)算指令非組合的BCD碼加法調(diào)整指令A(yù)AA格式:AAA含義:對(duì)在AL中的由兩個(gè)非組合的BCD碼相加后的結(jié)果進(jìn)行調(diào)整,在AX中得到正確的非組合BCD碼。具體操作是:若AL中的低4位大于9或AF=1,則AL+6AL,AH+1AH,AL的高4位清零,同時(shí)CF、AF標(biāo)志位置1。例: 7+6=13 00000111

+ 00000110 00001101

+00000110

00000001 00000011BCD運(yùn)算指令組合的BCD碼減法調(diào)整指令DAS非組合的BCD碼減法調(diào)整指令A(yù)AS非組合BCD數(shù)乘法調(diào)整指令A(yù)AM AAM:將AL/0AHAH,ALMOD0AHAL非組合BCD數(shù)除法調(diào)整指令A(yù)AD AAD:將AH*0AH+ALAL,0AH注意:1、加、減、乘是在運(yùn)算之后進(jìn)行調(diào)整,而除法是在運(yùn)算之前進(jìn)行調(diào)整。2、BCD碼是作為無(wú)符號(hào)數(shù)看待的,故乘除的指令應(yīng)為MUL和DIV指令。例:編程計(jì)算(W1-(W2*W3+W4-5000))/W5,結(jié)果送W6,式中的Wi均為符號(hào)字變量。

MOVAX,W2 ;先計(jì)算W2*W3的積,結(jié)果為32位

IMULW3 MOVBX,AX MOVCX,DX MOVAX,W4 ;計(jì)算W2*W3+W4 CWD ADDBX,AX ADCCX,DX

算術(shù)類(lèi)運(yùn)算指令實(shí)例例:編程計(jì)算(W1-(W2*W3+W4-5000))/W5,結(jié)果送W6,式中的Wi均為符號(hào)字變量。 SUBBX,5000 ;計(jì)算W2*W3+W4-5000 SBBCX,0 MOVAX,W1 ;計(jì)算W1-(W2*W3+W4-5000) CWD SUBAX,BX SBBDX,CX IDIVW5 ;計(jì)算(W1-(W2*W3+W4-5000))/W5 MOVW6,AX MOVW6+2,DX

算術(shù)類(lèi)運(yùn)算指令實(shí)例小結(jié)——算術(shù)運(yùn)算指令加法ADD減法SUBADCSBBINCDECAAANEGDAACMP除法DIVAASIDIVDASAAD乘法MULCBWIMULCWDAAM邏輯運(yùn)算指令求反指令NOT格式:NOT

dest含義:將操作數(shù)逐位取反(含符號(hào)位),對(duì)標(biāo)志位無(wú)影響。邏輯或OR格式:OR

dest,source功能:常用來(lái)給目的操作數(shù)的某些位置1。方法是將源操作數(shù)對(duì)應(yīng)位置1,目的操作數(shù)中不許置1的位則置0;邏輯與AND格式:ANDdest,source (邏輯乘)功能:可用于清除目的操作數(shù)的某些位,需屏蔽的位,將源操作數(shù)該位置0,其它位置1;例如:要將操作數(shù)0BFH的最低兩位置0MOVAL,10111111BANDAL,11111100B ;結(jié)果AL中內(nèi)容為10111100B邏輯運(yùn)算指令邏輯異或XOR格式:XOR

dest,source 功能:1)將通用寄存器清零,如:XORAX,AX。

2)對(duì)目的操作數(shù)的某些位取反,方法是要取反的位置1,其余位置0。例如:使AL的最低兩位求反

MOVAL,11H (00010001B)

XORAL,3 (00000011B)

結(jié)果使AL中的內(nèi)容變?yōu)?0010010B說(shuō)明:1、上述兩操作數(shù)指令要求至少有一個(gè)操作數(shù)為寄存器操作數(shù),另一個(gè)操作數(shù)可以使用任意尋址方式(其中立即數(shù)不能做目的操作數(shù))。2、上述指令將CF、OF清0,對(duì)SF、ZF和PF的影響同加操作。邏輯運(yùn)算指令測(cè)試指令TEST格式:TEST

dest,source功能:操作同AND指令,但結(jié)果不送至目的操作數(shù),僅影響標(biāo)志位。常用來(lái)檢查目的操作數(shù)的某一位是0還是1,供后面的條件轉(zhuǎn)移指令實(shí)現(xiàn)程序的分支。例:要測(cè)試AL中的D7位是否為1,否則返回繼續(xù)檢測(cè),是則繼續(xù)執(zhí)行后續(xù)的程序段:

loop1:

INAL,10H

TESTAL,80H

JZloop1移位指令移位指令的目的操作數(shù)可以在通用寄存器或存儲(chǔ)器中,可以是字也可以是字節(jié)。源操作數(shù)為移位的次數(shù),只能是CL或1。當(dāng)移位次數(shù)超過(guò)1次,就要先將移位次數(shù)送入CL。循環(huán)移位移位類(lèi)算術(shù)左移SAL算術(shù)右移SAR邏輯左移SHL邏輯右移SHR循環(huán)左移ROL循環(huán)右移ROR循環(huán)左移RCL循環(huán)右移RCR移位算術(shù)移位邏輯移位不帶進(jìn)位帶進(jìn)位移位指令格式:

SAL/SAR/SHL/SHR操作數(shù),1 ;移1位

SAL/SAR/SHL/SHR操作數(shù),CL ;移位(CL)次

移位之后改變操作數(shù)內(nèi)容,但CL的值不變!允許的操作數(shù)類(lèi)型:通用寄存器、存儲(chǔ)器對(duì)標(biāo)志位的影響:移出位→CF;按照移位后的結(jié)果設(shè)置其它標(biāo)志位。功能1.所有指令(8條)更新CF,其余標(biāo)志位由運(yùn)算結(jié)果決定。2.可部分地替代乘除法指令:將數(shù)擴(kuò)大或縮小2的n次。3.乘以2的n次時(shí),用算術(shù)/邏輯左移皆可(有/無(wú)符號(hào)數(shù))。除以2的n次時(shí),無(wú)符號(hào)數(shù)用邏輯右移,有符號(hào)數(shù)用算術(shù)右移。4.可分離出操作數(shù)中的某些位。移位指令移位指令移位指令移位指令實(shí)例用移位指令來(lái)完成乘除法運(yùn)算,比用乘除法指令完成相同的運(yùn)算用的時(shí)間要短得多。例:完成乘10的操作,用乘法指令最短需要70個(gè)T狀態(tài)(在寄存器中的兩個(gè)字節(jié)相乘)。而做如下變換后: X*10=X*2+X*8用移位指令來(lái)完成,則僅需要11個(gè)T狀態(tài)。

指令

含義

T狀態(tài)數(shù)SALAL,1 ;X*2 2MOVBL,AL ;將X*2放入BL中暫存 2SALAL,1 ;X*4 2SALAL,1 ;X*8 2ADDAL,BL ;X*2+X*8 3實(shí)例例:已知(AX)=0012H,(BX)=0034H,編程使之合并為(AX)=1234H解:

MOVCL,8

ROLAX,CL ADDAX,BX

實(shí)例例1:將以W為首址的字無(wú)符號(hào)數(shù)除以8,商放在AX中,余數(shù)放在DL中。

MOVAX,W ;先將其送入AX中

;將DL清零

SHRAX,1 ;邏輯右移,使W/2

;余數(shù)放入DL的高位

SHRAX,1 ;W/4 RCRDL,1 ;余數(shù)向右移

SHRAX,1 ;W/8 RCRDL,1 ; MOVCL,5 ;

;余數(shù)右移5位SHR

DL,CL

XOR

DL,DLRCR

DL,1 小結(jié)——邏輯運(yùn)算類(lèi)指令邏輯運(yùn)算指令NOTANDORXORTEST移位指令SAL循環(huán)指令ROLSHLRCLSARRORSHRRCR串操作指令串操作指令的約定:源串用DS:SI間址,目的串用ES:DI間址;對(duì)于較短的字符串,可將DS=ES;因此在字符串處理指令前,要先給SI和DI賦值;(2)源串和目的串的偏移地址指針的移動(dòng)方向由方向標(biāo)志DF確定:DF=0,SI和DI增量;DF=1,SI和DI減量。方向標(biāo)志置位指令STD

格式:STD

功能:使DF=1,使SI和DI減量方向標(biāo)志清除指令CLD

格式:CLD

功能:使DF=0,即清除DF,使SI和DI增量(3)若使重復(fù)前綴,則應(yīng)將串長(zhǎng)度送CX寄存器。串操作指令例:設(shè)在DS=3000H,偏移地址為0100H的內(nèi)存中存放著100個(gè)字節(jié)的數(shù)據(jù)。要求傳送到以0200H為起始地址的區(qū)域。

MOVAX,3000H

MOVDS,AX

MOVSI,0100H

MOVDI,0200H

MOVCX,100NEXT: MOVAL,[SI]

MOV[DI],AL

INCSI

INCDI

DECCX

JNENEXT

INT20H串操作指令例:設(shè)在DS=3000H,偏移地址為0100H的內(nèi)存中存放著100個(gè)字節(jié)的數(shù)據(jù)。要求傳送到以0200H為起始地址的區(qū)域。

MOVAX,3000H MOVDS,AX MOVES,AX MOVSI,0100H MOVDI,0200H MOVCX,100 CLD

REP

MOVSBINT20HNEXT:MOVSB

LOOPNEXT INT20H串操作指令重復(fù)前綴:只允許用在串操作指令前,使緊跟其后的串操作指令重復(fù)執(zhí)行。在使用重復(fù)前綴前,重復(fù)次數(shù)必須放在寄存器CX中,而且是先判斷,然后再?zèng)Q定是否執(zhí)行串操作。1.REP功能:作為指令MOVSB/MOVSW以及STOSB/STOSW的前綴,使傳送操作重復(fù)執(zhí)行,直到CX=0為止。2.REPE/REPZ(相等/為0重復(fù))功能:作為CMPSB/CMPSW和SCASB/SCASW指令的前綴,使比較或搜索重復(fù)執(zhí)行,直到CX=0或ZF=0為止;也即當(dāng)串未結(jié)束(CX≠0)且串是相等的(ZF=1),則繼續(xù)比較。3.REPNE/REPNZ(不相等/不為0重復(fù))功能:和說(shuō)明2類(lèi)似,但當(dāng)串未結(jié)束(CX≠0)且串不相等時(shí)(ZF=0)繼續(xù)比較。注:LODSB和LODSW一般不使用重復(fù)前綴。串操作指令串傳送指令格式: MOVSB或MOVSW功能:將SI所指向的源串(DS段)的B/W傳送到DI所指向的目的串(ES段)中,并修改SI和DI的值,以指向串的下一個(gè)字節(jié)或字。從源串中取數(shù)指令格式: LODSB或LODSW功能:將SI所指向的源串(DS段)中的一個(gè)字節(jié)或字取出送AL或AX,同時(shí)修改SI,指向下一個(gè)字節(jié)或字。往目的串中存數(shù)指令格式: STOSB或STOSW功能:將AL或AX中的內(nèi)容存放到ES數(shù)據(jù)段中DI為偏移地址的目的串中,同時(shí)修改DI指向下一個(gè)字節(jié)或字。串操作指令串比較指令格式: CMPSB或CMPSW功能:由SI作為指針的源串和由DI作為指針的目的串(B/W)相比較(源串-目的串),但減的結(jié)果只反映在標(biāo)志位上,同時(shí)修改SI和DI,使其指向下一個(gè)字節(jié)或字。串搜索(掃描)指令格式: SCASB或SCASW功能:用AL或AX減去ES:DI指向的目的串中的一個(gè)字節(jié)或字,減的結(jié)果既不送累加器,也不送目的串,僅影響標(biāo)志位,同時(shí)修改DI指向下一個(gè)操作數(shù)。

LEADI,STRING ;字符串的偏移地址放入DI

MOVAL,’$’ ;字符串結(jié)束標(biāo)志送AL

MOVCX,100 ;將重復(fù)查找次數(shù)送CX

CLD ;DI增量

REPNESCASB ;查找

JZL1 ;找到則轉(zhuǎn)L1

MOVAL,0FFH ;沒(méi)有找到

JMPL2 ;轉(zhuǎn)L2L1: MOVBX,100 ;求字符串的個(gè)數(shù)

SUBBX,CX ;

DECBL ;

MOVAL,BL ;將字符串長(zhǎng)度放入ALL2: MOVSTRLN,AL ;

INT20H串操作指令實(shí)例例、在String為始地址的字符串中搜索字符串結(jié)束標(biāo)志“$”,并將字符串長(zhǎng)度(不包括“$”)放入Strln單元中;如果連續(xù)100個(gè)字節(jié)單元之中無(wú)“$”,則在Strln單元中填入0FFH。小結(jié)——串操作類(lèi)指令串傳送指令MOVSB/MOVSW從源串取數(shù)LODSB/LODSW往目的串送數(shù)STOSB/STOSW串比較指令CMPSB/CMPSW串搜索指令SCASB/SCASW重復(fù)前綴REP/REPZ/REPNZ控制轉(zhuǎn)移類(lèi)指令轉(zhuǎn)移指令分為JMP和Jcond兩大類(lèi),前者稱(chēng)為無(wú)條件轉(zhuǎn)移指令,后者稱(chēng)為條件轉(zhuǎn)移指令,常用于選擇結(jié)構(gòu)的程序?qū)崿F(xiàn)中。

條件轉(zhuǎn)移指令測(cè)試標(biāo)志位的變化,然后根據(jù)測(cè)試結(jié)果轉(zhuǎn)移到相應(yīng)的程序段。條件轉(zhuǎn)移指令是相對(duì)轉(zhuǎn)移指令,轉(zhuǎn)移范圍是IP當(dāng)前值的-128~127字節(jié)范圍,即從當(dāng)前地址(執(zhí)行該指令時(shí)的IP值)到目的標(biāo)號(hào)地址的偏移量為-128~127。指令的格式為:Jcondshort-label簡(jiǎn)單的條件轉(zhuǎn)移指令指僅根據(jù)一個(gè)可測(cè)試標(biāo)志位實(shí)現(xiàn)轉(zhuǎn)移的指令。指令助記符 功能 標(biāo)志設(shè)置JE/JZ

相等/等于0轉(zhuǎn)移 Z=1JNE/JNZ

不相等/不等于0轉(zhuǎn)移 Z=0JC

有進(jìn)(借)位轉(zhuǎn)移 C=1JNC

無(wú)進(jìn)(借)位轉(zhuǎn)移 C=0JS

為負(fù)轉(zhuǎn)移 S=1JNS

為正轉(zhuǎn)移 S=0JO

溢出轉(zhuǎn)移 O=1JNO

無(wú)溢出轉(zhuǎn)移 O=0JP/JPE

偶轉(zhuǎn)移 P=1JNP/JPO

奇轉(zhuǎn)移 P=0組合標(biāo)志位的條件轉(zhuǎn)移指令在程序設(shè)計(jì)中經(jīng)常需要比較兩個(gè)數(shù)的大小,然后根據(jù)比較結(jié)果轉(zhuǎn)到不同的程序段去執(zhí)行。但對(duì)于無(wú)符號(hào)數(shù)和符號(hào)數(shù)須分開(kāi)進(jìn)行判斷。如11111111和00000000進(jìn)行比較,若為無(wú)符號(hào)數(shù)11111111(255)>00000000(0);若為符號(hào)數(shù),則11111111(-1)<00000000(0)。為此,使用兩種術(shù)語(yǔ)來(lái)區(qū)分無(wú)符號(hào)數(shù)和符號(hào)數(shù)的這種關(guān)系。對(duì)于符號(hào)數(shù),用“大于”和“小于”;對(duì)于無(wú)符號(hào)數(shù)則使用“高于”和“低于”。判斷無(wú)符號(hào)數(shù)和有符號(hào)數(shù)的大小是依據(jù)標(biāo)志位的組合狀態(tài)來(lái)判別的。條件轉(zhuǎn)移指令根據(jù)無(wú)符號(hào)數(shù)大小的比較結(jié)果而進(jìn)行條件轉(zhuǎn)移指令指令助記符 功能 標(biāo)志位JB/JNAE< 低于/不高于等于轉(zhuǎn)移 CF=1JBE/JNA≤ 低于等于/不高于轉(zhuǎn)移 CF+ZF=1JA/JNBZ> 高于/不低于等于轉(zhuǎn)移 CF+ZF=0JAE/JNB≥ 高于等于/不低于轉(zhuǎn)移 CF=0根據(jù)有符號(hào)數(shù)大小的比較結(jié)果而進(jìn)行條件轉(zhuǎn)移指令指令助記符 功能 標(biāo)志位JL/JNGE< 小于/不大于等于轉(zhuǎn)移 SF⊕OF=1JLE/JNG≤ 小于等于/不大于轉(zhuǎn)移 SF⊕OF=1或ZF=1JG/JNLZ> 大于/不小于等于轉(zhuǎn)移 SF⊕OF=0且ZF=0JGE/JNL≥ 大于等于/不小于轉(zhuǎn)移 SF⊕OF=0例如:105-50=53-105-50=-155 a: 01101001(105) 10010111(-105) b:+ 11001110(-50)

+ 11001110(-50)100110111(53) 1 01100101

SF=0,OF=0,ZF=0SF=0,OF=1

結(jié)論:a>b 結(jié)論:a<b105-(-50)=155-105-(-50)=-55 a: 01101001(105) 10010111(-105) b:+ 00110010(50)

+ 00110010(50) 10011011 11001001(-55)

SF=1,OF=1,ZF=0SF=1,OF=0

結(jié)論:a>b 結(jié)論:a<b符號(hào)數(shù)的條件轉(zhuǎn)移指令無(wú)條件轉(zhuǎn)移指令條件轉(zhuǎn)移只能實(shí)現(xiàn)段內(nèi)相對(duì)轉(zhuǎn)移,轉(zhuǎn)移范圍是-128~127。無(wú)條件轉(zhuǎn)移指令沒(méi)有范圍限制。在選擇程序中常用無(wú)條件轉(zhuǎn)移指令將各分支又重新會(huì)聚到一起。無(wú)條件轉(zhuǎn)移指令有直接轉(zhuǎn)移和間接轉(zhuǎn)移兩類(lèi)。2.無(wú)條件間接轉(zhuǎn)移指令格式:JMPdest說(shuō)明:目的操作數(shù)可為寄存器或存儲(chǔ)器。若為寄存器,則將寄存器的內(nèi)容送IP;若為存儲(chǔ)器字變量,則將其送IP,若為存儲(chǔ)器雙字變量,則將其分送IP和CS。段內(nèi)轉(zhuǎn)移:如JMPAX段間轉(zhuǎn)移:如JMPDWORDPTR[SI],其中[SI][SI+1]作為IP,[SI+2][SI+3]作為CS。1.無(wú)條件直接轉(zhuǎn)移指令格式:JMPtarget功能:將控制轉(zhuǎn)向目的標(biāo)號(hào)target,即target的偏移地址送IP,段首地址送CS。如在同一段,則無(wú)此操作,只改變IP段內(nèi)轉(zhuǎn)移:只改變IP,如JMP1000H段間轉(zhuǎn)移:IP和CS值都要改變,如JMP2500H:1000H循環(huán)控制指令循環(huán)控制指令常用于循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)中,一般放在循環(huán)的首部或尾部以確定是否進(jìn)行循環(huán);使用循環(huán)控制指令前必須把循環(huán)次數(shù)送入CX寄存器中,當(dāng)CX≠0時(shí),循環(huán)至目的地址,否則順序執(zhí)行下一條指令。循環(huán)指令采用相對(duì)尋址方式,也只能在-128~127的范圍內(nèi)轉(zhuǎn)移。1.LOOP指令格式:LOOPshort-label功能:將CXCX-1,若CX≠0,則程序轉(zhuǎn)到標(biāo)號(hào)處,否則順序執(zhí)行。一條LOOP指令相當(dāng)于下面兩條指令:

DECCX JNZshort-label循環(huán)控制指令2.LOOPZ/LOOPE指令含義:先將CXCX-1,若CX≠0,且ZF=1時(shí),程序轉(zhuǎn)至標(biāo)號(hào)處,否則順序執(zhí)行。例如,若又有循環(huán)次數(shù)的限制,而條件中又要比較兩個(gè)數(shù)是否相等,就要用到該指令。3.LOOPNZ/LOOPNE指令含義:先將CXCX-1,若CX≠0,且ZF=0時(shí),程序轉(zhuǎn)至標(biāo)號(hào)處,否則順序執(zhí)行。條件轉(zhuǎn)移與循環(huán)控制指令實(shí)例

LEABX,NUM MOVCX,10 DECCX MOVAL,[BX]chkmax: INCBX CMP[BX],AL JLEnext MOVAL,[BX] next: LOOPchkmax MOVMAX,AL

Findthelargestnumberandstoreinthemaxunit

子程序調(diào)用和返回指令

子程序調(diào)用指令分為直接調(diào)用和間接調(diào)用兩類(lèi),執(zhí)行時(shí)將下一條指令的地址進(jìn)棧保護(hù)后,程序轉(zhuǎn)到子程序中。1.直接調(diào)用指令格式:CALLtarget段內(nèi)調(diào)用:只需將IP進(jìn)棧保存。如CALL1000H段間調(diào)用:先將CS壓棧,再將IP壓棧。如CALL2500:1000H2.間接調(diào)用指令格式:CALLdest段內(nèi)調(diào)用:CALLAX段間調(diào)用:如CALLDWORDPTR[SI];將[SI][SI+1]送IP,將[SI+2][SI+3]送CS。子程序調(diào)用和返回指令返回指令(1)不帶參數(shù)的返回指令格式:RET功能:將程序返回到主程序。說(shuō)明:RET一般為子程序的最后一條指令,對(duì)于段內(nèi)調(diào)用和段間調(diào)用的返回指令形式上相同,但匯編時(shí)機(jī)器碼不同。段內(nèi)返回:將SP+2,彈出的字送IP;段間返回:彈出的第一個(gè)字送IP,彈出的第二個(gè)字送CS(2)帶參數(shù)的返回指令格式:RETn功能:從棧頂彈出返回地址后,再使SP+n,其中n為0~0FFFFH中的任一偶數(shù)。這條指令常用于用堆棧法傳遞參數(shù)的子程序調(diào)用中,n為子程序調(diào)用前壓入堆棧的參數(shù)的所占的字節(jié)數(shù)。例題詳解執(zhí)行以下程序段后,寫(xiě)出AX、SP、DX、CX及ZF的值:10A3H:2000H XORAL,AL 2002H MOVAX,CS 2004H MOVSS,AX 2006H MOVSP,2F00H 2009H MOVDX,2012H 200CH PUSHDX 200DH CALL2700H 2010H ADDCX,DX 2012H HLT10A3H:2700H POPCX RET答案:AX=10A3HSP=2F00HDX=2012HCX=2010HZF=1AL=0,ZF=1AX=10A3HSS=10A3HSP=2F00HDX=2012H將2012H入棧將2010H入棧跳過(guò)該指令CX=2010H2012H出棧中斷指令中斷:在系統(tǒng)運(yùn)行或程序運(yùn)行過(guò)程中,當(dāng)遇到某些特殊情況時(shí),需要計(jì)算機(jī)自動(dòng)執(zhí)行一組專(zhuān)門(mén)的例行程序來(lái)處理此類(lèi)事件,這種情況稱(chēng)為中斷。中斷類(lèi)型號(hào):8086/8088的每個(gè)中斷源都有一個(gè)號(hào)碼,范圍是0~255,稱(chēng)為中斷類(lèi)型號(hào)。中斷向量:即中斷服務(wù)程序的入口地址,由段地址和偏移地址組成,故共有4個(gè)字節(jié)。中斷向量表:在存儲(chǔ)器的最低地址區(qū)00000H~003FFH共1024個(gè)字節(jié)為中斷向量表,可以存放256個(gè)中斷服務(wù)程序的入口地址。中斷指令

80X86可以由指令的執(zhí)行引起中斷,并且設(shè)置有中斷指令以及中斷返回指令。當(dāng)程序需要轉(zhuǎn)移到某一指定的中斷服務(wù)程序時(shí),可以設(shè)置一條中斷指令來(lái)實(shí)現(xiàn)。通過(guò)中斷指令實(shí)現(xiàn)的中斷稱(chēng)之為軟件中斷。1.指定類(lèi)型中斷指令I(lǐng)NTn

(其中n為中斷類(lèi)型碼)80X86CPU在取得中斷類(lèi)型碼后的處理過(guò)程如下:(1)將n*4,得到其在中斷向量表中的指針;(2)將標(biāo)志寄存器入棧,此操作類(lèi)似于PUSHF指令;(3)清除中斷允許標(biāo)志,使IF=0,清除單步標(biāo)志,使TF=0;(4)保存斷點(diǎn)(即將下條指令的CS和IP入棧保護(hù));(5)從中斷向量表中取中斷服務(wù)程序的入口地址;(6)執(zhí)行中斷服務(wù)程序。中斷指令

2.溢出中斷指令I(lǐng)NTO說(shuō)明:中斷類(lèi)型碼為4,若上一條指令執(zhí)行的結(jié)果,使溢出標(biāo)志位OF=1,則INTO指令引起類(lèi)型為4的內(nèi)部中斷。否則,此指令不起作用,程序執(zhí)行下一條指令。

3.中斷返回指令I(lǐng)RET說(shuō)明:它的作用類(lèi)似于RET指令,是中斷服務(wù)程序的最后一條指令。但是IRET除了從堆棧中彈出偏移地址和段地址外,還彈出標(biāo)志寄存器的內(nèi)容。小結(jié)——控制轉(zhuǎn)移類(lèi)指令無(wú)條件轉(zhuǎn)移指令JMPlabel條件轉(zhuǎn)移指令JZ/JNZ(JE/JNE),JC/JNC,JS/JNS,JO/JNO,JP/JNP(JPE/JPO)JA/JNBE,JAE/JNB,JB/JNAE,JBE/JNAJG/JNLE,JGE/JNL,JL/JNGE,JLE/JNG循環(huán)控制指令LOOP/LOOPZ/LOOPNZ子程序調(diào)用指令CALLRETRETn中斷指令I(lǐng)NTnINTOIRET處理器控制指令標(biāo)志操作指令

8088共有7條直接對(duì)標(biāo)志位進(jìn)行操作的指令。其中3條針對(duì)標(biāo)志位CF,有2條針對(duì)標(biāo)志DF,有2條是針對(duì)標(biāo)志IF的。1、CLC,使CF=02、CMC,使CF取反3、STC,使CF=14、CLD,使DF=05、STD,使DF=16、CLI,使IF=0,不響應(yīng)外部可屏蔽中斷,又稱(chēng)關(guān)中斷。7、STI,使IF=1,允許CPU響應(yīng)來(lái)自INTR引腳上的中斷請(qǐng)求,又稱(chēng)開(kāi)中斷。處理器控制指令處理器暫停指令HLT(ProcessorHalt)格式:HLT功能:使CPU暫停,常在程序中用軟件的方法等待硬件中斷。在暫停狀態(tài)下CPU不進(jìn)行任何操作,也不影響標(biāo)志位。當(dāng)8088處在暫停狀態(tài)時(shí),只有下列三種情況可使CPU脫離暫停狀態(tài):(1)在RESET上有復(fù)位信號(hào)(2)在NMI線(xiàn)上有請(qǐng)求(3)在中斷允許情況下,在INTR線(xiàn)上有中斷請(qǐng)求處理器控制指令處理器交權(quán)指令ESC(ProcessorEscape)(或稱(chēng)換碼指令)格式:ESCMEM功能:當(dāng)CPU執(zhí)行該指令時(shí),將控制權(quán)交給協(xié)處理器,例如8087。ESC指令將存儲(chǔ)單元的內(nèi)容送到數(shù)據(jù)總線(xiàn)上去,使協(xié)處理器可以從存儲(chǔ)器得到指令或操作數(shù)。等待指令WAIT功能:使處理器空轉(zhuǎn),直到TEST#上的信號(hào)有效為止。說(shuō)明:8088有一個(gè)測(cè)試信號(hào)引腳TEST#,它是由WAIT指令測(cè)試的。若為低電平執(zhí)行WAIT指令后面的指令;若為高電平,CPU處于空閑等待狀態(tài),重復(fù)執(zhí)行WAIT指令。該指令用于使CPU與外部硬件同步,它對(duì)標(biāo)志位無(wú)影響。處理器控制指令總線(xiàn)封鎖指令LOCK功能:可放在任何一條指令前,使得在執(zhí)行其后的指令期間封鎖總線(xiàn),常用于CPU和其它協(xié)處理器協(xié)同工作。說(shuō)明:LOCK實(shí)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論