匯編語言程序設(shè)計(jì)2_第1頁
匯編語言程序設(shè)計(jì)2_第2頁
匯編語言程序設(shè)計(jì)2_第3頁
匯編語言程序設(shè)計(jì)2_第4頁
匯編語言程序設(shè)計(jì)2_第5頁
已閱讀5頁,還剩55頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

匯編語言程序設(shè)計(jì)

AssemblyLanguageProgramming第一章基礎(chǔ)知識(shí)§2硬件基礎(chǔ)計(jì)算機(jī)的基本結(jié)構(gòu)CPU系統(tǒng)總線MemoryI/O子系統(tǒng)

80x86的寄存器組8086的存儲(chǔ)器組織2.1計(jì)算機(jī)基本結(jié)構(gòu)

中央處理機(jī)

CPU總線控制邏輯接口接口存儲(chǔ)器大容量存儲(chǔ)器I/O設(shè)備I/O子系統(tǒng)系統(tǒng)總線組成:算術(shù)邏輯部件、控制部件和寄存器組。

CPU的作用:執(zhí)行算術(shù)與邏輯運(yùn)算??刂浦噶畹膱?zhí)行。編程結(jié)構(gòu):對(duì)匯編語言程序員來說,關(guān)心的是其中的寄存器。CPU總線是部件之間進(jìn)行數(shù)據(jù)(電信號(hào))交換的通道。

80x86計(jì)算機(jī)的系統(tǒng)總線分為3類:數(shù)據(jù)總線地址總線控制總線系統(tǒng)總線數(shù)據(jù)總線數(shù)據(jù)總線是用來傳遞數(shù)據(jù)的,定義了CPU在每個(gè)內(nèi)存周期所能存取數(shù)據(jù)的位數(shù)。

80x86系列CPU的數(shù)據(jù)總線為8位、16位、32位或64位。這就是“為什么通常的數(shù)據(jù)存取是以8位、16位、32位或64位進(jìn)行的”。數(shù)據(jù)總線越寬,處理能力越強(qiáng)。具有N位數(shù)據(jù)總線并不意味著CPU只能處理N位數(shù)據(jù)。系統(tǒng)總線地址總線地址總線用來指出數(shù)據(jù)的地址(內(nèi)存或I/O)。地址總線的位數(shù)決定了最大可編址的內(nèi)存與I/O空間。對(duì)于N位地址總線,CPU可以提供2N個(gè)不同地址:0~2N-1。地址總線由內(nèi)存與I/O子系統(tǒng)共享使用(I/O只用低16位)。(如何區(qū)分?)控制總線控制總線用來控制CPU與內(nèi)存和I/O設(shè)備之間的數(shù)據(jù)傳送方式(如傳送方向)。系統(tǒng)總線內(nèi)存是存放指令和數(shù)據(jù)的部件,由若干內(nèi)存單元構(gòu)成。80x86的內(nèi)存以字節(jié)編址:每個(gè)內(nèi)存單元有唯一的地址,可存放1個(gè)字節(jié)。內(nèi)存單元的2個(gè)要素:地址(編號(hào))與值(內(nèi)容)。(100H)=34H1個(gè)字占據(jù)2個(gè)相鄰的內(nèi)存單元;低字節(jié)在低地址單元,高字節(jié)在高地址單元;字的地址由其低地址來表示。雙字也類似。同一地址可以看作是字節(jié)、字或雙字單元的地址。(?)內(nèi)存I/O子系統(tǒng)通過接口電路與微機(jī)系統(tǒng)連接I/O接口由若干寄存器組成:數(shù)據(jù)寄存器、狀態(tài)寄存器、命令寄存器I/O端口:即I/O地址,是區(qū)分I/O設(shè)備及其寄存器的編號(hào)。匯編語言程序員看到的,是端口8086計(jì)算機(jī)采用16位表示I/O端口I/O端口與內(nèi)存地址如何區(qū)分?I/O子系統(tǒng)

2.280x86的寄存器組8086/8088中共有14個(gè)16位寄存器寄存器在CPU內(nèi)部,所以訪問速度快。但容量小外存內(nèi)存寄存器CPU寄存器與存儲(chǔ)器的比較:

