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

下載本文檔

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

文檔簡介

第二章Intel8086/8088CPU的尋址方式和指令系統(tǒng)2.1計算機組織結(jié)構(gòu)運算器控制器存儲器輸入設(shè)備輸出設(shè)備計算機系統(tǒng)硬件:中央處理機

CPU總線控制邏輯接口接口存儲器大容量存儲器I/O設(shè)備I/O子系統(tǒng)系統(tǒng)總線......軟件:系統(tǒng)軟件用戶軟件MainmemoryI/ObridgeBusinterfaceALURegisterfileCPUSystembusMemorybusDiskcontrollerGraphicsadapterUSBcontrollerMouseKeyboardDisplayDiskI/ObusExpansionslotsforotherdevicessuchasnetworkadaptersPChardwareMainmemoryI/ObridgeBusinterfaceALURegisterfileCPUSystembusMemorybusDiskcontrollerGraphicsadapterUSBcontrollerMouseKeyboardDisplayDiskI/ObusExpansionslotsforotherdevicessuchasnetworkadaptershelloexecutablestoredondiskPChellocodehello.c匯編語言MainmemoryI/ObridgeBusinterfaceALURegisterfileCPUSystembusMemorybusDiskcontrollerGraphicsadapterUSBcontrollerMouseKeyboardDisplayDiskI/ObusExpansionslotsforotherdevicessuchasnetworkadaptershelloexecutablestoredondiskPChellocode"hello,world\n""hello,world\n"微型計算機的工作過程微型計算機的工作過程就是執(zhí)行程序的過程,而程序由指令序列組成,因此,執(zhí)行程序的過程,就是執(zhí)行指令序列的過程,即逐條地從存儲器中取出指令并完成指令所指定的操作。

