chap.3 指令系統(tǒng)(續(xù) 8086系統(tǒng)結(jié)構(gòu)和8086指令系統(tǒng))_第1頁
chap.3 指令系統(tǒng)(續(xù) 8086系統(tǒng)結(jié)構(gòu)和8086指令系統(tǒng))_第2頁
chap.3 指令系統(tǒng)(續(xù) 8086系統(tǒng)結(jié)構(gòu)和8086指令系統(tǒng))_第3頁
chap.3 指令系統(tǒng)(續(xù) 8086系統(tǒng)結(jié)構(gòu)和8086指令系統(tǒng))_第4頁
chap.3 指令系統(tǒng)(續(xù) 8086系統(tǒng)結(jié)構(gòu)和8086指令系統(tǒng))_第5頁
已閱讀5頁,還剩153頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

8086CPU結(jié)構(gòu)CPU引腳及其功能存儲(chǔ)器組織與堆棧總線周期與操作時(shí)序

第一部分8086系統(tǒng)結(jié)構(gòu)§1.18086CPU結(jié)構(gòu)

一、8086的功能結(jié)構(gòu)

Intel8086是一個(gè)由Intel于1978年所設(shè)計(jì)的16位微處理器芯片,是x86架構(gòu)的鼻祖。

8086從功能上分為兩部分:總線接口部分(BIU),執(zhí)行部分(EU)。兩部分各自執(zhí)行自己的功能,并行工作,這種工作方式與傳統(tǒng)的計(jì)算機(jī)在執(zhí)行指令時(shí)的串行工作方式相比極大地提高了工作效率。

通用寄存器AHALBHBLCHCLDISI暫存寄存器ALU標(biāo)志寄存器執(zhí)行部分控制電路123456CSDSSSESIP

內(nèi)部寄存器總線控制邏輯地址加法器20位16位8位指令隊(duì)列緩沖器6個(gè)字節(jié)外總線執(zhí)行部件(EU)總線接口部件(BIU)8086CPU結(jié)構(gòu)圖DHDLSPBPALU的數(shù)據(jù)總線16位1、總線接口部件(BIU)功能:(1)地址的形成(2)從內(nèi)存取指令送到指令隊(duì)列(3)CPU執(zhí)行指令時(shí),讀/寫操作數(shù)(4)總線控制總線接口部件的組成:(1)四個(gè)段地址寄存器

CS,16位代碼段寄存器(CodeSegment)

DS,16位數(shù)據(jù)段寄存器(DataSegment)

ES,16位附加段寄存器(ExtraSegment)

SS,16位堆棧段寄存器(StackSegment)(2)16位指令指針寄存器IP(PC)。InstructionPointerregister(3)20位的地址加法器。(4)六字節(jié)的指令隊(duì)列緩沖器。(5)總線控制邏輯:發(fā)出總線控制邏輯說明:(1)指令隊(duì)列緩沖器:存放6字節(jié)的指令代碼,先進(jìn)先出,允許預(yù)取6字節(jié)指令代碼。(2)地址加法器:產(chǎn)生20位地址。CPU內(nèi)無論是段地址寄存器還是偏移量都是16位的,通過地址加法器產(chǎn)生20位地址。2、執(zhí)行部件作用:(1)從指令隊(duì)列中取出指令。(2)對(duì)指令進(jìn)行譯碼,發(fā)出相應(yīng)的控制信號(hào)。(3)接收由總線接口送來的數(shù)據(jù)或發(fā)送數(shù)據(jù)至接口。(4)進(jìn)行算術(shù)、邏輯運(yùn)算。執(zhí)行部件的組成:(1)4個(gè)通用寄存器:AX(累加器)、BX(基址寄存器)、CX(計(jì)數(shù)寄存器)、DX(數(shù)據(jù)寄存器)

四個(gè)通用寄存器都是16位或作兩個(gè)8位來使用。(2)4個(gè)專用寄存器SP------堆棧指針寄存器(在堆棧操作使用)StackPointerBP------基址指針寄存器BasePointerDI-------目的變址寄存器DestinationIndexSI-------源變址寄存器(和DI成為變址寄存器,通常與DS一起使用,提供偏移量)SourceIndex(3)算術(shù)邏輯單元ALU

完成8位或者16位二進(jìn)制算術(shù)和邏輯運(yùn)算,計(jì)算偏移量。(4)數(shù)據(jù)暫存寄存器協(xié)助ALU完成運(yùn)算,暫存參加運(yùn)算的數(shù)據(jù)。(5)執(zhí)行部件的控制電路:取指令控制和時(shí)序控制從總線接口的指令隊(duì)列取出指令操作碼,通過譯碼電路分析,發(fā)出相應(yīng)的控制命令,控制ALU數(shù)據(jù)流向。(6)標(biāo)志寄存器16位寄存器,其中有7位未用。D15D0OFDFIFTFSFZFAFPFCF進(jìn)借位標(biāo)志奇偶標(biāo)志半進(jìn)借位標(biāo)志零標(biāo)志符號(hào)標(biāo)志單步中斷中斷允許方向標(biāo)志溢出標(biāo)志1-有進(jìn)、借位0-無進(jìn)、借位1-低8位有偶數(shù)個(gè)10-低8位有奇數(shù)個(gè)11-低4位向高4位有進(jìn)、借位0-低4位向高4位無進(jìn)、借位1-結(jié)果為00-結(jié)果不為03、CPU執(zhí)行程序的操作過程(1)20位地址形成,并將從該地址指定的單元中取出指令字節(jié),依次放入指令隊(duì)列中。(2)當(dāng)指令隊(duì)列中有2個(gè)空字節(jié)時(shí),總線接口部件就會(huì)自動(dòng)取指令至隊(duì)列中。(3)執(zhí)行部件從指令隊(duì)列隊(duì)首取出指令代碼,執(zhí)行該指令。(4)當(dāng)隊(duì)列已滿,執(zhí)行部件又不使用總線時(shí),總線接口部件進(jìn)入空閑狀態(tài)。(5)執(zhí)行轉(zhuǎn)移指令、調(diào)用指令、返回指令時(shí),先清空隊(duì)列內(nèi)容,再將要執(zhí)行的指令放入隊(duì)列中?!?.28086CPU的引腳及其功能8086CPU可在兩種模式下工作:

最小模式:只有一8086CPU。最大模式:有兩個(gè)或兩個(gè)以上的CPU,一個(gè)為主CPU8086,另一個(gè)為協(xié)CPU8087。指令周期:執(zhí)行一條指令所需要的時(shí)間。總線周期:CPU通過總線與存儲(chǔ)器或I/O接口進(jìn)行一次數(shù)據(jù)傳輸所需的時(shí)間。T狀態(tài)(時(shí)鐘周期):CPU處理動(dòng)作的最小單位。

T1狀態(tài)——輸出存儲(chǔ)器地址或I/O地址。T2狀態(tài)——輸出控制信號(hào)。T3和Tw狀態(tài)——總線操作持續(xù),并檢測(cè)READY以決定是否延長(zhǎng)時(shí)序。T4狀態(tài)——完成數(shù)據(jù)傳送T1T2T3TWT4總線周期01020304050607080910111213141516171819204039383736353433323130292827262524232221GNDAD14AD13AD12AD11AD10AD9AD8AD7AD6AD5AD4AD3AD2AD1AD0NMIINTRCLKGNDVCC(5V)AD15A16/S3A17/S4A18/S5A19/S6/BHE/S7MN//MX/RDHOLD(/RQ//GT0)