寄存器存儲(chǔ)器

在CPU內(nèi)部在CPU外部訪問速度快訪問速度慢容量小,成本高容量大,成本低用名字表示用地址表示沒有地址地址可用各種方式形成專用寄存器數(shù)據(jù)寄存器:AX/BX/CX/DX存放任何數(shù)據(jù)信息。暫存計(jì)算的中間結(jié)果,數(shù)據(jù)中轉(zhuǎn)站。每個(gè)寄存器又有它們各自的專用目的:AX(Accumulator)——累加器,使用頻度最高,用于算術(shù)、邏輯運(yùn)算以及與外設(shè)傳送信息等;BX(Base)——基址寄存器,常用做存放存儲(chǔ)器地址;CX(Count)——計(jì)數(shù)器,作為循環(huán)和串操作等指令中的隱含計(jì)數(shù)器;DX(Data)——數(shù)據(jù)寄存器,常用來存放雙字長(zhǎng)數(shù)據(jù)的高16位,或存放外設(shè)端口地址。16位一分為二AHALAXBHBLBXCHCLCXDHDLDXAX=1234HAH=12HAL=34HAX=CDABHAH=CDHAL=ABH80386及其后繼:EAX,EBX,ECX,EDXEAX=12345678HAX=5678HAH=56HAL=78HAXAHALEAXBXBHBLEBXCHCLECXDHDLEDXCXDX變址寄存器:SI/DI變址寄存器常用于存儲(chǔ)器尋址時(shí)提供地址串操作類指令中,SI(SourceIndex)是源變址寄存器串操作類指令中,DI(DestinationIndex)是目的變址寄存器16位,不可拆分使用80386及其后繼:ESI,EDI指針寄存器:SP/BP指針寄存器用于尋址內(nèi)存堆棧內(nèi)的數(shù)據(jù)SP(StackPointer)為堆棧指針寄存器,指示棧頂?shù)钠频刂稴P不能再用于其他目的,具有專用目的BP(BasePointer)為基址指針寄存器,表示數(shù)據(jù)在堆棧段中的基地址SP和BP寄存器與SS段寄存器聯(lián)合使用以確定堆棧段中的存儲(chǔ)單元地址80386及其后繼:ESP,EBP段寄存器:CS/DS/SS/ES8086CPU的4個(gè)16位的段寄存器代碼段寄存器CS(CodeSegment)數(shù)據(jù)段寄存器DS(DataSegment)堆棧段寄存器SS(StackSegment)附加數(shù)據(jù)段寄存器ES(ExtraSegment)段寄存器用來確定該段在內(nèi)存中的起始地址。用途特定,不可分開使用。80386及其后繼:FSGSIP(InstructionPointer)指令指針寄存器IP,指示代碼段中指令的偏移地址它與代碼段寄存器CS聯(lián)用,確定下一條指令的物理地址計(jì)算機(jī)通過CS:IP寄存器來控制指令序列的執(zhí)行流程IP寄存器是一個(gè)專用寄存器,程序一般不可直接使用該寄存器。80386及其后繼:EIP標(biāo)志寄存器用途:標(biāo)志寄存器F(FLAGS),又稱程序狀態(tài)字寄存器PSW,是用以記錄或存放狀態(tài)標(biāo)志和控制標(biāo)志信息的。狀態(tài)標(biāo)志位——用以記錄當(dāng)前運(yùn)算結(jié)果的狀態(tài)信息控制標(biāo)志位——用以存放控制CPU工作方式的標(biāo)志信息。80386及其后繼:FLAGS控制標(biāo)志位