由于執(zhí)行每一條指令,都包括取指、譯碼和執(zhí)行三個根本步驟,所以,微型計算機的工作過程,也就是不斷地取指令、譯碼和執(zhí)行的過程,直到遇到停機指令時才結(jié)束機器的運行。優(yōu)點:處理器簡單通用,把復雜問題轉(zhuǎn)移到存放解釋程序存儲器中,即把復雜的硬件設(shè)計轉(zhuǎn)化為復雜的軟件設(shè)計。8086微處理器8086/8088CPU內(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個標志存放器:FLAG(CF、AF、PF、ZF、OF、SF、IF、DF、TF)1個指令指針存放器:IP通用存放器的作用〔1〕數(shù)據(jù)存放器數(shù)據(jù)存放器主要用來保存操作數(shù)和運算結(jié)果等信息,從而節(jié)省讀取操作數(shù)所需占用總線和訪問存儲器的時間。4個16位存放器:AX:Accumulator,累加器BX:BaseRegister,基址存放器CX:CountRegister,計數(shù)存放器DX:DataRegister,數(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〕:作為累加器,是算術(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〔stackpointer〕:除了作為一般的數(shù)據(jù)存放器使用外,用來指示棧頂?shù)钠频刂?;BP〔basepointer〕:除了作為一般的數(shù)據(jù)存放器使用外,可以和堆棧段存放器SS聯(lián)合使用來指示堆棧段中的存儲單元地址;SI(sourceindex)和DI(destinationindex):除了作為一般的數(shù)據(jù)存放器使用外,可以和數(shù)據(jù)段存放器DS聯(lián)合使用來確定數(shù)據(jù)段中存儲單元的地址注意:這四個存放器只能以16位為單位一起使用標志存放器〔程序狀態(tài)字存放器PSW〕1514131211109876543210狀態(tài)標志:控制標志:OF

溢出標志DF方向標志SF

符號標志IF中斷標志ZF

零標志TF陷阱標志CF

進位標志AF

輔助進位標志PF

奇偶標志OFDFIFTFSF

ZF

AF

PF

CF例:

MOVAX,1MOVBX,2ADDAX,BX

指令執(zhí)行后,(AX)=3,OF=0,CF=0,ZF=0,SF=0例:

MOVAX,FFFFHMOVBX,1ADDAX,BX

指令執(zhí)行后,(AX)=0,OF=0,CF=1,ZF=1,SF=0Debug下的內(nèi)存和存放器(1)PSP

DSESSSCSEXE程序的內(nèi)存映象圖裝入模塊文件頭Debug下的內(nèi)存和存放器(2)一個16位存放器可以存儲一個16位的數(shù)據(jù)?!矓?shù)據(jù)的存放情況〕一個16位存放器所能存儲的數(shù)據(jù)的最大值為多少?答案:216-1。通用存放器16位數(shù)據(jù)在存放器中的存放情況數(shù)據(jù):18二進制表示:10010在存放器AX中的存儲:16位數(shù)據(jù)在存放器中的存放情況數(shù)據(jù):20000二進制表示:在存放器AX中的存儲:通用存放器以AX為例,8086CPU的16位存放器分為兩個8位存放器的情況:通用存放器通用存放器的作用〔2〕變址存放器(IndexRegister)SI:SourceIndexRegister,源變址存放器DI:DestinationIndexRegister,目標變址存放器它們可作一般的存儲器指針使用。在字符串操作指令的執(zhí)行過程中,對它們有特定的要求,且具有特殊的功能?!?〕指針存放器(PointerRegister)它們主要用于訪問堆棧內(nèi)的存儲單元,并且規(guī)定:BP:基指針(BasePointer)存放器,用它可直接存取堆棧中的數(shù)據(jù)SP:堆棧指針(StackPointer)存放器,用它只可訪問棧頂通用存放器的作用寄存器用途AX乘法指令作累加器,I/O指令作數(shù)據(jù)寄存器由累加器做立即數(shù)運算,比其他指令少占字節(jié)ALBCD碼,ASCII碼運算的累加器,查表指令XLAT的累加器字節(jié)乘法,字節(jié)除法,字節(jié)I/O,十進制算術(shù)運算AH作為取指令標志LAHF的目的寄存器,字節(jié)乘法,字節(jié)除法BX間接尋址作基址寄存器,XLAT指令中作基址寄存器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外部訪問速度快訪問速度慢容量小,本錢高容量大,本錢低用名字表示用地址表示RegistersOn-chipL1cache(SRAM)Mainmemory(DRAM)Localsecondarystorage(localdisks)Larger,slower,andcheaper(perbyte)storagedevicesRemotesecondarystorage(distributedfilesystems,Webservers)Localdisksholdfilesretrievedfromdisksonremotenetworkservers.Mainmemoryholdsdiskblocksretrievedfromlocaldisks.Off-chipL2cache(SRAM)L1cacheholdscachelinesretrievedfromtheL2cache.CPUregistersholdwordsretrievedfromcachememory.L2cacheholdscachelinesretrievedfrommemory.L0:L1:L2:L3:L4:L5:Smaller,faster,andcostlier(perbyte)storagedevices8086在取指令和尋找內(nèi)存操作數(shù)的地址時,采用了分段尋找的方式,在同一時刻可將內(nèi)存分成4個段:代碼段、數(shù)據(jù)段、堆棧段和特別數(shù)據(jù)段,段與段之間允許有重疊。4個段存放器是:CS(CodeSegmentRegister,代碼分段存放器)DS(DataSegmentRegister,數(shù)據(jù)分段存放器)SS(StackSegmentRegister,堆棧分段存放器)ES(ExtraSegmentRegister,特別分段存放器)。這4個存放器都只能夠作為16位存放器使用。8086內(nèi)部有20根地址線,它可以直接訪問的物理空間為1M字節(jié),其編碼區(qū)間為:00000H~0FFFFFH。而CPU內(nèi)部存放存儲單元偏移量的存放器(如IP、SP、BP、SI、DI和BX等)都是16位,它們的編碼范圍僅為:00000H~0FFFFH。如何用16位存放器有效地訪問1MB的存儲空間,8086采用了內(nèi)存分段的管理模式,并引入存儲器分段的概念。段存放器的作用8086內(nèi)存分段管理模式〔1〕存儲器的分段計算機的內(nèi)存單元是以“字節(jié)”為最小單位進行線性編址的。為了標識每個存儲單元,就給每個存儲單元規(guī)定一個編號,此編號就是該存儲單元的物理地址。16位微機把內(nèi)存空間劃分成假設(shè)干個邏輯段,每個邏輯段的要求如下:邏輯段的起始地址(通常簡稱為:段地址)必須是16的倍數(shù),即最低4位二進制必須全為0;邏輯段的最大容量為64K,這由16位存放器的尋址空間所決定。按上述規(guī)定,1M內(nèi)存最多可分成64K個段,即65536個段(段之間相互重疊),至少可分成16個相互不重疊的段?!?〕物理地址的形成方式存儲單元的邏輯地址分為兩局部:段地址和偏移量。由邏輯地址得到其物理地址(PA—PhysicalAddress)的計算方法如下:物理地址PA=段地址×16+偏移量邏輯地址到物理地址的生成加法器

邏輯地址191500

偏移地址段地址0000

20-bit物理存儲器地址150物理地址:每個存儲單元唯一的20位地址段地址:段起始地址的高16位偏移地址:段內(nèi)相對于段起始地址的偏移值〔16位〕〔有效地址EA〕8086內(nèi)存分段管理模式〔3〕段存放器的引用段存放器是因為對內(nèi)存的分段管理而設(shè)置的。一般情況下,段存放器及其指針存放器的引用關(guān)系方面有如下規(guī)定:取指令所用的段存放器和偏移量一定是用CS和IP;堆棧操作所用的段存放器和偏移量一定是SS和SP;串操作的目標操作數(shù)所用的段存放器和偏移量一定是ES和DI;其它情況,段存放器除其默認段存放器外,還可以強行改變?yōu)槠渌未娣牌?。訪問存儲器方式缺省的段寄存器可選用的段寄存器偏移量取指令CSIP堆棧操作SSSP一般取操作數(shù)DSCS、ES、SS有效地址串操作源操作數(shù)DSSI目標操作數(shù)ESDI使用指針寄存器BPSSCS、DS、ES有效地址CS和IPCS和IP是8086CPU中最關(guān)鍵的存放器,它們指示了CPU當前要讀取指令的地址。CS為代碼段存放器;IP為指令指針存放器。8086PC工作過程的簡要描述〔1〕從CS:IP指向內(nèi)存單元讀取指令,讀取的指令進入指令緩沖器;〔2〕IP=IP+所讀取指令的長度,從而指向下一條指令;〔3〕執(zhí)行指令。轉(zhuǎn)到步驟〔1〕,重復這個過程。8086PC工作過程的簡要描述在8086CPU加電啟動或復位后〔即CPU剛開始工作時〕CS和IP被設(shè)置為CS=FFFFH,IP=0000H,即在8086PC機剛啟動時,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)容當作指令的段地址和偏移地址,用它們合成指令的物理地址,到內(nèi)存中讀取指令碼,執(zhí)行。如果說,內(nèi)存中的一段信息曾被CPU執(zhí)行過的話,那么,它所在的內(nèi)存單元必然被CS:IP指向過。修改CS、IP的指令在CPU中,程序員能夠用指令讀寫的部件只有存放器,程序員可以通過改變存放器中的內(nèi)容實現(xiàn)對CPU的控制。CPU從何處執(zhí)行指令是由CS、IP中的內(nèi)容決定的,程序員可以通過改變CS、IP中的內(nèi)容來控制CPU執(zhí)行目標指令。我們?nèi)绾胃淖僀S、IP的值呢?修改CS、IP的指令8086CPU必須提供相應的指令mov指令不能用于設(shè)置CS、IP的值,

