CPU及匯編第二章尋址方式_第1頁
CPU及匯編第二章尋址方式_第2頁
CPU及匯編第二章尋址方式_第3頁
CPU及匯編第二章尋址方式_第4頁
CPU及匯編第二章尋址方式_第5頁
已閱讀5頁,還剩112頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第二章第二章 Intel 8086/8088 CPUIntel 8086/8088 CPU的尋址方式和指令系統(tǒng)的尋址方式和指令系統(tǒng)2.1 計算機組織結(jié)構(gòu)運算器控制器存儲器輸入設(shè)備輸出設(shè)備計算機系統(tǒng)計算機系統(tǒng)硬件:硬件:中央處理機中央處理機 CPU總線控制 邏輯接 口接 口存儲器存儲器大容量存儲器I/O設(shè)備I/O子系統(tǒng)子系統(tǒng)系統(tǒng)總線系統(tǒng)總線.軟件:軟件:系統(tǒng)軟件 用戶軟件MainmemoryI/O bridgeBus interfaceALURegister fileCPUSystem busMemory busDisk controllerGraphicsadapterUSBcontrolle

2、rMouse KeyboardDisplayDiskI/O busExpansion slots forother devices suchas network adaptersPChardwareMainmemoryI/O bridgeBus interfaceALURegister fileCPUSystem busMemory busDisk controllerGraphicsadapterUSBcontrollerMouse KeyboardDisplayDiskI/O busExpansion slots forother devices suchas network adapte

3、rshello executable stored on diskPChello codehello.c匯編匯編語言語言MainmemoryI/O bridgeBus interfaceALURegister fileCPUSystem busMemory busDisk controllerGraphicsadapterUSBcontrollerMouse KeyboardDisplayDiskI/O busExpansion slots forother devices suchas network adaptershello executable stored on diskPChell

4、o codehello,worldnhello,worldn微型計算機的工作過程 微型計算機的工作過程就是執(zhí)行程序的過程,而程序由指令序列組成,因此,執(zhí)行程序的過程,就是執(zhí)行指令序列的過程,即逐條地從存儲器中取出指令并完成指令所指定的操作。 由于執(zhí)行每一條指令,都包括取指、譯碼和執(zhí)行三個基本步驟,所以,微型計算機的工作過程,也就是不斷地取指令、譯碼和執(zhí)行的過程,直到遇到停機指令時才結(jié)束機器的運行。取指令,P C值加1停機?譯碼并執(zhí)行結(jié)束YN優(yōu)點:處理器簡單通用,把復(fù)雜問題轉(zhuǎn)移到存放解釋程序存儲器中,即把復(fù)雜的硬件設(shè)計轉(zhuǎn)化為復(fù)雜的軟件設(shè)計。8086微處理器 8086/8088 CPU內(nèi)部的寄存器

5、組內(nèi)部的寄存器組寄存器是CPU內(nèi)部存放操作數(shù)的地方,它的操作速度比內(nèi)存操作數(shù)速度快。8086共有14個寄存器,它們都是16位的,可以存放16位二進制數(shù)。通用寄存器:4個數(shù)據(jù)寄存器:AX、BX、CX和DX 每個寄存器又可分為2個8位寄存器:AH、AL、BH、BL、CH、CL、DH、DL2個變址寄存器:DI和SI2個指針寄存器:SP和BP段寄存器4個段寄存器:ES、CS、SS和DS控制寄存器1個標(biāo)志寄存器:FLAG( CF、AF、PF、ZF、OF、SF、IF、DF、TF)1個指令指針寄存器:IP通用寄存器的作用 (1) 數(shù)據(jù)寄存器數(shù)據(jù)寄存器 數(shù)據(jù)寄存器主要用來保存操作數(shù)和運算結(jié)果等信息,從而節(jié)省讀

6、取操作數(shù)所需占用總線和訪問存儲器的時間。 4個16位寄存器: AX:Accumulator,累加器累加器 BX:Base Register, 基址寄存器基址寄存器 CX:Count Register,計數(shù)寄存器計數(shù)寄存器 DX:Data Register,數(shù)據(jù)寄存器數(shù)據(jù)寄存器 上述4個寄存器可分為8個8位寄存器,分別為AH和AL、BH和BL、CH和CL、DH和DL。 每個寄存器都有自己的名稱,可獨立存取。程序員可利用數(shù)據(jù)寄存器“能分可合”的特性,靈活地處理雙字、字和字節(jié)等信息。 在32位處理器中,有4個32位寄存器:EAX、EBX、ECX和EDX。通用寄存器 AX(accumulator):作

7、為累加器,是算術(shù)運算的主要寄存器。所有I/O指令都使用它和外部設(shè)備傳送信息。 BX(base):除了作為一般的數(shù)據(jù)寄存器使用外,經(jīng)常用做基址寄存器。 CX(count):除了作為一般的數(shù)據(jù)寄存器使用外,常用來保存計數(shù)值,如在移位指令、循環(huán)指令和串處理指令中用作隱含的計數(shù)器。 DX(data):除了作為一般的數(shù)據(jù)寄存器使用外,可以在處理雙字長運算時把DX和AX組合使用,DX存放高位字。通用寄存器 SP(stack pointer):除了作為一般的數(shù)據(jù)寄存器使用外,用來指示棧頂?shù)钠频刂罚?BP(base pointer):除了作為一般的數(shù)據(jù)寄存器使用外,可以和堆棧段寄存器SS聯(lián)合使用來指示堆棧段

8、中的存儲單元地址; SI(source index)和DI(destination index):除了作為一般的數(shù)據(jù)寄存器使用外,可以和數(shù)據(jù)段寄存器DS聯(lián)合使用來確定數(shù)據(jù)段中存儲單元的地址 注意:這四個寄存器只能以16位為單位一起使用標(biāo)志寄存器(程序狀態(tài)字寄存器 PSW) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0狀態(tài)標(biāo)志: 控制標(biāo)志:OF 溢出標(biāo)志 DF 方向標(biāo)志 SF 符號標(biāo)志 IF 中斷標(biāo)志ZF 零標(biāo)志 TF 陷阱標(biāo)志CF 進位標(biāo)志AF 輔助進位標(biāo)志PF 奇偶標(biāo)志OF DF IF TF SF ZF AF PF CF例:例: MOV AX, 1 MOV BX