方向標(biāo)志DF中斷允許標(biāo)志IF追蹤標(biāo)志TF為什么要標(biāo)志寄存器?Why狀態(tài)標(biāo)志位?一般只需要計(jì)算結(jié)果結(jié)果特征有時(shí)更重要Why控制標(biāo)志位改變CPU工作方式標(biāo)志寄存器設(shè)置狀態(tài)標(biāo)志位的設(shè)置是由CPU根據(jù)當(dāng)前程序運(yùn)行結(jié)果的狀態(tài)自動(dòng)完成的。狀態(tài)標(biāo)志位信息一般用作轉(zhuǎn)移指令的轉(zhuǎn)移控制條件。控制標(biāo)志位由程序設(shè)置,控制CPU的工作方式進(jìn)位標(biāo)志CF(CarryFlag)當(dāng)運(yùn)算結(jié)果的最高有效位有進(jìn)位(加法)或借位(減法)時(shí),進(jìn)位標(biāo)志置1,即CF=1;否則CF=0。例如:3AH+7CH=B6H沒有進(jìn)位:CF=0AAH+7CH=(1)26H有進(jìn)位:CF=1零標(biāo)志ZF(ZeroFlag)若運(yùn)算結(jié)果為0,則ZF=1,否則ZF=0例如:3AH+7CH=B6H,結(jié)果不是零:ZF=086H+7AH=(1)00H,結(jié)果是零(為什么?):ZF=1注意:ZF為1表示的結(jié)果是0符號(hào)標(biāo)志SF(SignFlag)有符號(hào)數(shù)據(jù)利用最高有效位表示數(shù)據(jù)的符號(hào)。所以,最高有效位就是符號(hào)標(biāo)志的狀態(tài)。運(yùn)算結(jié)果最高位為1,則SF=1;否則SF=0。例如:3AH+7CH=B6H,最高位D7=1:SF=186H+7AH=(1)00H,最高位D7=0:SF=0奇偶標(biāo)志PF(ParityFlag)當(dāng)運(yùn)算結(jié)果最低字節(jié)中“1”的個(gè)數(shù)為偶數(shù)時(shí),PF=1;否則PF=0。例如:3AH+7CH=B6H=10110110B,結(jié)果中有5個(gè)1,是奇數(shù):PF=0注意:PF標(biāo)志僅反映最低8位中“1”的個(gè)數(shù)是偶或奇,即使是進(jìn)行16位字操作。輔助進(jìn)位標(biāo)志AF(AuxiliaryCarryFlag)運(yùn)算時(shí)D3位(低半字節(jié))有進(jìn)位或借位時(shí),AF=1;否則AF=0。例如:3AH+7CH=B6HD3有進(jìn)位:AF=1這個(gè)標(biāo)志主要由處理器內(nèi)部使用,用于十進(jìn)制算術(shù)運(yùn)算指令中,用戶一般不必關(guān)心。(類似于進(jìn)位標(biāo)志)溢出標(biāo)志OF(OverflowFlag)若算術(shù)運(yùn)算的結(jié)果有溢出,則OF=1;否則OF=0。只是對(duì)有符號(hào)數(shù)而言。對(duì)無符號(hào)數(shù)而言,OF=1并不意味著結(jié)果出錯(cuò)。