8086CPU沒有提供這樣的功能。8086CPU為CS、IP提供了另外的指令來改變它們的值:轉(zhuǎn)移指令修改CS、IP的指令同時修改CS、IP的內(nèi)容:

jmp段地址:偏移地址

jmp2AE3:3 jmp3:0B16

功能:用指令中給出的段地址修改CS,偏移地址修改IP。修改CS、IP的指令僅修改IP的內(nèi)容: jmp某一合法存放器 jmpax〔類似于movIP,ax〕 jmpbx 功能:用存放器中的值修改IP?!?〕存儲單元的內(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)存分段管理模式3.

存儲器存儲單元的地址和內(nèi)容:存儲器以字節(jié)〔8bit〕為單位存儲信息每個字節(jié)單元有一個地址,從0編號,順序加1地址用二進制數(shù)表示〔無符號整數(shù),寫成十六進制〕一個字要占用相繼的兩個字節(jié)低位字節(jié)存入低地址,高位字節(jié)存入高地址機器以偶地址訪問〔讀/寫〕存儲器字單元地址用它的低地址來表示10011111

1000H(1000H)=9FH00100110

1001H

00011110

1002H(1002H)=1EH11010111

1003H

(1000H

)=269FH(

1002H)=D71EH(1001H)=1E26H

訪問兩次存儲器(1001H)=26H(1003H)=D7H存儲器存儲器的分段:20根地址線:地址范圍

00000H~FFFFFH機器字長16位:僅能表示地址范圍0000H~FFFFH小段:每16個字節(jié)為一小段,共有64K個小段

小段的首地址

00000H~0000FH

00010

H~0001FH

00020H~0002FH

FFFF0H~FFFFFH

段起始地址:小段首地址段的大?。?4K范圍內(nèi)的任意字節(jié)存儲器的邏輯分段:

存儲器64K代碼01500H42000H1CD00H0150H4200H1CD0H段寄存器CSDSSSES64K堆棧64K數(shù)據(jù)64K附加數(shù)據(jù)B0000HB000H

存儲器8K代碼2K數(shù)據(jù)256堆棧02000H04800H04000H0200H0400H0480HCSDSSS例:(DS)=0400H,EA=1234H,

物理地址

=

16d(DS)+EA=05234HCPU可以用不同的段地址和偏移地址形成同一個物理地址:物理地址段地址偏移地址05234H0400H1234H0523H0004H0520H0034H……8086/8088有兩個獨立的存儲空間和I/O地址空間,地址空間為1MB,I/O地址空間為64KB。數(shù)據(jù)按字節(jié)、字或雙字存放,存放方式可按對正的雙字邊界或非對正的雙字為邊界。邏輯地址〔logicaladdress〕物理地址〔physicaladdress〕。物理地址=段地址*16+偏移地址地址00001H00008H00007H00006H00005H00004H00003H00002HByte8Byte7Byte6Byte5Byte4Byte3Byte2Byte1Word6Word4Word2Word0Byte000000HWord5Word1物理存儲器

雙字對齊字對齊Doubleword0Doubleword4圖3.2對正的數(shù)據(jù)字和雙字Byte8圖(a)中數(shù)據(jù)5AF0H存放在對正的雙字地址02000H,其中0F0H存放在低字節(jié)地址02000H,5AH存放在高字節(jié)地址02001H。圖(b)中數(shù)據(jù)2C96H,對正的雙字地址邊界是0200CH。

地址

存儲器(二進制)存儲器〔十六進制〕

地址020011602000160101101011110000

存儲器(二進制)0010110010010110

0200E160200D16

5A

F0

(b)

(a)

物理存儲器

圖3.4非對正的字或雙字為邊界的例子地址00001H00008H00007H00006H00005H00004H00003H00002HByte8Byte7Byte6Byte5Byte4Byte3Byte2Byte1Word7Word3Byte000000H字未對齊Doubleword1Doubleword2Doubleword5Doubleword3雙字未對齊〔a〕非對正的雙字邊界的雙字存儲〔b〕對正的雙字存儲

A011001101

AB

地址存儲器(二進制)存儲器(十六進制)

地址021051602104160000000100100011存儲器(十六進制)000210F160210E16

01

23

(b)

(a)021031602102160210116021001610101011

CD

55

FF0210D160210C160210B160210A16××××××××××××××××××××××××〔a〕其中0123H存放在02104H處,此地址是對正的雙字邊界地址,而ABCD存放的起始地址是02102H,而該字的對正的雙字邊界應為02100H。完整的雙字是0123ABCDH。邏輯地址與物理地址之間的關(guān)系:段基址為002B0H,偏移地址為0013H,物理地址為002C3H。