9、, 2 ADD AX, BX 指令執(zhí)行后,(AX)=3, OF=0, CF=0, ZF=0, SF=0例:例: MOV AX, FFFFH MOV BX, 1 ADD AX, BX 指令執(zhí)行后,(AX)=0, OF=0, CF=1, ZF=1, SF=0Debug下的內(nèi)存和寄存器下的內(nèi)存和寄存器(1)PSPPSPDSDSESESSSSSCSCSEXE 程序的內(nèi)存映象圖裝入模塊文件頭Debug下的內(nèi)存和寄存器下的內(nèi)存和寄存器(2) 一個16位寄存器可以存儲一個16位的數(shù)據(jù)。(數(shù)據(jù)的存放情況) 一個16位寄存器所能存儲的數(shù)據(jù)的最大值為多少? 答案:216-1。通用寄存器16位數(shù)據(jù)在寄存器中的存放情

10、況 數(shù)據(jù):18 二進制表示:10010 在寄存器AX中的存儲:16位數(shù)據(jù)在寄存器中的存放情況 數(shù)據(jù):20000 二進制表示:0100111000100000 在寄存器AX中的存儲:通用寄存器 以AX為例,8086CPU的16位寄存器分為兩個8位寄存器的情況:通用寄存器通用寄存器的作用 (2)變址寄存器)變址寄存器(Index Register) SI:Source Index Register,源變址寄存器,源變址寄存器 DI:Destination Index Register,目標(biāo)變址寄存器,目標(biāo)變址寄存器 它們可作一般的存儲器指針使用。在字符串操作指令的執(zhí)行過程中,對它們有特定的要求,且

11、具有特殊的功能。(3) 指針寄存器指針寄存器(Pointer Register) 它們主要用于訪問堆棧內(nèi)的存儲單元,并且規(guī)定: BP:基指針(Base Pointer)寄存器,用它可直接存取堆棧中的數(shù)據(jù) SP:堆棧指針(Stack Pointer)寄存器,用它只可訪問棧頂通用寄存器的作用寄寄 存存 器器用用 途途AX乘法指令作累加器,I/O指令作數(shù)據(jù)寄存器由累加器做立即數(shù)運算,比其他指令少占字節(jié)ALBCD碼,ASCII碼運算的累加器,查表指令XLAT的累加器字節(jié)乘法,字節(jié)除法,字節(jié)I/O,十進制算術(shù)運算AH作為取指令標(biāo)志LAHF的目的寄存器,字節(jié)乘法,字節(jié)除法BX間接尋址作基址寄存器,XLAT

12、指令中作基址寄存器CX串操作或循環(huán)控制中的計數(shù)器,指令執(zhí)行后內(nèi)容會自動變化CL移位,循環(huán)計數(shù),指令執(zhí)行后內(nèi)容不變DX字乘法,字除法,I/O指令中作端口間接尋址SI存儲器指針(串操作中的源指針)DI存儲器指針(串操作中的目的指針)BP存儲器指針(存取堆棧的指針)SP堆棧指針通用寄存器的隱含使用及特殊用途通用寄存器的隱含使用及特殊用途 幾條匯編指令匯編指令不區(qū)分大小寫幾條匯編指令 CPU執(zhí)行下表中的程序段的每條指令后,對寄存器中的數(shù)據(jù)進行的改變。幾條匯編指令寄存器與存儲器的比較:寄存器與存儲器的比較: 寄 存 器 存 儲 器 在CPU內(nèi)部 在CPU外部訪問速度快 訪問速度慢容量小,成本高 容量大,

13、成本低用名字表示 用地址表示RegistersOn-chip L1cache (SRAM)Main memory(DRAM)Local secondary storage(local disks)Larger, slower, and cheaper (per byte)storagedevicesRemote secondary storage(distributed file systems, Web servers)Local disks hold files retrieved from disks on remote network servers.Main memory holds

14、 disk blocks retrieved from local disks.Off-chip L2cache (SRAM)L1 cache holds cache lines retrieved from the L2 cache.CPU registers hold words retrieved from cache memory.L2 cache holds cache lines retrieved from memory.L0:L1:L2:L3:L4:L5:Smaller,faster,and costlier(per byte)storage devices8086在取指令和尋

15、找內(nèi)存操作數(shù)的地址時,采用了分段尋找的方式,在同一時刻可將內(nèi)存分成4個段:代碼段、數(shù)據(jù)段、堆棧段和特別數(shù)據(jù)段,段與段之間允許有重疊。4個段寄存器是: CS (Code Segment Register,代碼分段寄存器) DS (Data Segment Register,數(shù)據(jù)分段寄存器) SS (Stack Segment Register,堆棧分段寄存器) ES (Extra Segment Register,特別分段寄存器)。 這4個寄存器都只能夠作為16位寄存器使用。 8086內(nèi)部有20根地址線,它可以直接訪問的物理空間為1M字節(jié),其編碼區(qū)間為:00000H0FFFFFH。而CPU內(nèi)部存

16、放存儲單元偏移量的寄存器(如IP、SP、BP、SI、DI和BX等)都是16位,它們的編碼范圍僅為:00000H0FFFFH。 如何用16位寄存器有效地訪問1MB的存儲空間,8086采用了內(nèi)存分段的管理模式,并引入存儲器分段的概念。段寄存器的作用8086內(nèi)存分段管理模式(1)存儲器的分段)存儲器的分段 計算機的內(nèi)存單元是以“字節(jié)”為最小單位進行線性編址的。為了標(biāo)識每個存儲單元,就給每個存儲單元規(guī)定一個編號,此編號就是該存儲單元的物理地址。 16位微機把內(nèi)存空間劃分成若干個邏輯段,每個邏輯段的要求如下: 邏輯段的起始地址(通常簡稱為:段地址)必須是16的倍數(shù),即最低4位二進制必須全為0; 邏輯段的