HLDA(/RQ//GT1)/WR(/LOCK)M//IO(/S2)DT//R(/S1)/DEN(/S0)ALE(QS0)/INTA(QS1)/TESTREADYRESET8086一、最小模式下的引腳及功能1、地址/數(shù)據(jù)總線(AddressandDataBus)AD15-AD0:地址/數(shù)據(jù)復(fù)用引腳,雙向,三態(tài)。在T1狀態(tài),為16位地址總線A15-A0,輸出訪問存儲(chǔ)器或I/O的地址信息。在T2~T4狀態(tài),為16位數(shù)據(jù)總線D15-D0,與存儲(chǔ)器和I/O設(shè)備交換數(shù)據(jù)信息。地址/數(shù)據(jù)總線復(fù)用,分時(shí)工作。2、A19/S6-A16/S3(Address/Status)地址/狀態(tài)總線復(fù)用引腳,輸出,三態(tài)。T1狀態(tài):輸出地址的高4位信息A19-A16T2、T3、T4狀態(tài):輸出狀態(tài)信息S6:指示當(dāng)前CPU是否與總線相連,S6=0,表示8086當(dāng)前與總線相連。S5:中斷允許標(biāo)志當(dāng)前的狀態(tài)。

S5=0,禁止一切可屏蔽中斷源的中斷請(qǐng)求;

S5=1,允許一切可屏蔽中斷源的中斷申請(qǐng)。S4、S3:當(dāng)前正在使用的段寄存器

S4S3段寄存器

00當(dāng)前正在使用ES01當(dāng)前正在使用SS10當(dāng)前正在使用CS11當(dāng)前正在使用DS

(5)READY:準(zhǔn)備就緒信號(hào),輸入,高電平有效。

READY=1,表示CPU訪問的存儲(chǔ)器或IO端口已準(zhǔn)備好傳送數(shù)據(jù)。若CPU在總線周期T3狀態(tài)檢測(cè)到READY=0,表示未準(zhǔn)備好,CPU自動(dòng)插入一個(gè)或多個(gè)等待狀態(tài)TW,直到READY=1為止。(6)INTR:可屏蔽中斷請(qǐng)求信號(hào),輸入。當(dāng)INTR=1,表示外設(shè)向CPU發(fā)出中斷請(qǐng)求,CPU在當(dāng)前指令周期的最后一個(gè)T狀態(tài)去采樣該信號(hào),若此時(shí),IF=1,CPU響應(yīng)中斷,執(zhí)行中斷服務(wù)程序。

(10)RESET:復(fù)位信號(hào),輸入,高電平有效。RESET信號(hào)至少要保持4個(gè)時(shí)鐘周期。復(fù)位時(shí):標(biāo)志寄存器、IP、DS、SS、ES為0,CS=FFFFH,指令隊(duì)列清空。復(fù)位后CPU從FFFF0H處開始執(zhí)行。(11)ALE:地址鎖存允許信號(hào),輸出,高電平有效。用來鎖存地址信號(hào)A15-A0,分時(shí)使用AD15-AD0地址/數(shù)據(jù)總線。

4、電源線和地線8086/8088采用單+5V,1、20引腳為地線。1.3

8086存儲(chǔ)器組織1、存儲(chǔ)器編址2、存儲(chǔ)器的分段結(jié)構(gòu)3、8086存儲(chǔ)器的分體結(jié)構(gòu)

1、存儲(chǔ)器編址

在內(nèi)存里以字節(jié)為單位存取信息,系統(tǒng)為每個(gè)字節(jié)編一個(gè)地址(二進(jìn)制數(shù)表示,書寫格式為十六進(jìn)制),稱為存儲(chǔ)器地址,存儲(chǔ)的內(nèi)容即為數(shù)據(jù)。地址內(nèi)容00000H00001H00002HFFFFFH000000010010001101000101……存儲(chǔ)器中的數(shù)據(jù)及表示形式2301H(規(guī)則字)4523H(非規(guī)則字)地址內(nèi)容00000H00001H00002HFFFFFH000000010010001101000101……01H2301H4523H45H數(shù)據(jù)地址字節(jié)數(shù)01H00000H字節(jié)數(shù)23H00001H字節(jié)數(shù)45H00002H字2301H00000H字4523H00001H順序存放,低字節(jié)低地址(字?jǐn)?shù)據(jù))2、存儲(chǔ)器的分段結(jié)構(gòu)

8086有20條地址線,尋址達(dá)220(1M)字節(jié),把1M字節(jié)的存儲(chǔ)器分為任意數(shù)量的段,其中每一段最多可達(dá)尋址216(64K)字節(jié)。

每個(gè)段的起始地址必須能16整除(該地址的最低四位為0000)。

8086可將內(nèi)存最多可分為64K個(gè)段,最少可分為16個(gè)段。每個(gè)段的最大范圍是64KB,最小的段是16B。段與段之間可連續(xù)分布,也可重疊。

(1)邏輯地址和物理地址物理地址:也稱實(shí)際地址,是用唯一的20位二進(jìn)制數(shù)所表示的地址,規(guī)定了1M字節(jié)存儲(chǔ)體中某個(gè)具體單元的地址。邏輯地址在程序中使用,即段地址:偏移地址

。如2000H:0003H2000H:0000H12H0001H34H0002H56H0003H78H

(2)物理地址的形成物理地址=段基址*16(左移4位)+偏移地址。段基址:CS、DS、ES、SS。偏移地址:IP、DI、SI、BX、BP、SP等。物理地址的形成如下:(由20位地址加法器實(shí)現(xiàn))段寄存器值偏移量+物理地址16位4位16位20位0000一個(gè)存儲(chǔ)單元可以有一個(gè)或多個(gè)邏輯地址,但只能有一個(gè)物理地址。例如物理地址21000H可以有以下幾個(gè)邏輯地址:

2100:0000H2000:0100H段基址由系統(tǒng)自動(dòng)分配,而偏移地址則由用戶編程時(shí)提供。

CS0000IP代碼段DS或ES0000SI、DI或BXSS0000SP或BP數(shù)據(jù)段堆棧段存儲(chǔ)器段寄存器和偏移地址寄存器組合關(guān)系

8086用兩個(gè)存儲(chǔ)體來組織實(shí)際存儲(chǔ)空間

奇地址偶地址00001H00003H00000H00002HFFFFEHFFFFFH….….A0A0~A19BHED8~D15D0~D7地址交叉排列8086D0~D15規(guī)劃字(對(duì)準(zhǔn)字)存放:偶地址作為字的地址非規(guī)劃字(非對(duì)準(zhǔn)字)存放:奇地址作為字的地址規(guī)則字的讀/寫只需訪問一次存儲(chǔ)器;非規(guī)則字的讀/寫需二次訪問存儲(chǔ)器。第一次訪問奇地址,第二次訪問偶地址。