段基址為002C0H,偏移地址為0003H,物理地址為002C3H。

~~邏輯地址

~2C4H2C3H2C2H2C1H2C0H2BFH2BEH2BDH2BCH2BBH2BAH2B9H2B8H2B7H2B6H2B5H2B4H2B3H2B2H2B1H2B0H段基址

偏移(3H)

偏移(13H)段基址物理地址圖表示堆棧結(jié)構(gòu)堆棧——是一個特殊的隨機存儲區(qū),用于臨時存放一些信息如數(shù)據(jù)或地址。對于實模式,堆棧區(qū)為64KB,按32K個字組織......

堆棧段...存儲器〔字寬〕

0000HSPSS

FFFEH堆棧底部

堆棧頂部圖PUSHAX指令執(zhí)行前的堆棧狀態(tài)堆?!?/p>

0011

2233

4455

6677

8899AABB

0123

4567

89AB

CDEF

0105

0008

1062

1060105E

105C

105A

1058

1056

1054

10521050SSSPTOS

堆棧底部

PUSHAX指令執(zhí)行后、POPAX和POPBX執(zhí)行后堆棧狀況~~

1234

0011

2233

4455

6677

8899

AABB

3412

4567

89AB

CDEF

0105

0006

1062

1060105E

105C

105A

1058

1056

1054

10521050SSSPPUSHAXAXTOS~~

0011

2233

4455

6677

8899

AABB

3412

4567

89AB

CDEF

0105

0008

1062

1060105E

105C

105A

1058

1056

1054

10521050

1234SSSPPOPAXTOP控制存放器的作用〔1〕指令指針存放器(InstructionPointer)指令指針I(yè)P是16位的存放器,存放著下次將要執(zhí)行的指令在代碼段的偏移量。在80386及其高檔處理器處于保護模式時,其指令指針存放器是32位的EIP?!?〕標志存放器(FlagsRegister)FLAG存放器的各位用來存放各種不同的標志。算術(shù)運算指令和邏輯運算指令的運行結(jié)果都將定性地反映在不同的標志位上,以便后續(xù)的條件判斷指令根據(jù)這些標志實現(xiàn)判斷轉(zhuǎn)移,判斷轉(zhuǎn)移的實質(zhì)是修改CS和IP。這也正是計算機能夠?qū)崿F(xiàn)判斷轉(zhuǎn)移的底層原理。6個狀態(tài)標志:OF、SF、ZF、AF、PF、CF3個控制標志:IF、DF、TF;7位保存;標志存放器CF:進位標志,在進行字/字節(jié)運算產(chǎn)生進位或借位時置1,否那么置0。PF:奇偶性標志,結(jié)果有偶數(shù)位為1時置1,否那么置0。AF:輔助進位標志,當進行字節(jié)運算有低4位向高4位進位或借位時置1,否那么置0。在作BCD碼運算時常常使用。ZF:零標志,當運算結(jié)果為0時置1,否那么置0。SF:符號標志,運算結(jié)果為負,即結(jié)果最高位為1時置1,否那么置0。TF:陷阱標志,假設(shè)IF=1,那么在執(zhí)行指令時產(chǎn)生單步中斷。IF:中斷標志,假設(shè)IF=1開中斷,響應可屏蔽中斷;IF=0,關(guān)中斷。DF:方向標志,DF置1引起串操作指令的變址存放器自動減值,DF置0引起串操作指令的變址存放器自動增值。OF:溢出標志,運算溢出時自動置1,當它為1時可用溢出中斷指令產(chǎn)生中斷。機器語言〔machinelanguage)CPU執(zhí)行的程序都是用機器語言寫成的。機器代碼是二進制代碼,一條機器語言指令長度,可以是1個字節(jié)或多個字節(jié)。微處理器只能理解機器語言,但直接用機器語言寫程序幾乎是不可能的。因此程序常采用其它語言來編寫。匯編語言〔Assembler〕2.2尋址方式程序〔program〕源代碼(sourcecode)目標代碼〔objectcode)編譯(assember)連接(link)指令(instruction)指令系統(tǒng)(指令集)操作碼(opcode)操作數(shù)〔operand)目標操作數(shù)〔destinationoperand)源操作數(shù)(sourceoperand)指令格式操作碼字段操作數(shù)地址字段地址結(jié)構(gòu)二地址單地址隱含地址根本指令長度1-6字節(jié)。尋址方式形式地址有效地址EA物理地址PA利用匯編語言編寫程序具有以下優(yōu)點:〔1〕用匯編語言編寫的程序,程序的代碼短,程序占用的內(nèi)存少,程序運行速度要比用高級語言寫的程序快;〔2〕匯編語言給予程序設(shè)計者更強的能力,實現(xiàn)高技術(shù)任務(wù),而這些任務(wù)假設(shè)用高級語言是難以實現(xiàn)或根本不能實現(xiàn);〔3〕匯編語言的知識,有助于理解微處理器的結(jié)構(gòu),這是高級語言所沒有的;〔4〕駐留程序和中斷效勞程序總是用匯編語言開發(fā)匯編語言語句的一般格式是:標號:指令;注釋例:START:MOVAX,BX;COPYBXINTOAXSTART是該指令的地址標識,叫做標號〔Label〕。在指令后面由分號〔;〕標識的是注釋。00138A24NEXT:MOVAH,[SI];MOVEABYTE其中8A24是指令MOVAH,[SI]的機器碼,這是一條雙字節(jié)指令,該指令的存儲器地址是0013H和0014H。匯編指令的書寫形式一條匯編指令通常可以寫成如下形式:[標號:]操作碼[目標操作數(shù)][,源操作數(shù)][;注釋]