17、最大容量為64K,這由16位寄存器的尋址空間所決定。 按上述規(guī)定,1M內(nèi)存最多可分成64K個段,即65536個段(段之間相互重疊),至少可分成16個相互不重疊的段。(2)物理地址的形成方式)物理地址的形成方式 存儲單元的邏輯地址分為兩部分:段地址和偏移量。由邏輯地址得到其物理地址(PAPhysical Address)的計算方法如下:物理地址物理地址PA段地址段地址16 + 偏移量偏移量 邏輯地址到物理地址的生成加法器 邏輯 地址191500 偏移地址 段 地 址 0 0 0 0 20 - bit 物理存儲器地址 150物理地址:每個存儲單元唯一的 20 位地址 段地址:段起始地址的高 16

18、位 偏移地址:段內(nèi)相對于段起始地址的偏移值(16 位) (有效地址 EA)8086內(nèi)存分段管理模式(3)段寄存器的引用)段寄存器的引用 段寄存器是因為對內(nèi)存的分段管理而設(shè)置的。一般情況下,段寄存器及其指針寄存器的引用關(guān)系方面有如下規(guī)定:取指令所用的段寄存器和偏移量一定是用CS和IP;堆棧操作所用的段寄存器和偏移量一定是SS和SP;串操作的目標(biāo)操作數(shù)所用的段寄存器和偏移量一定是ES和DI;其它情況,段寄存器除其默認段寄存器外,還可以強行改變?yōu)槠渌渭拇嫫?。訪問存儲器方式缺省的段寄存器可選用的段寄存器偏 移 量取指令CSIP堆棧操作SSSP一般取操作數(shù)DSCS、ES、SS有效地址串操作源操作數(shù)DS

19、SI目標(biāo)操作數(shù)ESDI使用指針寄存器BPSSCS、DS、ES有效地址CS和IP CS和IP是8086CPU中最關(guān)鍵的寄存器,它們指示了CPU當(dāng)前要讀取指令的地址。 CS為代碼段寄存器; IP為指令指針寄存器。8086PC工作過程的簡要描述 (1)從CS:IP指向內(nèi)存單元讀取指令,讀取的指令進入指令緩沖器; (2)IP = IP + 所讀取指令的長度,從而指向下一條指令; (3)執(zhí)行指令。 轉(zhuǎn)到步驟 (1),重復(fù)這個過程。8086PC工作過程的簡要描述 在 8086CPU 加電啟動或復(fù)位后( 即 CPU剛開始工作時)CS和IP被設(shè)置為CS=FFFFH,IP=0000H,即在8086PC機剛啟動時

20、,CPU從內(nèi)存FFFF0H單元中讀取指令執(zhí)行,F(xiàn)FFF0H單元中的指令是8086PC機開機后執(zhí)行的第一條指令。CS和IP 內(nèi)存中指令和數(shù)據(jù)都是二進制信息,CPU在工作的時候把有的信息看作指令,有的信息看作數(shù)據(jù)。 CPU根據(jù)什么將內(nèi)存中的信息看作指令? CPU將CS:IP指向的內(nèi)存單元中的內(nèi)容看作指令。CS和IP 在任何時候,CPU將CS、IP中的內(nèi)容當(dāng)作指令的段地址和偏移地址,用它們合成指令的物理地址,到內(nèi)存中讀取指令碼,執(zhí)行。 如果說,內(nèi)存中的一段信息曾被CPU執(zhí)行過的話,那么,它所在的內(nèi)存單元必然被CS:IP指向過。修改CS、IP的指令 在CPU中,程序員能夠用指令讀寫的部件只有寄存器,程

21、序員可以通過改變寄存器中的內(nèi)容實現(xiàn)對CPU的控制。 CPU從何處執(zhí)行指令是由CS、IP中的內(nèi)容決定的,程序員可以通過改變CS、IP中的內(nèi)容來控制CPU執(zhí)行目標(biāo)指令。 我們?nèi)绾胃淖僀S、IP的值呢?修改CS、IP的指令 8086CPU必須提供相應(yīng)的指令 mov指令不能用于設(shè)置CS、IP的值, 8086CPU沒有提供這樣的功能。 8086CPU為CS、IP提供了另外的指令來改變它們的值:轉(zhuǎn)移指令修改CS、IP的指令 同時修改CS、IP的內(nèi)容:jmp 段地址:偏移地址jmp 2AE3:3jmp 3:0B16功能:用指令中給出的段地址修改CS,偏移地址修改IP。修改CS、IP的指令 僅修改IP的內(nèi)容:

22、jmp 某一合法寄存器jmp ax (類似于 mov IP,ax)jmp bx功能:用寄存器中的值修改IP。(4) 存儲單元的內(nèi)容存儲單元的內(nèi)容 存儲單元中所存放的二進制信息稱為該存儲單元的內(nèi)容或值,并且規(guī)定:一個字節(jié)的內(nèi)容是該字節(jié)單元內(nèi)存放的二進制信息;一個字的內(nèi)容是該字地址所指向的單元及其后繼一個單元的內(nèi)容拼接而成;一個雙字的內(nèi)容是該字地址所指向的單元及其后三個單元的內(nèi)容拼接而成。 在拼接“字內(nèi)容”時,我們按“高高低低”的原則來處理,即:高存儲單元(地址大的存儲單元)的值是“字內(nèi)容”的高8位,低存儲單元(地址小的存儲單元)的值是“字內(nèi)容”的低8位。 在拼接“雙字內(nèi)容”時也是如此。8086內(nèi)