§1.4總線周期與操作時(shí)序指令周期:執(zhí)行一條指令所需要的時(shí)間??偩€周期:CPU通過總線與存儲(chǔ)器或I/O接口進(jìn)行一次數(shù)據(jù)傳輸所需的時(shí)間。T狀態(tài)(時(shí)鐘周期):CPU處理動(dòng)作的最小單位。T1T2T3TWT4總線周期T1狀態(tài)——輸出存儲(chǔ)器地址或I/O地址。T2狀態(tài)——輸出控制信號(hào)。T3和Tw狀態(tài)——總線操作持續(xù),并檢測(cè)READY以決定是否延長(zhǎng)時(shí)序。T4狀態(tài)——完成數(shù)據(jù)傳送8086的操作時(shí)序分為如下幾個(gè)總線周期:(1)總線讀周期

(2)總線寫周期(3)總線空操作(4)中斷響應(yīng)周期(5)總線保持和響應(yīng)周期(6)復(fù)位操作

(4)TW狀態(tài)在T3狀態(tài),存儲(chǔ)器或外設(shè)沒有準(zhǔn)備好數(shù)據(jù),不能在T3狀態(tài)將數(shù)據(jù)放到總線上,使READY=0,則CPU在T3和T4之間插入一個(gè)或幾個(gè)TW狀態(tài),直到數(shù)據(jù)準(zhǔn)備好READY=1為止。TW狀態(tài)時(shí)總線的動(dòng)作與T3時(shí)相同。(5)T4狀態(tài)CPU對(duì)數(shù)據(jù)總線進(jìn)行采樣,讀出數(shù)據(jù)。CPU往存儲(chǔ)器或I/O設(shè)備讀數(shù)據(jù)的時(shí)序如下頁所示:CLKT1T2T3、TWT4

A19/S6-A16/S3A19-A16/BHE/S7/BHES7-S3ALEREADYAD15-AD0地址輸出數(shù)據(jù)輸入

CPU從存儲(chǔ)器或I/O端口讀取數(shù)據(jù)的時(shí)序

(5)T4狀態(tài)在T4狀態(tài),數(shù)據(jù)從數(shù)據(jù)總線上被撤除,各種控制信號(hào)和狀態(tài)信號(hào)進(jìn)入無效狀態(tài),CPU完成了對(duì)存儲(chǔ)器或I/O設(shè)備的寫操作。

3、總線空操作8086只有在CPU和存儲(chǔ)器或外設(shè)要傳送數(shù)據(jù)時(shí),才能執(zhí)行上述的總線周期;當(dāng)指令隊(duì)列已滿,且EU未申請(qǐng)?jiān)L問存儲(chǔ)器時(shí),不執(zhí)行總線周期,總線接口進(jìn)入了總線空閑周期。S6~S3同前一總線周期;若前一周期是讀周期,則AD15~AD0為高阻態(tài);總前一周期是寫周期,則AD15~AD0保持?jǐn)?shù)據(jù)有效。CLKT1T2T3、TWT4M//IOA19/S6-A16/S3A19-A16/BHE/S7/BHES7-S3ALEREADYAD15-AD0地址輸出數(shù)據(jù)輸出/WRDT//R/DENCPU往存儲(chǔ)器或I/O端口寫數(shù)據(jù)的時(shí)序4、中斷響應(yīng)周期中斷響應(yīng)周期:CPU中止現(xiàn)行程序轉(zhuǎn)中斷服務(wù)程序這一過程。中斷響應(yīng)周期要用兩個(gè)總線周期。第一個(gè)響應(yīng)周期:使AD15-AD0、/BHE/S7、A19/S6-A16/S3懸空。第二個(gè)響應(yīng)周期:外設(shè)向數(shù)據(jù)總線上輸送一個(gè)字節(jié)的中斷類型號(hào)。每一響應(yīng)周期的T1狀態(tài)輸出一個(gè)高電平脈沖,作為地址鎖存信號(hào)。CLKT1T2T3T4T1T2T3T4第一中斷響應(yīng)周期第二中斷響應(yīng)周期ALE/INTAAD7-AD08086中斷響應(yīng)周期的時(shí)序圖中斷類型號(hào)5、總線保持和響應(yīng)周期當(dāng)系統(tǒng)中CPU之外的另一個(gè)控制器要求使用總線時(shí),向CPU發(fā)請(qǐng)求信號(hào)HOLD。在每個(gè)時(shí)鐘脈沖的上升沿,CPU檢測(cè)HOLD,如為高電平,并且允許讓出總線時(shí),在總線周期的T4或空閑狀態(tài)Ti之后的下一個(gè)時(shí)鐘周期,CPU發(fā)出總線響應(yīng)信號(hào)HLDA,并且讓出總線,直到HOLD信號(hào)無效,CPU才收回總線控制權(quán)。6、系統(tǒng)復(fù)位產(chǎn)生:RESET端上的高電平維持4個(gè)時(shí)鐘周期,可使CPU復(fù)位。CPU復(fù)位:PSW、DS、ES、SS、IP等寄存器被清零,指令隊(duì)列被清空。CS寄存器設(shè)置為FFFFH。當(dāng)RESET由高電平變低電平7個(gè)機(jī)器周期后,CPU開始從FFFF0處執(zhí)行程序。注:由于復(fù)位后,IF=0,處關(guān)中斷狀態(tài),所以在初始化程序中應(yīng)開中斷,使CPU可響應(yīng)中斷請(qǐng)求。8086的復(fù)位時(shí)序:CLKRESET輸入RESET內(nèi)部三態(tài)門浮空CPU內(nèi)部用時(shí)鐘CLK來同步外部的復(fù)位信號(hào)8086CPU復(fù)位后總線信號(hào):AD15-AD0:A19/S6-A16/S3:/BHE/S7:S2、S1、S0:/LOCK、/RD、/INTA:ALE、HLDA、QS0、QS1:/RQ//GT0:/RQ//GT1:高阻狀態(tài)低電平高電平第二部分8086指令系統(tǒng)指令系統(tǒng)是微處理器(CPU)所能執(zhí)行的指令的集合,它與微處理器有密切的聯(lián)系,不同的微處理器有不同的指令系統(tǒng)。本部分介紹8086/8088CPU的尋址方式以及各種指令系統(tǒng),并通過具體實(shí)例講述了各條指令的功能和使用方法。通過本部分的學(xué)習(xí),讀者應(yīng)該掌握以下內(nèi)容:

?4類操作數(shù)的尋址方式

?常用指令的格式、功能、以及對(duì)標(biāo)志位的影響§2.18086的尋址方式匯編指令的格式如下:形成有效操作數(shù)過程稱之為操作數(shù)的尋址。操作來源有四種:立即數(shù)、寄存器、存儲(chǔ)器、I/O端口。操作碼操作數(shù)一、立即尋址方式指令操作數(shù)部分直接給出指令的操作數(shù),操作數(shù)與操作碼一起存入代碼段中。立即數(shù)有8位和16位。例:MOVAL,05H;源操作數(shù)為立即尋址指令執(zhí)行后,AL=05H,8位數(shù)據(jù)05H存入AL寄存器。例:MOVAX,3064H;源操作數(shù)為立即尋址指令執(zhí)行后,AX=3064H,16位數(shù)據(jù)3064H存入AX寄存器。注意:①立即數(shù)只能作源操作數(shù),不能作目的操作數(shù)。②以A、B、C、D、E、F開頭的數(shù)字出現(xiàn)在指令中時(shí),必須在前面加一個(gè)數(shù)字0。③立即數(shù)可以送到寄存器、存儲(chǔ)器中。例:下列指令是錯(cuò)誤的。

MOV2000H,AXMOVAL,B5H