〔1〕其中[]中的內(nèi)容為可選項?!?〕標號必須是用字母打頭的字母或數(shù)字組成的字符串,標號供轉(zhuǎn)移指令作為轉(zhuǎn)移的目標。〔3〕指令末尾的分號表示由‘;’起直至〈ENTER〉前均為注釋局部,在輸入源程序時,每一條匯編指令的末尾必須輸入換行鍵〈ENTER〉表示本指令的結(jié)束,下一指令的開始。匯編指令的書寫形式操作碼目標操作數(shù),源操作數(shù)

一條能匯編成機器代碼指令的匯編指令必須有唯一的操作碼。操作碼是匯編指令的關(guān)鍵字,它指出該指令要做什么。一條匯編指令中的源操作數(shù)用來指出指令處理的對象來自何處。一條匯編指令中的目標操作數(shù)用來指出指令的處理結(jié)果置于何處。在許多指令中目標操作數(shù)既表示處理的對象之一來自何處,又指出處理的結(jié)果置于何處。目標操作數(shù)總是緊接著操作碼出現(xiàn)在源操作數(shù)的左邊,因此有也稱目標操作數(shù)為左源。匯編指令的書寫形式操作碼目標操作數(shù),源操作數(shù)

指令行中可以沒有源操作數(shù)和目標操作數(shù)。在這種情況下通常是對某一固定的或稱作隱含操作數(shù)的操作。指令行中可以沒有源操作數(shù)而僅含目標操作數(shù)。這時目標操作數(shù)既指出處理對象來自何處,又指出處理結(jié)果置于何處。這種指令被稱為單操作數(shù)指令。指令行中既有源操作數(shù)又有目標操作數(shù)的指令稱為雙操作數(shù)指令。雙操作數(shù)指令中目標操作數(shù)一定出現(xiàn)在源操作數(shù)的左邊。尋址方式就是尋找指令中的操作數(shù)的方式,尋址主要是指尋找內(nèi)存數(shù)據(jù)的地址。幾個概念尋址方式:根據(jù)指令中給出的地址尋找真實操作數(shù)地址的方式形式地址:指令中的地址碼字段給出的地址有效地址:能夠直接訪問的存儲器地址物理地址:存儲器地址匯編指令的書寫形式舉例: LOOP1:AAA ;此處可添加注釋<ENTER> MOVAX,053H ;此處可添加注釋<ENTER> INCDH ;此處可添加注釋<ENTER>第一條指令:帶標號LOOP1,AAA是操作碼,這一指令隱含使用固定操作數(shù)AL;第二條指令:MOV是操作碼,雙操作數(shù)指令,AX是目標操作數(shù),053H是源操作數(shù)第三條指令:INC是操作碼單操作數(shù)指令在DOS下運行匯編程序,注釋局部只能用英文和ASCII碼符號書寫,在中文操作系統(tǒng)下那么可用中文書寫,<ENTER>是指換行鍵。操作碼通常是指指令功能的助記符,它給出了指令功能便于記憶的形式,例如,MOV是Movement的縮寫等。三種類型的操作數(shù)〔1〕立即數(shù)〔2〕存放器〔3〕內(nèi)存單操作數(shù)指令的操作數(shù)只能是存放器操作數(shù)或內(nèi)存操作數(shù)。雙操作數(shù)指令的目標操作數(shù)只能是存放器操作數(shù)或內(nèi)存操作數(shù),而源操作數(shù)可以是三者之一,但是兩操作數(shù)不能同時為內(nèi)存操作數(shù)。〔1〕立即數(shù)操作數(shù)立即數(shù)操作數(shù)作為代碼指令的一局部出現(xiàn)在雙操作數(shù)指令中。除了乘法、除法和字符串操作指令之外,立即數(shù)操作數(shù)均可作為源操作數(shù)。立即數(shù)操作數(shù)在匯編指令中可以以十六進、八進制、二進制或十進制形式書寫,例如0F0H、777Q、101B、99D等,注意,在用十六進制書寫時第一個字符是非數(shù)字0~9時,前面一定要補一個0,例如,F(xiàn)AH應記為0FAH。匯編指令中立即數(shù)操作數(shù)還可以以一個表達式的形式出現(xiàn),此時該立即數(shù)就是表達式的值?!?〕存放器操作數(shù)存放器操作數(shù)是以存放器的內(nèi)容參加運算,或用存放器存放結(jié)果。MOVAX,3456H中的AX,MOVDL,41H中的DL就是存放器操作數(shù)。段存放器的內(nèi)容指出當前4個段的基址,這些存放器不能用一般的傳送指令將立即數(shù)送入。如果需要將立即數(shù)置入段存放器中的DS、ES或SS,那么首先應將該值送入AX或其他通用存放器,然后再由AX傳送給DS、ES或SS。至于CS因其與指令地址有關(guān),一般不需用戶干預。標志存放器FLAG的各位在執(zhí)行算術(shù)邏輯運算指令后一般均被修改,其狀態(tài)將依指令及執(zhí)行結(jié)果而定,它可以反映出當時處理器和累加器所檢測到的結(jié)果。標志存放器一般不能作為操作數(shù),但可用標志指令或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ù)和邏輯運算操作。雖然經(jīng)常把AX作為累加器,但所有通用存放器均可用作累加器。通用存放器在單操作數(shù)指令中可作目標操作數(shù),在雙操作數(shù)指令中既可作源操作數(shù)也可作目標操作數(shù)?!?〕存放器操作數(shù)一些匯編指令中雖然沒有顯式地寫有存放器,但是它卻隱含著使用所指定的通用存放器,詳見表。指令隱含應用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〔3〕內(nèi)存操作數(shù)內(nèi)存操作數(shù)又稱為存儲器操作數(shù),是指把內(nèi)存某地址存放的字節(jié)、字作為指令的處理對象。這時要將該字節(jié)、字作為源操作數(shù)或目標操作數(shù),當其作為源操作數(shù)時從內(nèi)存中取出,或送到某個存放器,或參加運算等;當其作為目標操作數(shù)時,那么是將操作的結(jié)果置入該內(nèi)存單元。無論是何種內(nèi)存操作數(shù),關(guān)鍵是必須找到其所在地址,即必須指出其所在段和相對于段首的位移(即有效地址EA),才能確定其物理地址。內(nèi)存操作數(shù)地址確實定是尋址規(guī)那么的重點。內(nèi)存操作數(shù)所在段的段存放器的名字在匯編指令中一般是不寫的,它遵循著如前面的表所示的隱含原那么,根據(jù)內(nèi)存操作數(shù)類型的不同相應使用不同的段存放器。尋址方式與數(shù)據(jù)有關(guān)的尋址方式 〔1〕隱含尋址方式 〔2〕立即數(shù)尋址(ImmediateAddressing) 〔3〕存放器尋址(RegisterAddressing) 〔4〕直接尋址(DirectAddressing) 〔5〕存放器間接尋址(RegisterIndexAddressing) 〔6〕存放器相對尋址(RegisterRelativeAddressing) 〔7〕基址加變址尋址(BasedIndexedAddressing) 〔8〕相對基址變址尋址(BasedIndexedAddressing) 與轉(zhuǎn)移地址有關(guān)的尋址方式 〔1〕段內(nèi)直接尋址 〔2〕段內(nèi)間接尋址 〔3〕段間直接尋址 〔4〕段間間接尋址I/O端口尋址(I/OPORTAddressing)1.8086的尋址方式