23、存分段管理模式3. 存儲器存儲器存儲單元的存儲單元的地址地址和和內(nèi)容內(nèi)容: 存儲器以字節(jié)(8 bit)為單位存儲信息 每個字節(jié)單元有一個地址,從 0 編號,順序加 1 地址用二進制數(shù)表示(無符號整數(shù),寫成十六進制) 一個字要占用相繼的兩個字節(jié) 低位字節(jié)存入低地址,高位字節(jié)存入高地址 機器以偶地址訪問(讀 / 寫)存儲器 字單元地址用它的低地址來表示 1 0 0 1 1 1 1 1 1000H ( 1000H ) = 9F H0 0 1 0 0 1 1 0 1001H 0 0 0 1 1 1 1 0 1002H ( 1002H ) = 1E H1 1 0 1 0 1 1 1 1003H ( 10

24、00H ) = 269F H ( 1002H ) = D71E H ( 1001H ) = 1E26 H 訪問兩次存儲器( 1001H ) = 26 H( 1003H ) = D7 H存儲器存儲器的分段:存儲器的分段:20 根地址線: 地址范圍 00000H FFFFFH機器字長16位:僅能表示地址范圍 0000H FFFFH小段:每16個字節(jié)為一小段,共有64K個小段 小段的首地址小段的首地址 00000 H 0000F H 00010 H 0001F H 00020 H 0002F H FFFF0 H FFFFF H 段起始地址:小段首地址段的大?。?64K 范圍內(nèi)的任意字節(jié)存儲器的邏輯邏

25、輯分段: 存儲器存儲器64K代碼01500H42000H1CD00H0150H4200H1CD0H段寄存器段寄存器CSDSSSES64K堆棧64K數(shù)據(jù) 64K附加數(shù)據(jù)B0000HB000H 存儲器存儲器 8K代碼 2K數(shù)據(jù) 256堆棧02000H04800H04000H0200H0400H0480HCSDSSS例:(DS) = 0400H, EA = 1234H, 物理地址 = 16d (DS) + EA = 05234HCPU可以用不同的段地址和偏移地址形成同一個可以用不同的段地址和偏移地址形成同一個物理地址物理地址:物理地址物理地址 段地址段地址 偏移地址偏移地址05234H 0400H

26、1234H 0523H 0004H 0520H 0034H 8086/8088有兩個獨立的存儲空間和I/O地址空間,地址空間為1MB,I/O地址空間為64KB。 數(shù)據(jù)按字節(jié)、字或雙字存放,存放方式可按對正的雙字邊界或非對正的雙字為邊界。 邏輯地址(logical address) 物理地址(physical address)。 物理地址=段地址*16+偏移地址地址00001H00008H00007H00006H00005H00004H00003H00002HByte 8Byte 7Byte 6Byte 5Byte 4Byte 3Byte 2Byte 1Word 6Word 4Word 2Wor

27、d 0Byte 000000HWord 5Word 1物理存儲器 雙字對齊字對齊 Double word 0Double word 4圖3.2 對正的數(shù)據(jù)字和雙字Byte 8 圖(a)中數(shù)據(jù)5AF0H存放在對正的雙字地址02000H,其中0F0H存放在低字節(jié)地址02000H,5AH存放在高字節(jié)地址02001H。 圖(b)中數(shù)據(jù)2C96H,對正的雙字地址邊界是0200CH。 地址 存儲器(二進制) 存儲器(十六進制) 地址020011602000160101 10101111 0000 存儲器(二進制)0010 11001001 0110 0200E160200D16 5A F0 (b) (a)

28、 物理存儲器 圖3.4非對正的字或雙字為邊界的例子地址00001H00008H00007H00006H00005H00004H00003H00002HByte8Byte7Byte6Byte5Byte4Byte3Byte2Byte1Word 7Word 3Byte000000H字未對齊Double word 1Double word 2Double word 5 Double word 3雙字未對齊 (a)非對正的雙字邊界的雙字存儲(b)對正的雙字存儲 A01100 1101 AB 地址存儲器(二進制)存儲器(十六進制) 地址021051602104160000 00010010 0011存儲器

29、(十六進制)000210F160210E16 01 23 (b) (a)02103160210216021011602100161010 1011 CD 55 FF0210D160210C160210B160210A16 (a)其中0123H存放在02104H處,此地址是對正的雙字邊界地址,而ABCD存放的起始地址是02102H,而該字的對正的雙字邊界應(yīng)為02100H。完整的雙字是0123ABCDH。 邏輯地址與物理地址之間的關(guān)系: 段基址為002B0H, 偏移地址為0013H, 物理地址為002C3H。 段基址為002C0H,偏移地址為0003H, 物理地址為002C3H。 邏輯地址 2C4

30、H2C3H2C2H2C1H2C0H2BFH2BEH2BDH2BCH2BBH2BAH2B9H2B8H2B7H2B6H2B5H2B4H2B3H2B2H2B1H2B0H段基址 偏移(3H) 偏移(13H)段基址物理地址圖表示堆棧結(jié)構(gòu) 堆棧是一個特殊的隨機存儲區(qū),用于臨時存放一些信息如數(shù)據(jù)或地址。 對于實模式,堆棧區(qū)為64KB,按32K個字組織 . . . 堆棧段 . 存儲器 (字寬) 0000HSPSS FFFEH堆棧底部 堆棧頂部 圖PUSH AX指令執(zhí)行前的堆棧狀態(tài)堆棧 00 11 22 33 44 55 66 77 88 99AA BB 01 23 45 67 89 AB CD EF 01 0

31、5 00 08 1062 1060105E 105C 105A 1058 1056 1054 10521050SSSPTOS 堆棧底部 PUSH AX指令執(zhí)行后、 POP AX和和POP BX執(zhí)行后 堆棧狀況 12 34 00 11 22 33 44 55 66 77 88 99 AA BB 34 12 45 67 89 AB CD EF 0 1 05 00 06 1062 1060105E 105C 105A 1058 1056 1054 10521050SSSPPUSH AXAXTOS 00 11 22 33 44 55 66 77 88 99 AA BB 34 12 45 67 89 A