而指令MOV[2000H],1234H是對(duì)的。二、寄存器尋址方式

寄存器尋址方式的操作數(shù)是寄存器的值,指令中直接使用寄存器名,包括8位或16位通用寄存器和段寄存器。可使用的16位寄存器:AX、BX、CX、DX、SI、DI、SP、BP、CS、DS、ES、SS;其中AX、BX、CX、DX可各自分成兩個(gè)8位寄存器別使用。例:MOVAX,CX;(AX)←(CX)

MOVAL,1H;(AL)←

1注意:①CS不能作為目的操作數(shù),如MOVCS,AX是錯(cuò)誤的指令。②源操作數(shù)必須與目的操作數(shù)相匹配。如

MOVAL,BX是錯(cuò)誤的三、存儲(chǔ)器尋址方式偏移地址、有效地址與物理地址 在存儲(chǔ)器尋址方式中,操作數(shù)是某個(gè)內(nèi)存單元的 內(nèi)容(值),指令中給出的是內(nèi)存單元的偏移地 址(即有效地址EA)。段地址通常在隱含的某 個(gè)段寄存器中。存儲(chǔ)單位的實(shí)際地址即為物理地 址,它通常由段地址和有效地址組合而成由于內(nèi)存單元的地址的給出方式不同,存儲(chǔ)器尋址又可分為以下幾種尋址方式:直接尋址寄存器間接尋址寄存器相對(duì)尋址基址變址尋址相對(duì)基址變址尋址物理地址=段基址+EA1、直接尋址方式

形式:MOVAX,[nn]//直接地址

MOVAX,X//標(biāo)號(hào)地址

在直接尋址方式中,操作數(shù)的偏移地址(有效地址EA)直接用指令加以指定(有直接地址值和標(biāo)號(hào)兩種形式),它存放在代碼段中指定操作碼之后操作數(shù)一般存放在存儲(chǔ)器的數(shù)據(jù)段中,所以必須先求出操作數(shù)的物理地址,然后再訪問存儲(chǔ)器才能取得操作數(shù)。段地址隱含的由DS指定,也可以ES指定(需在指令中指明)。存儲(chǔ)器地址為:

DS:偏移地址或ES:偏移地址。例:MOVAX,[2000H]

將DS:2000H單元內(nèi)容送入AXMOVAL,[2000H]

將DS:2000H單元的內(nèi)容取一個(gè)字節(jié)送AL例:MOVAX,ES:[2000H]

將ES:2000H單元中的內(nèi)容送入AX

傳送原則:低地址的內(nèi)容(字節(jié))送寄存器的低位,高地址的內(nèi)容送寄存器的高位。段超越前綴:顯式給出段基址寄存器2、寄存器間接尋址寄存器間接尋址方式的操作數(shù)形式為:[reg]操作數(shù)的有效地址包含在基址寄存器BX,基址指針BP或一個(gè)變址寄存器(SI或DI)中。寄存器間接尋址要用方括號(hào)括起來(寄存器尋址區(qū)別)例:MOVAX,[BX];將由BX決定的存儲(chǔ)單元的內(nèi)容送到AX寄存器。0000000100020003BBAAAXAHALAABB寄存器間接尋址數(shù)據(jù)段0002BX操作數(shù)在存儲(chǔ)器中,指令中寄存器內(nèi)容作為操作數(shù)所在單元的有效地址。

(BX)(SI)(DI)(BP)有效地址=

默認(rèn)的段寄存器為DS默認(rèn)的段寄存器為SS物理地址計(jì)算方法:物理地址=(DS)*16+(BX)或(SI)或(DI)物理地址=(SS)*16+(BP)例:已知:(DS)=2100H,(DI)=2000H

指令:MOVAX,[DI];的執(zhí)行結(jié)果是?解:物理地址=(DS)*16+(DI)

=2100H*16+2000H=21000H+2000H=23000H

指令結(jié)果:將23000H單元內(nèi)容送AL中,將23001H單元內(nèi)容送AH中。例:MOVAX,DS:[BP]MOVBX,ES:[SI]這些是使用段超越前綴的3、寄存器相對(duì)尋址方式操作數(shù)在存儲(chǔ)器內(nèi),指令中寄存器內(nèi)容與指令指定的位移量(DISP)之和作為操作數(shù)所在單元的有效地址。

(BX)

offset8

(SI)

(DI)(BP)offset16有效地址=

段寄存器為DS段寄存器為SS+物理地址=(DS)*16+(BX)+offset8

(SI)、(DI)、offset16類同。物理地址=(SS)*16+(BP)+offset16例:

如果(DS)=3000H,(SI)=2000H,COUNT=3000H,則執(zhí)行指令MOVAX,CONUT[SI],求出此種尋址方式對(duì)應(yīng)的有效地址和物理地址。有效地址=2000H+3000H=5000H物理地址=(DS)*16+5000H=30000H+5000H=35000H上述指令也可表示為:MOVAX,[CONUT+SI]4、基址變址尋址方式:操作數(shù)在存儲(chǔ)器中,指令將基址寄存器(BX或BP)與變址寄存器(SI或DI)內(nèi)容之和作為操作數(shù)所在存儲(chǔ)單元的有效地址。

(BX)(SI)(BP)(DI)有效地址=+物理地址=(DS)*16+(BX)+(SI)或(DI)物理地址=(SS)*16+(BP)+(SI)或(DI)例:MOVAX,[BX+DI]或MOVAX,[BX][DI]

功能:將DS:(BX)+(DI)字存儲(chǔ)單元內(nèi)容送AX。例:MOVAX,[BP+SI]或MOVAX,[BP][SI]功能:將SS:(BP)+(SI)字存儲(chǔ)單元內(nèi)容送AX。

例:如果(DS)=2100H,(BX)=0158H,(DI)=10A5H,則執(zhí)行指令MOVAL,[BX][DI]解:有效地址:EA=(BX)+(DI)=0158H+10A5H=11FDH

物理地址:(DS)*16+有效地址=21000H+11FDH=221FDH執(zhí)行結(jié)果:將221FDH單元內(nèi)容送入寄存器AL中MOVAL,[BX+DI]等價(jià)5、相對(duì)基址變址尋址方式操作數(shù)在存儲(chǔ)器內(nèi),指令將基址寄存器(BX或BP)與變址寄存器(SI或DI)的內(nèi)容之和再加上位移量(8位或16位),得到操作數(shù)所在單元的有效地址。(BX)(SI)offset8

(BP)(DI)offset16物理地址=(DS)*16+(BX)+(SI/DI)+偏移量物理地址=(SS)*16+(BP)+(SI/DI)+偏移量有效地址=++例:已知:(DS)=3000H,(BX)=2000H,(SI)=1000H,MK=0250H

指令:MOVAX,MK[BX][SI]

或MOVAX,MK[BX+SI]

或MOVAX,[MK+BX+SI]

解:有效地址:MK+(BX)+(SI)=0250H+2000H+0100H=3250H物理地址:(DS)*16+有效地址=30000H+3250H=33250H執(zhí)行結(jié)果:將33250H單元內(nèi)容送AL,33251H內(nèi)容送AH。

6、段超越當(dāng)操作數(shù)在內(nèi)存單元時(shí),系統(tǒng)根據(jù)隱含約定,自動(dòng)將寄存器DS或SS的值作為段地址。然而,當(dāng)操作數(shù)段地址不在隱含的段寄存器時(shí),可以使用段超越前綴取代其隱含約定。