80H-01H=7FH=127,OF=1對(duì)于無符號(hào)數(shù)而言,128-1=127,正確對(duì)于無符號(hào)數(shù)而言,-128-1=127,錯(cuò)誤什么是溢出處理器內(nèi)部以補(bǔ)碼表示有符號(hào)數(shù)8個(gè)二進(jìn)制位能夠表達(dá)的整數(shù)范圍是:+127~-12816位表達(dá)的范圍是:+32767~-32768如果運(yùn)算結(jié)果超出了這個(gè)范圍,就是產(chǎn)生了溢出有溢出,說明有符號(hào)數(shù)的運(yùn)算結(jié)果不正確無符號(hào)數(shù)有溢出嗎?FFH+01H=00H,CF=1,進(jìn)位溢出溢出的判斷方法一(CPU):如果最高位與次高位同時(shí)向前有或無進(jìn)/借位,則OF=0;(?)如果最高位與次高位不同時(shí)向前有或無進(jìn)/借位,則OF=1;方法二:兩個(gè)正補(bǔ)碼數(shù)相加結(jié)果為負(fù)兩個(gè)負(fù)補(bǔ)碼數(shù)相加結(jié)果為正正補(bǔ)碼數(shù)-負(fù)補(bǔ)碼數(shù)為負(fù)負(fù)補(bǔ)碼數(shù)-正補(bǔ)碼數(shù)為正其他情況OF=1OF=0溢出和進(jìn)位溢出標(biāo)志OF和進(jìn)位標(biāo)志CF是兩個(gè)意義不同的標(biāo)志進(jìn)位標(biāo)志表示無符號(hào)數(shù)運(yùn)算結(jié)果是否超出范圍,運(yùn)算結(jié)果仍然正確;可恢復(fù)的錯(cuò)誤。溢出標(biāo)志表示有符號(hào)數(shù)運(yùn)算結(jié)果是否超出范圍,運(yùn)算結(jié)果已經(jīng)不正確。不可恢復(fù)錯(cuò)誤。溢出和進(jìn)位的對(duì)比例1:7FH+01H=80H無符號(hào)數(shù)運(yùn)算:127+1=128,范圍內(nèi),無進(jìn)位有符號(hào)數(shù)運(yùn)算:127+1=128,范圍外,有溢出例2:FFH+01H=(1)00H無符號(hào)數(shù)運(yùn)算:255+1=256,范圍外,有進(jìn)位有符號(hào)數(shù)運(yùn)算:-1+1=0,范圍內(nèi),無溢出如何運(yùn)用溢出和進(jìn)位處理器對(duì)兩個(gè)操作數(shù)進(jìn)行運(yùn)算時(shí),并不知道操作數(shù)是有符號(hào)數(shù)還是無符號(hào)數(shù),所以全部設(shè)置,按各自規(guī)則。應(yīng)該利用哪個(gè)標(biāo)志,則由程序員來決定。將參加運(yùn)算的操作數(shù)是無符號(hào)數(shù),就應(yīng)該關(guān)心CF;將參加運(yùn)算的操作數(shù)是有符號(hào)數(shù),則要注意是否溢出。我怎么知道是什么數(shù)?除了你沒人知道,例:

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=0方向標(biāo)志DF(DirectionFlag)用于串操作指令中,控制地址的變化方向:設(shè)置DF=0,串操作的存儲(chǔ)器地址自動(dòng)增加;設(shè)置DF=1,串操作的存儲(chǔ)器地址自動(dòng)減少。中斷允許標(biāo)志IF(Interrupt-enableFlag)用于控制外部可屏蔽中斷是否可以被處理器響應(yīng):設(shè)置IF=1,則允許中斷;設(shè)置IF=0,則禁止中斷。陷阱標(biāo)志TF(TrapFlag)用于控制處理器是否進(jìn)入單步操作方式:設(shè)置TF=0,處理器正常工作;設(shè)置TF=1,處理器單步執(zhí)行指令。單步執(zhí)行指令——處理器在每條指令執(zhí)行結(jié)束時(shí),便產(chǎn)生一個(gè)編號(hào)為1的內(nèi)部中斷。這種內(nèi)部中斷稱為單步中斷,所以TF也稱為單步標(biāo)志。利用單步中斷可對(duì)程序進(jìn)行逐條指令的調(diào)試。這種逐條指令調(diào)試程序的方法就是單步調(diào)試。2.38086存儲(chǔ)器組織

分段技術(shù)地址形成方式分段技術(shù)Why?矛盾:AB20位≮≯

DB16位地址:20位≮≯地址Register:16位How?用兩個(gè)16位Register方案?方案用兩個(gè)16位Register1616+20分段管理將存儲(chǔ)器分成若干個(gè)邏輯段段首地址必須為:****0H。其有效地址“****H”存放在段寄存器中,稱為段地址。段中某一個(gè)單元相對(duì)于段首的距離稱為偏移地址,偏移地址存放在偏移地址寄存器中。段的長(zhǎng)度不超過216=64K。(僅能訪問4*64K?)對(duì)比物理地址=16×段地址+偏移地址1616+200000段地址偏移地址物理地址段首地址地址概念物理地址20位,20位地址總線上產(chǎn)生的唯一的地址。邏輯地址--程序指令中引用和操作的地址段地址:16位,段首地址的有效地址偏移地址:段中某一個(gè)單元相對(duì)于段首的距離,16位4個(gè)專門存放段地址的段寄存器(16位)代碼段段寄存器CS數(shù)據(jù)段段寄存器DS堆棧段段寄存器SS附加段段寄存器ES例:(DS)=3000H,偏移=1234H,