32、B CD EF 01 05 00 08 1062 1060105E 105C 105A 1058 1056 1054 10521050 12 34SSSPPOP AXTOP控制寄存器的作用(1)指令指針寄存器(Instruction Pointer) 指令指針I(yè)P是16位的寄存器,存放著下次將要執(zhí)行的指令在代碼段的偏移量。 在80386及其高檔處理器處于保護模式時,其指令指針寄存器是32位的EIP。(2)標(biāo)志寄存器(Flags Register) FLAG寄存器的各位用來存放各種不同的標(biāo)志。算術(shù)運算指令和邏輯運算指令的運行結(jié)果都將定性地反映在不同的標(biāo)志位上,以便后續(xù)的條件判斷指令根據(jù)這些標(biāo)志實

33、現(xiàn)判斷轉(zhuǎn)移,判斷轉(zhuǎn)移的實質(zhì)是修改CS和IP。這也正是計算機能夠?qū)崿F(xiàn)判斷轉(zhuǎn)移的底層原理。 6個狀態(tài)標(biāo)志:OF、SF、ZF、AF、PF、CF3個控制標(biāo)志:IF、DF、TF;7位保留;標(biāo)志寄存器 CF:進位標(biāo)志,在進行字/字節(jié)運算產(chǎn)生進位或借位時置1,否則置0。 PF:奇偶性標(biāo)志,結(jié)果有偶數(shù)位為1時置1,否則置0。 AF:輔助進位標(biāo)志,當(dāng)進行字節(jié)運算有低4位向高4位進位或借位時置1,否則置0。 在作BCD碼運算時常常使用。 ZF:零標(biāo)志,當(dāng)運算結(jié)果為0時置1,否則置0。 SF:符號標(biāo)志,運算結(jié)果為負,即結(jié)果最高位為1時置1,否則置0。 TF:陷阱標(biāo)志,若IF=1,則在執(zhí)行指令時產(chǎn)生單步中斷。 IF:

34、中斷標(biāo)志,若IF=1開中斷,響應(yīng)可屏蔽中斷;IF=0,關(guān)中斷。 DF:方向標(biāo)志,DF置1引起串操作指令的變址寄存器自動減值,DF置0引起串 操作指令的變址寄存器自動增值。 OF:溢出標(biāo)志,運算溢出時自動置1,當(dāng)它為1時可用溢出中斷指令產(chǎn)生中斷。機器語言(machine language) CPU執(zhí)行的程序都是用機器語言寫成的。機器代碼是二進制代碼,一條機器語言指令長度,可以是1個字節(jié)或多個字節(jié)。微處理器只能理解機器語言,但直接用機器語言寫程序幾乎是不可能的。因此程序常采用其它語言來編寫。匯編語言(Assembler)2.2尋址方式程序(program) 源代碼 (source code) 目標(biāo)

35、代碼 (object code)編譯(assember)連接(link)指令 (instruction)指令系統(tǒng)(指令集) 操作碼 (opcode)操作數(shù)(operand) 目標(biāo)操作數(shù)(destination operand) 源操作數(shù) (source operand) 指令格式 操作碼字段 操作數(shù)地址字段 地址結(jié)構(gòu) 二地址 單地址 隱含地址 基本指令長度 1-6字節(jié)。 尋址方式 形式地址 有效地址 EA 物理地址 PA利用匯編語言編寫程序具有以下優(yōu)點: (1)用匯編語言編寫的程序,程序的代碼短,程序占 用的內(nèi)存少,程序運行速度要比用高級語言寫的程序快; (2)匯編語言給予程序設(shè)計者更強的能力

36、,實現(xiàn)高技術(shù)任務(wù),而這些任務(wù)若用高級語言是難以實現(xiàn)或根本不能實現(xiàn); (3)匯編語言的知識,有助于理解微處理器的結(jié)構(gòu),這是高級語言所沒有的; (4)駐留程序和中斷服務(wù)程序總是用匯編語言開發(fā) 匯編語言語句的一般格式是: 標(biāo)號:指令 ;注釋例:START:MOV AX,BX ;COPY BX INTO AX START是該指令的地址標(biāo)識,叫做標(biāo)號(Label)。 在指令后面由分號(;)標(biāo)識的是注釋。 0013 8A 24 NEXT:MOV AH, SI ;MOVE A BYTE 其中8A 24是指令MOV AH,SI的機器碼,這是一條雙字節(jié)指令,該指令的存儲器地址是0013H和0014H。 匯編指令

37、的書寫形式匯編指令的書寫形式 一條匯編指令通??梢詫懗扇缦滦问剑?標(biāo)號標(biāo)號: 操作碼操作碼 目標(biāo)操作數(shù)目標(biāo)操作數(shù) , 源操作數(shù)源操作數(shù) ;注釋注釋 (1)其中 中的內(nèi)容為可選項。 (2)標(biāo)號必須是用字母打頭的字母或數(shù)字組成的字符串,標(biāo)號供轉(zhuǎn)移指令作為轉(zhuǎn)移的目標(biāo)。 (3)指令末尾的分號表示由 ;起直至ENTER前均為注釋部分,在輸入源程序時,每一條匯編指令的末尾必須輸入換行鍵ENTER表示本指令的結(jié)束,下一指令的開始。匯編指令的書寫形式操作碼操作碼 目標(biāo)操作數(shù)目標(biāo)操作數(shù), 源操作數(shù)源操作數(shù) 一條能匯編成機器代碼指令的匯編指令必須有唯一的操作碼。操作碼是匯編指令的關(guān)鍵字,它指出該指令要做什么。一條

38、匯編指令中的源操作數(shù)用來指出指令處理的對象來自何處。一條匯編指令中的目標(biāo)操作數(shù)用來指出指令的處理結(jié)果置于何處。在許多指令中目標(biāo)操作數(shù)既表示處理的對象之一來自何處,又指出處理的結(jié)果置于何處。目標(biāo)操作數(shù)總是緊接著操作碼出現(xiàn)在源操作數(shù)的左邊,因此有也稱目標(biāo)操作數(shù)為左源左源。匯編指令的書寫形式操作碼操作碼 目標(biāo)操作數(shù)目標(biāo)操作數(shù), 源操作數(shù)源操作數(shù) 指令行中可以沒有源操作數(shù)和目標(biāo)操作數(shù)。在這種情況下通常是對某一固定的或稱作隱含操作數(shù)的操作。指令行中可以沒有源操作數(shù)而僅含目標(biāo)操作數(shù)。這時目標(biāo)操作數(shù)既指出處理對象來自何處,又指出處理結(jié)果置于何處。這種指令被稱為單操作數(shù)指令。指令行中既有源操作數(shù)又有目標(biāo)操作數(shù)