段超越前綴形式為:

段寄存器名:MEM說明:MEM可是具體的數(shù)、寄存器以及他們的組合形式,例如:MOVAX,ES:[BP];段地址在ESMOVAX,CS:[BX][SI];段地址在CS段地址的基本約定和允許超越的情況如表所示:存儲(chǔ)器存取方式約定段允許超越段偏移地址取指令堆棧操作源串目的串BP作基址通用數(shù)據(jù)讀寫CSSSDSESSSDS無無CS,ES,SS無CS,DS,ESCS,ES,SSIPSPSIDI有效地址EA有效地址EA7、對(duì)內(nèi)存尋址方式的注解(1)在匯編后,指令中的變量名由具體的偏移地址所取代。

(2)在寄存器相對(duì)尋址與相對(duì)基址變址方式中,位移量disp可以是符號(hào)常量或變量,匯編后為一個(gè)常數(shù),若是變量,則取其偏移地址。(3)在Microsoft宏匯編MASM(MicrosoftMacroAssembler)中,內(nèi)存操作數(shù)可以采用多種書寫形式:6[BX][SI]、[BX+6][SI]、[BX+SI+6],他們是等價(jià)的

(4)在[]中只能出現(xiàn)立即數(shù)和BX、BP、SI、DI,且BX和BP、SI和DI不能成對(duì)出現(xiàn)在[]中。如:[BX+BP]、[SI+DI]是非法的指令形式(5)計(jì)算出的有效地址以16位表示,若超過0FFFFH,CPU將忽略所有溢出。(6)記憶8086內(nèi)存操作數(shù)形式的簡(jiǎn)易方法如下:

[BX][SI]disp[BP][DI]四、端口尋址方式操作數(shù)在端口寄存器中,指令中給出了端口的地址。根據(jù)端口地址的不同,有兩種尋址方式:1、端口直接尋址:用8位的立即數(shù)端口地址范圍:00H~FFH

如:INAL,80H;//輸入8位數(shù)據(jù)

INAX,80H;//輸入16位數(shù)據(jù)

OUT81H,AL//輸出8位數(shù)據(jù)2、端口間接尋址,用16位的寄存器DX指定端口為地址范圍:0000H~FFFFH

如:MOVDX,218HINAL,DX源操作數(shù)的尋址方式例源操作數(shù)的允許形式

直接操作數(shù)(立即數(shù))MOVAX,20H指令中的直接常數(shù)間接操作數(shù)

寄存器操作數(shù)MOVAX,BX通用寄存器或段寄存器存儲(chǔ)器操作數(shù)直接尋址MOVAX,DS:[20]MOVAX,B(字)“段:[常數(shù)]”或“段:常數(shù)”“[變量]”或“變量”間接尋址寄存器間接尋址MOVAX,[BX][BX,BP,SI,DI之一]寄存器相對(duì)尋址MOVAX,[BX+20]MOVAX,[BX+B(字)][BX,BP,SI,DI之一+位移量]基址變址尋址MOVAX,[BX+SI][BX,BP之一+SI,DI之一]相對(duì)基址變址尋址MOVAX,[BX+SI+20]MOVAX,[BX+SI+B][BX,BP之一+SI,DI之一+位移量]端口操作數(shù)

直接尋址INAL,20H指令中有端口號(hào)(0~0FFH)

間接尋址INAL,DXDX中有端口號(hào)(0~0FFFFH)操作數(shù)的尋址方式例:已知:DS=1000H,BX=0200H,SI=02H,內(nèi)存10200H~10205H單元的內(nèi)容分別是10H,2AH,3CH,46H,59H,6BH。下列指令執(zhí)行完成后,AX寄存器里面的內(nèi)容各是什么?MOVAX,0200HMOVAX,[200H]MOVAX,BXMOVAX,[BX]MOVAX,3[BX]MOVAX,[BX+SI]MOVAX,2[BX+SI]第二部分8080指令系統(tǒng)§2.28086/8088的指令系統(tǒng)8086/8088的指令系統(tǒng)可以分為6組:(1)數(shù)據(jù)傳送指令(2)算術(shù)運(yùn)算指令(3)邏輯指令與移位指令(4)串操作指令(5)控制轉(zhuǎn)移指令(6)處理機(jī)控制指令

一、數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令是最簡(jiǎn)單、最常用的一類指令,它是負(fù)責(zé)把數(shù)據(jù)、地址、或立即數(shù)傳送到寄存器或存儲(chǔ)單元中

。這類指令又可分為以下幾種情況:通用傳送指令:MOV、PUSH/POP、XCHG、XLAT輸入輸出指令:IN、OUT地址目標(biāo)傳送指令:LEA、LDS、LES標(biāo)志傳送指令:LAHF、SAHF、PUSHF、POPF1、通用傳送指令(1)MOV(Move):傳送指令指令格式:

MOVdest,src;dest←src功能:將源操作數(shù)src復(fù)制到目的操作數(shù)dest中,源操作數(shù)src的內(nèi)容不變。對(duì)標(biāo)志位的影響:無語法格式:

MOVreg/mem/seg,reg/mem/seg/imm MOV指令的操作數(shù)及傳送方向見下頁立即數(shù)IMM存儲(chǔ)器MEM通用寄存器REGDS、ES、SSCS(SEG)說明:①雙操作數(shù)指令不允許兩個(gè)操作數(shù)同時(shí)為段寄存器或存儲(chǔ)器操作數(shù)

MOVseg,seg;錯(cuò)誤

MOVmem,mem;錯(cuò)誤

②立即數(shù)不能傳送到段寄存器中

MOVseg,imm ;錯(cuò)誤

③立即數(shù)不能作為目的操作數(shù)

MOVimm ,

reg;錯(cuò)誤④目的操作數(shù)不允許使用CS、IP寄存器

MOVCS,AX;錯(cuò)誤⑤dest與src必須類型匹配,即同時(shí)是字節(jié)或字類型。

MOVAX,BX寄存器具有明確的類型,例如,AL、AX分別為字節(jié)、字類型。立即數(shù)沒有明確的類型,MASM(宏匯編語言)負(fù)責(zé)將立即數(shù)擴(kuò)展為與目的操作數(shù)位數(shù)相同。

MOVAL,34HMOVBX,56H有時(shí)MASM不能確定內(nèi)存操作數(shù)的類型,需要用byteptr和wordptr明確指出是字節(jié)或字類型。只要其中一個(gè)操作數(shù)的類型確定即可。

MOV[2000H],ALMOV[2000H],BYTEPTR34H例:錯(cuò)誤的MOV指令如下所示:MOVAX,BL;類型不匹配MOVDS,1000H;不允許立即數(shù)送段寄存器MOV[BX],[SI];不允許內(nèi)存操作數(shù)之間傳送MOVES,CS;不允許段寄存器之間傳送MOVCS,AX;CS不能作為目的操作數(shù)(2)XCHG(Exchange):交換指令指令格式:XCHG目的,源;功能:交換源操作數(shù)與目的操作數(shù)相交換注意:

允許Reg←→Reg,Reg←→Mem(段寄存器除外)不允許Mem←→Mem例:設(shè)AX=2000H,DS=3000H,BX=1800H,(31A00H)=1995H,執(zhí)行下面指令的結(jié)果是?