與數(shù)據(jù)有關(guān)的尋址方式:立即尋址MOVAX,3069H存放器尋址MOVAL,BH直接尋址MOVAX,[2000H]存放器間接尋址MOVAX,[BX]存放器相對尋址MOVAX,COUNT[SI]基址變址尋址MOVAX,[BP][DI]相對基址變址尋址MOVAX,MASK[BX][SI]存儲器尋址1.隱含尋址方式2.立即尋址方式操作數(shù)直接存放在指令中,緊跟在操作碼后,它作為指令的一局部存放在代碼中。操作數(shù)叫做立即數(shù)。立即數(shù)可以是8位、16位。例:MOVAL,15H機器碼如下:地址存儲器內(nèi)容指令01000HB015MOVAL,15H01002HXX下一條指令(1)立即尋址方式*

——操作數(shù)在指令中給出

MOVAL,5MOVAX,3064HMOVAL,‘A’*

只能用于

SRC字段*

SRC和DST的字長一致

MOVAH,3064H

3.存放器尋址方式指令的操作數(shù)存放在處理器的存放器中,指令指明存放器號,這些內(nèi)部存放器包括段存放器和通用存放器,存放器可以分8位、16位。例:MOVAX,BXBX為源操作數(shù),AX是目的操作數(shù),該指令是將BX中的內(nèi)容傳送至AX,即傳送后,BX的內(nèi)容保持不變。

地址儲器內(nèi)容指令010008BC3MOVAX,BX01002XX下一條指令(2)存放器尋址方式*——操作數(shù)在指定的存放器中MOVAX,BXMOVAL,BHMOVAX,3064H*字節(jié)存放器只有AHALBHBLCHCLDHDL*SRC和DST的字長一致MOVAH,BX*CS不能用MOV指令改變MOVCS,AX4.存儲器尋址操作數(shù)存放在存儲器中。CPU首先計算這個操作數(shù)的物理地址PA〔physicaladdress〕,然后讀或?qū)戇@個操作數(shù)。PA=SBA:EA=段基址*16+偏移量SBA〔segmentbaseaddress〕一個物理存儲器段的起始地址。EA〔effectiveaddress〕為操作數(shù)相對該存儲器段開始的偏移量。其有效地址計算的公式如下:EA=base+index+displacementBase為基址存放器:BX、BP。Index為變址存放器:SI、DI,Displacement為位移量:16位或8位。隱含段前綴:DS:BX、DS:SI、DS:DI、SS:BP超越段前綴:可以利用其它的段存放器作為段基址,需要使用段超越,即將段存放器用顯式方式“段存放器”:放在間接尋址存放器的左方括號前,如:MOVAL,ES:[SI]變址器匯編書寫形式有效地址(EA)段寄存器物理地址SI[SI](SI)DS(DS)*10H+(SI)DI[DI](DI)DS(DS)*10H+(DI)BX[BX](BX)DS(DS)*10H+(BX)BP[BP](BP)SS(SS)*10H+(BP)〔1〕、直接尋址方式指令中地址碼中給出的是有效地址,即形式地址就是有效地址。PA=段基址:直接地址段基址指:CS、DS、SS、ES例:MOVCX,DS:[BETA]地址存儲器內(nèi)容指令010008B0E3412MOVCX,DS:[BETA]01004XX設(shè)〔03234〕=0EDH,〔03235〕=0BEH,〔DS〕=0200H,BETA=1234H,指令執(zhí)行后,將操作數(shù)0BEEDH傳至CX。(3)直接尋址方式*