39、的指令稱為雙操作數(shù)指令。雙操作數(shù)指令中目標(biāo)操作數(shù)一定出現(xiàn)在源操作數(shù)的左邊。 尋址方式尋址方式就是尋找指令中的操作數(shù)的方式,尋址主要是指尋找內(nèi)存數(shù)據(jù)的地址。幾個概念 尋址方式:根據(jù)指令中給出的地址尋找真實操作數(shù)地址的方式 形式地址:指令中的地址碼字段給出的地址 有效地址:能夠直接訪問的存儲器地址 物理地址:存儲器地址匯編指令的書寫形式舉例:舉例: LOOP1:AAA ; 此處可添加注釋 MOV AX, 053H;此處可添加注釋 INC DH ;此處可添加注釋第一條指令:帶標(biāo)號LOOP1,AAA是操作碼,這一指令隱含使用固定操作數(shù)AL;第二條指令: MOV是操作碼,雙操作數(shù)指令, AX是目標(biāo)操作數(shù)

40、,053H是源操作數(shù)第三條指令: INC是操作碼單操作數(shù)指令 在DOS下運行匯編程序,注釋部分只能用英文和ASCII碼符號書寫,在中文操作系統(tǒng)下則可用中文書寫,是指換行鍵。操作碼通常是指指令功能的助記符,它給出了指令功能便于記憶的形式,例如,MOV是Movement的縮寫等。三種類型的操作數(shù)(1)立即數(shù))立即數(shù)(2)寄存器)寄存器(3)內(nèi)存)內(nèi)存單操作數(shù)指令的操作數(shù)只能是寄存器操作數(shù)或內(nèi)存操作數(shù)。雙操作數(shù)指令的目標(biāo)操作數(shù)只能是寄存器操作數(shù)或內(nèi)存操作數(shù),而源操作數(shù)可以是三者之一,但是兩操作數(shù)不能同時為內(nèi)存操作數(shù)。 (1)立即數(shù)操作數(shù) 立即數(shù)操作數(shù)作為代碼指令的一部分出現(xiàn)在雙操作數(shù)指令中。除了乘法

41、、除法和字符串操作指令之外,立即數(shù)操作數(shù)均可作為源操作數(shù)。立即數(shù)操作數(shù)在匯編指令中可以以十六進、八進制、二進制十六進、八進制、二進制或十進制或十進制形式書寫,例如0F0H、777Q、101B、99D等,注意,在用十六進制書寫時第一個字符是非數(shù)字09時,前面一定要補一個0,例如,F(xiàn)AH應(yīng)記為0FAH。匯編指令中立即數(shù)操作數(shù)還可以以一個表達式的形式出現(xiàn),此時該立即數(shù)就是表達式的值。(2)寄存器操作數(shù) 寄存器操作數(shù)是以寄存器的內(nèi)容參加運算,或用寄存器存放結(jié)果。MOV AX, 3456H中的AX,MOV DL, 41H中的DL就是寄存器操作數(shù)。段寄存器的內(nèi)容指出當(dāng)前4個段的基址,這些寄存器不能用一般的

42、傳送指令將立即數(shù)送入。如果需要將立即數(shù)置入段寄存器中的DS、ES或SS,則首先應(yīng)將該值送入AX或其他通用寄存器,然后再由AX傳送給DS、ES或SS。至于CS因其與指令地址有關(guān),一般不需用戶干預(yù)。標(biāo)志寄存器FLAG的各位在執(zhí)行算術(shù)邏輯運算指令后一般均被修改,其狀態(tài)將依指令及執(zhí)行結(jié)果而定,它可以反映出當(dāng)時處理器和累加器所檢測到的結(jié)果。標(biāo)志寄存器一般不能作為操作數(shù),但可用標(biāo)志指令或INC、DEC、ADD、MUL、DIV等來處理。通用寄存器(AX、BX、CX、DX、SP、BP、SI、DI、AH、AL、BH、BL、CH、CL、DH、DL)和指針及變址寄存器(BX、BP、SI、DI)均可參加算術(shù)和邏輯運算

43、操作。雖然經(jīng)常把AX作為累加器,但所有通用寄存器均可用作累加器。通用寄存器在單操作數(shù)指令中可作目標(biāo)操作數(shù),在雙操作數(shù)指令中既可作源操作數(shù)也可作目標(biāo)操作數(shù)。(2)寄存器操作數(shù)一些匯編指令中雖然沒有顯式地寫有寄存器,但是它卻隱含著使用所指定的通用寄存器,詳見表。 指令指令隱含應(yīng)用隱含應(yīng)用AAA, AAD, AAM, AASAL, AHCBW, CWDAL, AH或AX, DXDAA, DASALIN, OUTAL或AXMUL, IMUL, DIV, IDIVAL, AX或AX, DXLAHF, SAHFAHLESESLDSDS循環(huán)或移位指令CL字符串操作指令CX, SI, DIXLATAL, BX