XCHGAX,[BX+200H]解:源操作數(shù)物理地址為:DS×16+BX+200H=31A00H

那么執(zhí)行執(zhí)行之后:AX=1995H, 而(31A00H)=2000H(3)PUSH:入堆操作指令格式:PUSHREG/MEM/SEG功能:將源操作數(shù)推入堆棧執(zhí)行過程:先移后入(SP)←(SP)-2,((SS)+(BP))←(SRC)

(4)POP:出棧操作

POPREG/MEM/SEG先出后移。但CS不能作為目的操作數(shù)。2、輸入輸出指令

輸入輸出指令是用來實(shí)現(xiàn)I/O端口與AX之間的數(shù)據(jù)傳送。根據(jù)端口地址的不同,又分為端口直接尋址和端口間接尋址兩種。(1)IN(INPUT)格式:INAL,(PORT);8位地址、8位數(shù)據(jù)

INAX,(PORT);8位地址、16位數(shù)據(jù)或:INAL,DX;//端口地址放在DX寄存器中

INAX,DX;(2)OUT(OUTPUT)格式:OUTDX,AL;其余類同。3、地址目標(biāo)傳送指令:專用于傳送地址碼。(1)LEA:取有效地址格式:LEAREG,MEM功能:取源操作數(shù)地址的偏移量,并把它傳送到目的操作數(shù)所在的單元。要求:源操作數(shù)必須是一個(gè)存儲(chǔ)器操作數(shù),目標(biāo)操作數(shù)必須是一個(gè)除段寄存器以外的16位寄存器,通常是變址寄存器SI等。LEA指令與MOV指令的區(qū)別:MOV一般傳送的是源操作中的內(nèi)容而不是地址。BUFF=0123454800FEFFLEASI,BUFF;執(zhí)行后:(SI)=0002HMOVSI,BUFF;執(zhí)行后:(SI)=0048H段起始地址012013201432015432014800FEFF543201(2)

LDS:將雙字指針?biāo)偷郊拇嫫骱虳S指令(LoadPointerusingDS)格式:LDSreg16,mem32

功能:從源操作數(shù)指定的存儲(chǔ)單元中,取出一個(gè)變量的4個(gè)字節(jié)地址指針,前兩個(gè)字節(jié)(表示變量偏移量)送入指定寄存器,后兩個(gè)字節(jié)(表示變量段地址)送DS寄存器。(3)LES:將雙字指針?biāo)偷郊拇嫫骱虴S指令(LoadPointerusingES)格式:LESreg16,mem32

;功能:功能與LDS類似,只不過后兩個(gè)字節(jié)送ES寄存器。4.標(biāo)志傳送(位操作)指令

LAHFSAHFPUSHFPOPF隱含操作數(shù)AH隱含操作數(shù)FLAGS(1)LAHF(LoadAHFromFlags)功能:將FLAGS的低8位裝入AH格式:LAHFSFPFAFZFCF….AHFLAGSD15D0D7D0(2)SAHF(StoreAHintoFlags)功能:執(zhí)行與LAHF相反的操作,把AH的內(nèi)容存入標(biāo)志寄存器。指令格式:SAHFD0SFPFAFZFCF….AHFLAGSD15D7D0(3)PUSHF(PUSHFlagsontoStack)功能:將標(biāo)志寄存器的內(nèi)容進(jìn)棧,同時(shí)修改SP:SP←Sp-2。指令格式:PUSHF(4)POPF功能:把當(dāng)前SP所指的字送到標(biāo)志寄存器PSW,并修改SP的值:SP←Sp+2

。指令格式:POPF標(biāo)志傳送指令說明:LAHF/SAHF指令是寄存器AH與標(biāo)志寄存器PSW的低字節(jié)之間完成的字節(jié)型數(shù)據(jù)傳送。

PUSHF/POPF指令是標(biāo)志寄存器PSW與堆棧間進(jìn)行的字型數(shù)據(jù)傳送。指令SAHF/POPF將影響標(biāo)志位。所有的數(shù)據(jù)傳送類指令僅此兩條指令影響標(biāo)志位。成對(duì)的使用PUSHF和POPF,可以對(duì)標(biāo)志位寄存器進(jìn)行保存和恢復(fù),常常用在過程調(diào)用和終端服務(wù)程序的開頭與結(jié)尾處。二、算術(shù)運(yùn)算指令運(yùn)算的數(shù)據(jù)類型:有符號(hào)二進(jìn)制數(shù)、無符號(hào)二進(jìn)制數(shù)、無符號(hào)壓縮BCD碼、無符號(hào)非壓縮BCD碼。除CBW、CWD外,所有指令均影響標(biāo)志位。指令類型:加法:ADD、ADC、INC減法:SUB、SBB、DEC、NEG、CMP乘法:MUL、IMUL除法:DIV、IDIV符號(hào)擴(kuò)展:CBW、CWD十進(jìn)制調(diào)整:DAA、DAS、AAA、AAS、AAM、AAD1、加法指令加法:ADDDST,SRC; (DST)←(SRC)+(DST)帶進(jìn)位加法:ADCDST,SRC;

(DST)←(SRC)+(DST)+CF加1:INCDST;(DST)←(DST)+1說明:①這在三條指令運(yùn)算結(jié)果將影響狀態(tài)標(biāo)志位,但是INC指令不影響標(biāo)志CF(Carryflag進(jìn)位標(biāo)志)。②SRC可為IMM、MEM、REG,而DST只能為REG、MEM類型。③加法指令也有數(shù)據(jù)傳送的功能,所以前面數(shù)據(jù)傳送指令的限制同樣有效。如不能同時(shí)為存儲(chǔ)器操作數(shù)④對(duì)INC指令,DST既是源操作數(shù),又是目的操作數(shù),因此DST只能是REG或MEM,為MEM操作數(shù)時(shí),必須指明數(shù)據(jù)類型,否則出錯(cuò)。

如:INC[SI];錯(cuò)誤應(yīng)為:INCWORDPTR[SI];字內(nèi)容加1INCBYTEPTR[SI];字節(jié)內(nèi)容加1

例:ADDAL,18H;//AL←AL+18HADCBL,AL;//AL←AL+BL+CFADCAX,DX;//AX←AX+DX+CFADDAL,CONST[BX];//AL←MEM(DS:CONST[BS])+ALADDCONST[BX],AL;//MEM(DS:CONST[BS])←MEM(DS:CONST[BS])+AL2、減法指令指令格式:減法SUBDST,SRC;(DST)←(DST)-(SRC)帶借位減法SBBDST,SRC;(DST)←(DST)-(SRC)-CF減1DECOPR;(OPR)←(OPR)-1取負(fù)NEGOPR;(OPR)←

0H-(OPR)比較CMPOPR1,OPR2;(OPR1)-(OPR2),結(jié)果反映到標(biāo)志位上(ZF)

以上五條指令均可作字或字節(jié)運(yùn)算,而且除DEC不影響CF外,其他都按一般規(guī)則影響狀態(tài)標(biāo)志位。說明:減法指令的語法規(guī)范同加法指令一致比較指令除了不回送結(jié)果外,其他一切均同SUB指令,該指令主要用來判斷兩數(shù)的大小與是否相等。比較指令后面常常是條件轉(zhuǎn)移指令,根據(jù)比較的結(jié)果實(shí)現(xiàn)程序的轉(zhuǎn)移。SBB指令常用在多字節(jié)的減法運(yùn)算。