——有效地址EA由指令直接給出

例:MOVAX,[2000H]EA=2000H,假設(shè)

(DS)=3000H,那么PA=32000H*隱含的段為數(shù)據(jù)段DS*可使用段跨越前綴MOVAX,ES:[2000H]*操作數(shù)地址可由變量〔符號地址〕表示VALUEDB10MOVAH,VALUEMOVAX,VALUEMOVAX,WORDPTRVALUE50H30H32000AHAL3050(AX)=3050HMOVAX,[2000H];設(shè)(DS)=3000H執(zhí)行結(jié)果(AX)=3050H可以用符號地址代替數(shù)值地址,如:MOVAX,VALUE;或者MOVAX,[VALUE]VALUE為存放操作數(shù)單元的符號地址。DATASEGMENTDB41H;偏移量0DB42H;偏移量1DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAGO:MOVAX,DATAMOVDS,AX

MOVDL,DS:[0] ;MOVAH,2INT21HMOVDL,DS:[1] ;INT21HMOVAH,4CHINT21HCODEENDSENDGODATASEGMENTA1DB41H;變量A1,偏移量0B1DB42H;變量B1,偏移量1DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAGO:MOVAX,DATAMOVDS,AX

MOVDL,A1 ;MOVAH,2INT21H

MOVDL,B1 ;INT21HMOVAH,4CHINT21HCODEENDSENDGO(2)、存放器間接尋址方式操作數(shù)的有效地址存放在通用存放器BX、BP、SI、DI中。例:MOVAX,[SI];其隱含的段存放器為DS,設(shè)DS=0200H,SI=1234H,所讀取的操作數(shù)物理地址為03234H,讀取的操作數(shù)為0BEEDH,傳送至存放器AX中。地址存儲器內(nèi)容指令010008B04MOVAX,[SI]01002XX下一條指令..03234ED源操作數(shù)03235BE(4)存放器間接尋址*——EA在基址存放器(BX/BP)或變址存放器(SI/DI)中MOVAX,[BX]PA=16d(DS)+(BX)MOVAX,ES:[BX]PA=16d(ES)+(BX)MOVAX,[BP]PA=16d(SS)+(BP)*

不允許使用AX、CX、DX存放EAMOVAX,[CX]

*

SRC和DST的字長一致

MOVDL,[BX];[BX]指示一個字節(jié)單元

MOVDX,[BX];[BX]指示一個字單元*

適于數(shù)組、字符串、表格的處理舉例

假設(shè)有指令:MOVAX,[BX];在執(zhí)行時,(DS)=2000H,(BX)=1000H,執(zhí)行指令后AX=50A0H.EA=1000H,物理地址為21000H這種尋址方式可以用于表格處理,執(zhí)行完一條指令后,只需修改存放器內(nèi)容就可取出表格中的下一項。〔3〕、基址〔變址〕尋址方式〔存放器相對尋址〕操作數(shù)的有效地址是由基址〔變址〕存放器中的內(nèi)容加上偏移量。偏移量是8位或16位的?;反娣牌鳎築X、BP變址存放器:SI、DI例:MOV[BX]+BETA,AL其中BETA為立即數(shù),操作數(shù)的有效地址是EA=[BX]+BETA該指令也可以寫成如下形式:MOVBETA[BX],AL或MOV[BX+BETA],AL

有效地址

=(BX)(BP

)8位

(SI)16位

(DI)+

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

01004XX下一條指令..04234ED

04235XX基址尋址常用于對一維數(shù)組的訪問,用基地址指向一維數(shù)組的第一個元素的地址指針,用偏移量指向數(shù)組中要訪問的元素。如圖:Element0Element2...

數(shù)據(jù)結(jié)構(gòu)...Elementn

偏移量基址存放器+存儲器Elementn-1Element1

一個數(shù)組元素的變址尋址

Elementn-1Elementn...

數(shù)組...變址存放器

偏移地址+存儲器Element0Element1Element2例如:MOVAX,[BP]+VARAMOVAX,VARA[BP]MOVAX,[BP+VARA]變址器匯編書寫形式有效地址段寄存器物理地址SI[SI+disp](SI)+dispDS(DS)*10H+(SI)+dispDI[DI+disp](DI)+dispDS(DS)*10H+(DI)+dispBX[BX+disp](BX)+dispDS(DS)*10H+(BX)+dispBP[BP+disp](BP)+dispSS(SS)*10H+(BP)+disp舉例:MOVAX,COUNT[SI],其中,COUNT為16位偏移量的符號地址。如果(DS)=3000H,(SI)=2000H,COUNT=3000H,那么EA=2000H+3000H=5000H物理地址=30000H+5000H=35000H執(zhí)行結(jié)果(AX)=1234H(4)、基址變址尋址方式有效地址是基址存放器與變址存放器中數(shù)據(jù)之和。這種尋址模式可以被用于訪問復雜的數(shù)據(jù)結(jié)構(gòu)如二維數(shù)組。基址變址尋址的物理地址如下式所示:PA=段基址:基址+變址其有效地址如下:[BX+SI]或[BX][SI]表示:EA=(BX)+(SI)[BX+DI]或[BX][DI]表示:EA=(BX)+(DI)[BP+SI]或[BP][SI]表示:EA=(BP)+(SI)[BP+DI]或[BX][DI]表示:EA=(BP)+(DI)(6)基址變址尋址方式*MOVAX,[BX][DI]或MOVAX,[BX+DI]MOVAX,ES:[BX][SI]*適于數(shù)組、字符串、表格的處理*必須是一個基址存放器和一個變址存放器的組合MOVAX,[BX][BP]MOVAX,[SI][DI]有效地址=(BX)(SI)(BP

)(DI)+舉例:MOVAX,[BX][DI]也可以表示為:MOVAX,[BX+DI]如果(DS)=2100H,(BX)=0158H,(DI)=10A5H,那么EA=0158H+10A5H=11FDH物理地址=21000H+11FDH=221FDH執(zhí)行結(jié)果(AX)=1234H(7)相對基址變址尋址方式