44、(3)內(nèi)存操作數(shù) 內(nèi)存操作數(shù)又稱為存儲器操作數(shù),是指把內(nèi)存某地址存放的字節(jié)、字作為指令的處理對象。這時要將該字節(jié)、字作為源操作數(shù)或目標(biāo)操作數(shù),當(dāng)其作為源操作數(shù)時從內(nèi)存中取出,或送到某個寄存器,或參加運算等;當(dāng)其作為目標(biāo)操作數(shù)時,則是將操作的結(jié)果置入該內(nèi)存單元。無論是何種內(nèi)存操作數(shù),關(guān)鍵是必須找到其所在地址,即必須指出其所在段和相對于段首的位移(即有效地址EA),才能確定其物理地址。內(nèi)存操作數(shù)地址的確定是尋址規(guī)則的重點。內(nèi)存操作數(shù)所在段的段寄存器的名字在匯編指令中一般是不寫的,它遵循著如前面的表所示的隱含原則,根據(jù)內(nèi)存操作數(shù)類型的不同相應(yīng)使用不同的段寄存器。 尋址方式與數(shù)據(jù)有關(guān)的尋址方式與數(shù)據(jù)有

45、關(guān)的尋址方式(1)隱含尋址方式(2)立即數(shù)尋址(Immediate Addressing) (3)寄存器尋址(Register Addressing)(4)直接尋址(Direct Addressing)(5)寄存器間接尋址(Register Index Addressing) (6)寄存器相對尋址(Register Relative Addressing) (7)基址加變址尋址 (Based Indexed Addressing) (8)相對基址變址尋址 (Based Indexed Addressing) 與轉(zhuǎn)移地址有關(guān)的尋址方式與轉(zhuǎn)移地址有關(guān)的尋址方式(1)段內(nèi)直接尋址(2)段內(nèi)間接尋址(

46、3)段間直接尋址(4)段間間接尋址I/O端口尋址端口尋址(I/O PORT Addressing) 1. 8086 的尋址方式的尋址方式 與與數(shù)據(jù)數(shù)據(jù)有關(guān)的尋址方式有關(guān)的尋址方式: 立即尋址 MOV AX , 3069H寄存器尋址 MOV AL , BH直接尋址 MOV AX , 2000H 寄存器間接尋址 MOV AX , BX 寄存器相對尋址 MOV AX , COUNT SI 基址變址尋址 MOV AX , BP DI 相對基址變址尋址 MOV AX , MASK BX SI 存儲器尋址存儲器尋址1隱含尋址方式隱含尋址方式2 立即尋址方式立即尋址方式 操作數(shù)直接存放在指令中,緊跟在操作碼

47、后,它作為指令的一部分存放在代碼中。操作數(shù)叫做立即數(shù)。立即數(shù)可以是8位、16位。例:MOV AL,15H機器碼如下:地址 存儲器內(nèi)容 指令01000H B0 15 MOV AL,15H01002H XX 下一條指令(1) 立即尋址方式立即尋址方式 * 操作數(shù)在指令中給出 MOV AL , 5 MOV AX , 3064H MOV AL , A* 只能用于 SRC 字段* SRC 和 DST 的字長一致 MOV AH , 3064H 3寄存器尋址方式寄存器尋址方式 指令的操作數(shù)存放在處理器的寄存器中,指令指明寄存器號,這些內(nèi)部寄存器包括段寄存器和通用寄存器,寄存器可以分 8位、16位。例:MOV

48、 AX,BX BX為源操作數(shù),AX是目的操作數(shù), 該指令是將BX中的內(nèi)容傳送至AX,即傳送后,BX的內(nèi)容保持不變。 地址 儲器內(nèi)容 指令 01000 8B C3 MOV AX,BX 01002 XX 下一條指令 (2) 寄存器尋址方式寄存器尋址方式 * 操作數(shù)在指定的寄存器中 MOV AX , BX MOV AL , BH MOV AX , 3064H* 字節(jié)寄存器只有 AH AL BH BL CH CL DH DL* SRC 和 DST 的字長一致 MOV AH , BX * CS 不能用 MOV 指令改變 MOV CS , AX 4存儲器尋址存儲器尋址 操作數(shù)存放在存儲器中。 CPU 首先

49、計算這個操作數(shù)的物理地址PA(physical address),然后讀或?qū)戇@個操作數(shù)。 PA= SBA:EA段基址*16+偏移量 SBA (segment base address)一個物理存儲器段的起始地址。 EA (effective address)為操作數(shù)相對該存儲器段開始的偏移量。 其有效地址計算的公式如下: EA=base+index +displacement Base為基址寄存器:BX、BP。 Index為變址寄存器:SI、DI , Displacement為位移量:16位或8位。 隱含段前綴:DS:BX、DS:SI、DS:DI、SS:BP 超越段前綴:可以利用其它的段寄存器

50、作為段基址,需要使用段超越,即將段寄存器用顯式方式“段寄存器”:放在間接尋址寄存器的左方括號前, 如:MOV AL,ES:SI變址器匯編書寫形式有效地址(EA)段寄存器物理地址SISI(SI)DS(DS)*10H+(SI)DIDI(DI)DS(DS)*10H+(DI)BXBX(BX)DS(DS)*10H+(BX)BPBP(BP)SS(SS)*10H+(BP)(1)、直接尋址方式)、直接尋址方式 指令中地址碼中給出的是有效地址,即形式地址就是有效地址。 PA=段基址:直接地址 段基址指:CS、 DS、 SS、 ES 例: MOV CX,DS:BETA 地址 存儲器內(nèi)容 指令 01000 8B0E

51、3412 MOV CX,DS:BETA 01004 XX 設(shè)(03234)=0EDH,(03235)=0BEH, (DS)=0200H,BETA=1234H,指令執(zhí)行后,將操作數(shù)0BEEDH傳至CX。(3) 直接尋址方式直接尋址方式 * 有效地址 EA 由指令直接給出 例:MOV AX , 2000H EA = 2000H , 假設(shè) (DS) = 3000H , 那么 PA = 32000H* 隱含的段為數(shù)據(jù)段隱含的段為數(shù)據(jù)段 DS* 可使用可使用段跨越前綴段跨越前綴 MOV AX , ES: 2000H * 操作數(shù)地址可由變量(符號地址)表示操作數(shù)地址可由變量(符號地址)表示VALUE DB