物理地址=16d(DS)+偏移

=31234H存儲(chǔ)器

8K代碼

2K數(shù)據(jù)

256堆棧02000H04800H04000H0200H0400H0480H邏輯段CPU形成物理地址的過程ALU完成加法,地址加法器段地址一般在程序開始時(shí)預(yù)定訪問某一個(gè)內(nèi)存單元,程序中只需要給出16位偏移地址CPU幾種典型的操作取指令:指令單元地址=(CS)×10H+I(xiàn)P堆棧操作:堆棧數(shù)據(jù)地址=(SS)×10H+偏移內(nèi)存數(shù)據(jù):內(nèi)存數(shù)據(jù)地址=(DS)×10H+偏移§38086尋址方式8086機(jī)器碼格式指令格式尋址方式3.18086機(jī)器碼格式機(jī)器碼格式:是將指令以2進(jìn)制數(shù)0和1進(jìn)行編碼的形式操作碼說明計(jì)算機(jī)要執(zhí)行哪種操作,ModRegR/M

:表明尋找操作數(shù)的方式。操作碼位移量立即數(shù)ModRegR/M3.2指令格式指令的一般格式操作碼說明計(jì)算機(jī)要執(zhí)行哪種操作,它是指令中不可缺少的組成部分操作數(shù)是指令執(zhí)行的參與者,即各種操作的對(duì)象,為數(shù)據(jù)及數(shù)據(jù)所在地址。操作碼操作數(shù)1操作數(shù)2操作碼操作數(shù)1操作數(shù)2【;注釋】【標(biāo)號(hào):】3.2指令格式操作數(shù)的形式立即操作數(shù):指令的操作數(shù)是立即數(shù)(常量),只能是源操作數(shù)。寄存器操作數(shù):操作數(shù)存放在寄存器中值,指令中使用寄存器名。內(nèi)存操作數(shù):操作數(shù)存放在內(nèi)存中,指令中給出內(nèi)存地址,通常為有效地址EA,段地址在某個(gè)段寄存器中。3.38086尋址方式立即尋址方式寄存器尋址方式內(nèi)存操作數(shù)尋址方式1.立即尋址方式(immediateaddressing)操作數(shù)在指令中給出,作為指令機(jī)器碼的一部分存儲(chǔ)

MOVAL,34H;機(jī)器碼:B034MOVAX,0034H;機(jī)器碼:B83400使用場(chǎng)合:常數(shù),8位和16位。注意:只能用于源操作數(shù)2.寄存器尋址方式(registeraddressing)操作數(shù)在指定的數(shù)據(jù)寄存器中

MOVAX,BXMOVAL,BH注意:無FS和GSCS/IP不能用作目的操作數(shù):MOVCS/IP,AX(X)3.內(nèi)存操作數(shù)尋址方式直接尋址方式(directaddressing)寄存器間接尋址方式(registerindirect)寄存器相對(duì)尋址方式(registerrelative)基址變址尋址方式(basedindexed..)相對(duì)基址變址方式(relativebasedindexed..)直接尋址方式(directaddressing)內(nèi)存操作數(shù)的偏移地址由指令直接給出

MOVAX,[2000H] MOVWORDPTR[1000H],-1MOVAX,Y注意:隱含的段為數(shù)據(jù)段DS物理地址

=16*(DS)+偏移地址…………1000H1001HAX3412AHAL比較比較1MOVAL,[1000H]AL=34H;MOVAX,[1000H]AX=1234H比較2MOVAX,1000HAX=1000H;MOVAX,[1000H]AX=1234H1234

寄存器間接尋址方式(registerindirect)指定某個(gè)地址寄存器(SI、DI、BX、BP)的內(nèi)容作為內(nèi)存操作數(shù)的偏移地址

MOVAX,[BX] MOV[BP],AL使用場(chǎng)合:表格、字符串、緩沖區(qū)處理注意:段地址規(guī)則BX,SI,DI(DS)BP

溫馨提示

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