MOVAX,MASK[BX][SI]

MOVAX,MASK[BX+SI]

或MOVAX,[MASK+BX+SI]

有效地址

=(BX)(SI)8位(BP

)(DI)16位++位移量訪問存儲器的方式偏移地址默認的段存放器可跨越的段存放器取指令CS無IP堆棧操作SS無SP一般數(shù)據(jù)訪問DSCSESSSEABP作為基址的尋址SSCSDSESBP串操作的源操作數(shù)DSCSESSSSI串操作的目的操作數(shù)ES無DI段寄存器的使用規(guī)定其有效地址如下:[BX+SI+disp]表示:EA=(BX)+(SI)+disp[BX+DI+disp]表示:EA=(BX)+(DI)+disp[BP+SI+disp]表示:EA=(BP)+(SI)+disp[BP+DI+disp]表示:EA=(BP)+(DI)+disp以下表達形式是等價的:[BX][SI]+dispdisp[BX][SI]或[BX+SI]+disp[BX+SI+disp]但格式:BX[1000H+SI]、SI[1000H+BX]等是錯誤的,即所用存放器不能在”[“,”]”之外,該限制對存放器相對尋址方式的書寫也同樣起作用。

基址寄存器變址寄存器匯編書寫形式有效地址段寄存器物理地址BXSI[BX+SI+disp](BX)+(SI)+dispDS(DS)*10H+EABXDI[BX+DI+disp](BX)+(DI)+dispDS(DS)*10H+EABPSI[BP+SI+disp](BP)+(SI)+dispSS(SS)*10H+EABPDI[BP+DI+disp](BP)+(DI)+dispSS(SS)*10H+EA相對基址變址尋址的有效地址形成舉例:MOVAX,MASK[BX][SI]如果(DS)=3000H,(BX)=2000H,MASK=0250H,(SI)=1000H,那么物理地址=30000H+2000H+1000H+0250H=33250H執(zhí)行結(jié)果(AX)=1234H相對基址加變址尋址方式與其它尋址方式之間的變形關(guān)系源操作數(shù)指令的變形源操作數(shù)的尋址方式只有一個偏移量MOVAX,[100H]直接尋址方式只有一個寄存器MOVAX,[BX]或MOVAX,[SI]寄存器間接尋址方式有一個寄存器和偏移量MOVAX,[BX+100H]或MOVAX,[SI+100H]寄存器相對尋址方式有二個寄存器MOVAX,[BX+SI]基址加變址尋址方式有二個寄存器和常數(shù)項MOVAX,[BX+SI+100H]相對基址加變址尋址方式5、與轉(zhuǎn)移地址有關(guān)的尋址方式這些尋址方式用來確定轉(zhuǎn)移指令及CALL指令的轉(zhuǎn)向地址?!?〕段內(nèi)直接尋址〔Intrasegmentdirectaddressing〕〔2〕段內(nèi)間接尋址〔Intrasegmentindirectaddressing〕〔3〕段間直接尋址〔Intersegmentdirectaddressing〕〔4〕段間間接尋址〔Intersegmentindirectaddressing〕〔1〕段內(nèi)直接尋址〔Intrasegmentdirectaddressing〕轉(zhuǎn)向的有效地址是當前IP存放器的內(nèi)容和指令中指定的8位或16位偏移量之和。這是一種相對尋址方式;適用于條件轉(zhuǎn)移及無條件轉(zhuǎn)移指令,但當它用于條件轉(zhuǎn)移時,位移量只允許8位,這稱為短跳轉(zhuǎn)。舉例JMPNEARPRTPROGIAJMPSHORTQUESTPROGIA和QUEST均為轉(zhuǎn)向的符號地址,在機器指令中,用偏移量來表示,符合程序再定位要求。在匯編指令中,如果偏移量為16位,那么在符號地址前加操作符NEARPRT,如果偏移量為8位,那么在符號地址前加操作符SHORT?!?〕段內(nèi)間接尋址〔Intrasegmentindirectaddressing〕轉(zhuǎn)向有效地址是一個存放器或是一個存儲單元的內(nèi)容。這個存放器或存儲單元的內(nèi)容可以用數(shù)據(jù)尋址方式中除立即數(shù)以外的任何一種尋址方式取得,所得到的轉(zhuǎn)向有效地址用來取代IP存

溫馨提示

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

評論

0/150

提交評論