52、 10MOV AH , VALUE MOV AX , VALUE MOV AX , WORD PTR VALUE 50H30H32000AH AL3050(AX) = 3050HMOV AX, 2000H; 設(shè)(DS)=3000H執(zhí)行結(jié)果(AX)=3050H可以用符號地址代替數(shù)值地址,如:MOV AX, VALUE;或者MOV AX, VALUEVALUE為存放操作數(shù)單元的符號地址。DATA SEGMENT DB 41H ;偏移量0 DB 42H ;偏移量1DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS: DATAGO: MOV AX, DATA MOV D

53、S, AX MOV DL,DS:0; MOV AH, 2 INT 21H MOV DL,DS:1; INT 21H MOV AH, 4CH INT 21HCODE ENDS END GODATA SEGMENTA1 DB 41H ;變量A1,偏移量0B1 DB 42H ;變量B1,偏移量1DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS: DATAGO: MOV AX, DATA MOV DS, AX MOV DL,A1; MOV AH, 2 INT 21H MOV DL,B1; INT 21H MOV AH, 4CH INT 21HCODE ENDS END

54、 GO (2)、寄存器間接尋址方式寄存器間接尋址方式 操作數(shù)的有效地址存放在通用寄存器BX、BP、SI、DI中。 例:MOV AX,SI ;其隱含的段寄存器為DS, 設(shè)DS=0200H,SI=1234H,所讀取的操作數(shù)物理地址為03234H,讀取的操作數(shù)為0BEEDH,傳送至寄存器AX中。 地址 存儲器內(nèi)容 指令 01000 8B 04 MOV AX,SI 01002 XX 下一條指令 . . 03234 ED 源操作數(shù) 03235 BE(4) 寄存器間接尋址寄存器間接尋址 * EA 在基址寄存器 ( BX / BP ) 或變址寄存器 ( SI / DI ) 中 MOV AX , BX PA

55、= 16d ( DS ) + ( BX ) MOV AX , ES: BX PA = 16d ( ES ) + ( BX ) MOV AX , BP PA = 16d ( SS ) + ( BP )* 不允許使用AX、CX、DX 存放 EA MOV AX , CX * SRC 和 DST 的字長一致 MOV DL , BX ; BX 指示一個字節(jié)單元 MOV DX , BX ; BX 指示一個字單元* 適于數(shù)組、字符串、表格的處理舉例 假設(shè)有指令:MOV AX, BX; 在執(zhí)行時,(DS)=2000H,(BX)=1000H,執(zhí)行指令后AX50A0H. EA=1000H,物理地址為21000H這

56、種尋址方式可以用于表格處理,執(zhí)行完一條指令后,只需修改寄存器內(nèi)容就可取出表格中的下一項。(3)、基址(變址)尋址方式(寄存器相對尋址)操作數(shù)的有效地址是由基址(變址)寄存器中的內(nèi)容加上偏移量。偏移量是8位或16位的。 基址寄存器:BX、BP 變址寄存器:SI、DI 例: MOV BX+BETA,AL 其 中 B E TA 為 立 即 數(shù) , 操 作 數(shù) 的 有 效 地 址 是 EA=BX+BETA 該指令也可以寫成如下形式: MOV BETABX,AL 或 MOV BX+BETA,AL 有效地址 = ( BX ) ( BP ) 8 位 ( SI ) 16 位 ( DI )+ 位移量(5) 寄存

57、器相對尋址方式寄存器相對尋址方式 *例: MOV AX , COUNT SI 或 MOV AX , COUNT + SI 假設(shè) ( DS ) = 3000H, ( SI ) = 2000H, COUNT = 100H, 那么 PA = 32100H 假設(shè) ( 32100H ) = 1234H, 那么 ( AX ) = 1234H* 適于數(shù)組、字符串、表格的處理 若DS=0200H,BX=1000H,BETA=1234H,AL=0EDH,則指令執(zhí)行后,指令的機器碼及操作數(shù)按下述方式在存儲器中存儲: 地址 存儲器內(nèi)容 指令 01000 88873412 MOV BX+BETA,AL 01004 X

58、X 下一條指令 . . 04234 ED 04235 XX基址尋址常用于對一維數(shù)組的訪問,用基地址指向一維數(shù)組的第一個元素的地址指針,用偏移量指向數(shù)組中要訪問的元素。如圖:Element 0Element 2 . . . 數(shù)據(jù) 結(jié)構(gòu) . . .Element n 偏移量基址寄存器+存儲器Element n-1Element 1 一個數(shù)組元素的變址尋址 Element n-1Element n . . . 數(shù)組 . . .變址寄存器 偏移地址+存儲器Element 0Element 1Element 2例如: MOV AX,BPVARA MOV AX,VARABP MOV AX,BPVARA變址

59、器匯編書寫形式有效地址段寄存器物理地址SISI+disp(SI)+dispDS(DS)*10H+(SI)+dispDIDI+disp(DI)+dispDS(DS)*10H+(DI)+dispBXBX+disp(BX)+dispDS(DS)*10H+(BX)+dispBPBP+disp(BP)+dispSS(SS)*10H+(BP)+disp舉例:MOV AX, COUNTSI, 其中,COUNT為16位偏移量的符號地址。如果(DS)=3000H,(SI)=2000H,COUNT=3000H,則EA=2000H+3000H=5000H物理地址=30000H+5000H=35000H執(zhí)行結(jié)果(AX

60、)=1234H(4)、基址變址尋址方式 有效地址是基址寄存器與變址寄存器中數(shù)據(jù)之和。 這種尋址模式可以被用于訪問復(fù)雜的數(shù)據(jù)結(jié)構(gòu)如二維數(shù)組。 基址變址尋址的物理地址如下式所示: PA=段基址:基址+變址 其有效地址如下: BXSI或BXSI 表示:EA=(BX)(SI) BXDI或BXDI 表示:EA=(BX)(DI) BPSI或BPSI 表示:EA=(BP)(SI) BPDI或BXDI 表示:EA=(BP)(DI)(6) 基址變址尋址方式基址變址尋址方式 * MOV AX , BX DI 或 MOV AX , BX + DI MOV AX , ES: BX SI * 適于數(shù)組、字符串、表格的處

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論