例:AX=98H,BX=0AH,DX=2000H,下面執(zhí)行執(zhí)行的結(jié)果是什么?SUBAX,BXSUBDX,1850H解:AX=98H-0AH=8EHDX=2000H-1850H=07B0H3、乘法指令指令格式:無符號(hào)數(shù)乘法MULSRC

;(AX)←(AL)*(SRC)字節(jié)乘法(DX,AX)←(AX)*(SRC)字乘法帶符號(hào)數(shù)乘法IMULSRC;操作同上進(jìn)行字節(jié)運(yùn)算時(shí),目的操作數(shù)必須是累加器AL,乘積在寄存器AX中;進(jìn)行字運(yùn)算時(shí),目的操作數(shù)必須是累加器AX,乘積在寄存器DX,AX中。源操作數(shù)不允許使用立即數(shù)。對(duì)于存儲(chǔ)器數(shù),必須在前面加B或者W指出是字節(jié)和是字。乘法指令運(yùn)算結(jié)果只影響狀態(tài)標(biāo)志CF、OF例:編程求Y=5*X,假定X為字節(jié)數(shù)。

MOVAL,XMOVBL,5MULBL思考:MovAL,X MUL5這樣可行嗎?解:不可行,因?yàn)镸UL指令中,要求源操作數(shù)必須是寄存器或者是存儲(chǔ)器操作數(shù)。

4、除法指令指令格式:無符號(hào)數(shù)除法DIVSRC;如果SRC為字節(jié)(AL)←(AX)/(SRC)除法的商(AH)←(AX)/(SRC)除法余數(shù)如果SRC為字(AX)←(DX,AX)/(SRC)除法的商(DX)←(DX,AX)/(SRC)除法余數(shù)帶符號(hào)數(shù)除法IDIVSRC;操作同上。除法運(yùn)算的說明當(dāng)除數(shù)是字節(jié)數(shù)據(jù)時(shí),被除數(shù)必須放在AX中;當(dāng)除數(shù)是字?jǐn)?shù)據(jù)時(shí),被除數(shù)必須放在DX,AX中。如果被除數(shù)是8位,必須放在AL中,并且AH清零除法指令運(yùn)算結(jié)果對(duì)狀態(tài)標(biāo)志無定義。8086/8088規(guī)定IDIV指令運(yùn)算結(jié)果余數(shù)的符號(hào)與被除數(shù)相同。例:求7A86H÷04H=?MOVAX,7A86HMOVBL,04HDIVBL

關(guān)于符號(hào)擴(kuò)展指令:字節(jié)擴(kuò)展到字CBW;將寄存器AL中的符號(hào)位擴(kuò)展到寄存器AH字?jǐn)U展到雙字CWD;將寄存器AX中的符號(hào)位擴(kuò)展到寄存器DX指令功能:

①如果(AL)<80H,則(AH)=00H(正數(shù))否則(AH)=0FFH(負(fù)數(shù))②如果(AX)<8000H,則DX=0000H(正數(shù))否則(DX)=0FFFFH(負(fù)數(shù))70AL70AH015AXDX150CBWCWD例:求-4001H÷4=?MOVAX,-4001HCWDMOVCX,4IDIVCX說明:此題不能用16位除8位的方式,因?yàn)槠渖坛^了256。

5、非壓縮BCD碼十進(jìn)制調(diào)整指令指令格式:加法十進(jìn)制調(diào)整AAA;減法十進(jìn)制調(diào)整AAS;乘法十進(jìn)制調(diào)整AAM;除法十進(jìn)制調(diào)整AAD;AAA指令將AL的內(nèi)容變換成一位非壓縮的十進(jìn)制數(shù)。AAA檢查AL低四位,如低四位是0--9的數(shù)字,AAA就清除AL的高四位,以及AF和CF標(biāo)志;如AL低四位表示的數(shù)大于9或AF=1,AAA執(zhí)行:加6到AL寄存器;加1到AH寄存器;置AF=1,CF=1;清除AL高四位為0例:求BCD7+BCD8=?MOVAL,07H;AL=00000111MOVBL,08H;BL=00001000ADDAL,BL;AL=00001111(低四位超過了9,因此要調(diào)整)AAA;結(jié)果AL=05H,AH=01H,CF=AF=1。其他調(diào)整指令不作介紹調(diào)整過程AL=00001111判斷:1111>1001加6:AL=AL+6=00010101清AL高四位:AL^00001111=0000101AF置1,CF置1,并且使得AH=1最后的結(jié)果為15H,即為000101016、壓縮BCD碼十進(jìn)制調(diào)整指令6.1加法十進(jìn)制調(diào)整DAA;執(zhí)行的操作:這條指令執(zhí)行前必須先執(zhí)行ADD或ADC指令,加法指令必須把兩個(gè)壓縮的BCD碼相加,并把結(jié)果存放在AL寄存器中,才能進(jìn)行調(diào)整。功能:把兩個(gè)壓縮BCD數(shù)相加后的結(jié)果調(diào)整為正確的BCD碼6.2減法十進(jìn)制調(diào)整DAS;執(zhí)行的操作:這條指令執(zhí)行之前,必須先執(zhí)行SUB或SBB指令,減法指令必須把兩個(gè)BCD碼相減,并把結(jié)果存放在AL寄存器中。調(diào)整的方法:累加器AL低4位大于9或輔助進(jìn)位標(biāo)志位AF=1,則累加器AL加06H修正。累加器AL高4位大于9或輔助進(jìn)位標(biāo)志位AF=1,則累加器AL加60H修正。累加器AL高4位大于等于9,低4位大于9,則累加器AL進(jìn)行加66H修正。例:進(jìn)行BCD碼加法運(yùn)算59+68=1270101100159+011010006811000001C1+0110011066

100100111127加法運(yùn)算結(jié)果為C1,AF=1,高位大于9加66H進(jìn)行壓縮BCD調(diào)整說明:壓縮BCD碼加法或減法十進(jìn)制調(diào)整指令必須在ADD(ADC)或SUB(SBB)指令之后,調(diào)整結(jié)果對(duì)標(biāo)志OF無影響,對(duì)其它狀態(tài)標(biāo)志位均有影響。減法十進(jìn)制調(diào)整方法與加法十進(jìn)制調(diào)整方法類同,只是將加6變?yōu)闇p6操作。上述加法及調(diào)整的指令如下:

MOVAL,59HADDAL,68HDAA練習(xí):求83-38=?(用BCD碼實(shí)現(xiàn))三、邏輯運(yùn)算與移位指令1、邏輯運(yùn)算指令:對(duì)字節(jié)或字?jǐn)?shù)據(jù)進(jìn)行按位的操作。格式:邏輯與ANDDST,SRC;

(DST)←(DST)AND(SRC)邏輯或ORDST,SRC;

(DST)←(DST)OR(SRC)邏輯非NOTOPR;

(OPR)←(OPR)異或XORDST,SRC;

(DST)←(DST)XOR(SRC)測(cè)試TESTOPR1,OPR2;(OPR1)AND(OPR2)AND、OR、XOR、TEST都是按位進(jìn)行運(yùn)算的NOT也是按位取反,但是不影響標(biāo)志位。AND指令主要用于使操作數(shù)的某些位保留(和1相與)、某些位清0(和0相與)。 例:ANDAL,0FH;屏蔽高4位,保留低4位。OR用法:

a用于使操作數(shù)的某些位保留(和0相或),使某些位置1(和1相或)。

b用于分離符號(hào)標(biāo)志,進(jìn)行判斷、轉(zhuǎn)移。影響ZF、SF和PF,CF=OF=0。例:ORBX,0C000H(1100000000000000)將BX的兩位最高的有效位(15和14位)置成1,而其它位不變。XOR用法:用于使操作數(shù)的某些位保留(與0異或),某些位取反(和1異或)。例:將AL的高4位保留,低4位取反:

XORAL,0FH(00001111)例:將AX中的內(nèi)容清0:

XORAX,AX(bxorb=0)NOT指令改變寄存器或存儲(chǔ)單元的每一位狀態(tài),原來為0變?yōu)?,原為1變?yōu)?。例:MOVAX,45H;NOTAX;AX=0BAHTEST指令是一條測(cè)試指令,它執(zhí)行的操作與AND相同,不過它不送回結(jié)果,只影響標(biāo)志位。例:TESTAL,00000001B;如AL最低位為0,則ZF=1。例:測(cè)試AL的0、3、5位,若有一位為1,則轉(zhuǎn)出錯(cuò)處理。

TESTAL,00101001BJNZERROR;ZF=0,轉(zhuǎn)出錯(cuò)ERROR。2、移位指令邏輯左移SHLOPR,CNL算術(shù)左移SALOPR,CNL邏輯右移SHROPR,CNL算術(shù)右移SAROPR,CNL其中:OPR為操作數(shù),CNL為1或CL表示移位次數(shù)0CFOPR0CFOPRCFOPR例:設(shè)AL=10110100,CF=1在SHLAL,1之后,AL=01101000CF=1在SALAL,1之后,AL=01101000CF=1在SHRAL,1之后,AL=01011010CF=0在SARAL,1之后,AL=11011010CF=0

算術(shù)左移(SAL)和算術(shù)右移(SAR)實(shí)現(xiàn)帶符號(hào)數(shù)移位。SAR通過在整個(gè)移位過程中復(fù)制符號(hào)來保護(hù)操作數(shù)的符號(hào)。SAL不保護(hù)進(jìn)位,但如果符號(hào)位發(fā)生變化的話,就將1送OF標(biāo)志。在多次移位的情況下,OF的值不確定。邏輯左移(SHL)和邏輯右移(SHR)對(duì)無符號(hào)數(shù)的移位。SHL將操作數(shù)左移,空出來的第0位置0;SHR將操作數(shù)右移,空出來的高位(字節(jié)時(shí)第7位,字時(shí)第15位)置0。例:用左移的方法實(shí)現(xiàn)Y=5*XMOVAL,XMOVCL,2SHLAL,CL;AL=4XADDAL,X例:用右移方法作除法-128/8=-16MOVAL,-128MOVCL,03HSARAL,CL執(zhí)行后,AL=0F0H=-163、循環(huán)移位指令循環(huán)左移ROLOPR,CNT循環(huán)右移ROROPR,CNT帶進(jìn)位循環(huán)左移RCLOPR,CNT帶進(jìn)位循環(huán)右移RCROPR,CNTOPR操作數(shù),CNT移動(dòng)的位數(shù)CFOPRCFOPRCFOPRCFOPR例:設(shè)AL=10110100B,CF=1執(zhí)行下列語句:執(zhí)行ROLAL,1后,AL=01101001,CF=1執(zhí)行RORAL,1后,AL=01011010,CF=0執(zhí)行RCLAL,1后,AL=01101001,CF=1執(zhí)行RCRAL,1后,AL=11011010,CF=0課堂練習(xí):將AL寄存器的高4位與低4位交換解:可采用循環(huán)左移4位或者循環(huán)右移4位ROLAL,04HRORAL,04H思考:可不可以用帶進(jìn)位的循環(huán)移位?四、串操作指令串操作:對(duì)存儲(chǔ)區(qū)中連續(xù)存放的字節(jié)或一串字進(jìn)行操作。串操作指令的對(duì)象是內(nèi)存中地址連續(xù)的字節(jié)或字串,在每次操作執(zhí)行后,能自動(dòng)修改地址,為下次操作作準(zhǔn)備。如用重復(fù)前綴,則可一直執(zhí)行直到預(yù)定的次數(shù)。串操作指令共有5條:MOVS:字符串的傳送Mov目的串,源串LODS:數(shù)據(jù)串裝入LODS源串STOS:數(shù)據(jù)串的存儲(chǔ)STOS目的串CMPS:字符串的比較COPS目的串,源串SCAS:字符串的掃描SCAS目的串不做詳細(xì)介紹(1)特點(diǎn):①源操作數(shù)由SI間址,在當(dāng)前數(shù)據(jù)段DS中;目的操作數(shù)由DI間址,在附加數(shù)據(jù)段ES中,且不允許段超越。②每次操作后,SI、DI的內(nèi)容自動(dòng)修改。方向標(biāo)志位DF=0:SI、DI自動(dòng)加1(或2);DF=1:SI、DI自動(dòng)減1(或2)。③要處理的串長(zhǎng)度存放在CX寄存器中,有的操作可使用重復(fù)前綴。而有的操作則不能使用(如LODS)。(2)重復(fù)的方式:

REP無條件重復(fù)

REPE/REPZ 相等/結(jié)果為0則重復(fù)

REPNE/REPNZ不相等/結(jié)果不為0則重復(fù)與REP前綴相配合工作的指令MOVS、LODS和STOS指令,直到(CX)=0為止。執(zhí)行過程:①如(CX)=0則退出REP,否則繼續(xù)執(zhí)行;②(CX)←(CX)-1;③執(zhí)行其后的串指令;④重復(fù)①~③。1、MOVS(串傳送)指令格式:[REP]MOVSB/MOVSW指令功能:DS:[SI]→ES:[DI]例;將數(shù)據(jù)段首地址為BUF1的200個(gè)字節(jié)傳送到附加段首址為BUF2的內(nèi)存區(qū)中,使用如下指令:

MOVAX,SEGBUF1MOVDS,AXMOVBX,SEGBUF2MOVES,BXLEASI,BUF1LEADI,BUF2MOVCX,200CLDLOP:MOVSBREPMOVSBLOOPLOPHLT若不用串操作指令,可用一般指令編制如下:

LEASI,BUF1LEADI,BUF2MOVCX,200LOP:MOVAL,[SI]MOV[DI],ALINCSIINCDIDECCXJNZLOPHLT由此可看出,串操作指令是程序設(shè)計(jì)的高級(jí)技術(shù)。2、LODS(串裝入)指令格式:LODSB/LODSW指令功能:將DS:[SI]所指單元的內(nèi)容裝入AL或AX中。一般不用REP。無意義。3、STOS(串送存)指令格式:[REP]STOSB/STOSW指令功能:將AL或AX中的內(nèi)容送入ES:[DI]所指單元中。如用REP,則表示每個(gè)單元的內(nèi)容完全相同。例:將內(nèi)存中以BUF為首址的100個(gè)字節(jié)單元的內(nèi)容清0MOVAX,SEGBUFMOVES,AXLEADI,BUFXORAX,AXMOV

溫馨提示

  • 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. 人人文庫(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)論