匯編語言尋址方式及堆棧.ppt
8086匯編語言程序設(shè)計,1,尋址方式的概念和基本分類;7種尋址方式及“兩對”尋址方式的區(qū)別;尋址方式與常量、變量和指針的關(guān)系;堆棧概念、結(jié)構(gòu)元素和操作指令。,本章要點,8086匯編語言程序設(shè)計,2,CPU訪問內(nèi)存的兩個目的:讀取指令;存取數(shù)據(jù)。CPU訪問內(nèi)存的三種方式:控制器自動取指循環(huán);程序控制方式訪問數(shù)據(jù)段;堆棧方式。,第三章尋址方式及堆棧,8086匯編語言程序設(shè)計,3,一條匯編指令語句包含操作碼和操作數(shù)兩種信息,有些像自然文字的謂語和賓語:操作碼字段為指令,描述語句的功能;操作數(shù)字段描述操作數(shù)或操作數(shù)的來源和去向;CPU獲得操作數(shù)的方式叫作尋址方式。,3.1尋址方式,8086匯編語言程序設(shè)計,4,三類尋址方式的特點:寄存器尋址:存取數(shù)據(jù)在CPU內(nèi)部進(jìn)行,故速度最快;寄存器數(shù)量很少,尋址方式簡單;存儲器尋址:為便于組織串、數(shù)組等數(shù)據(jù)結(jié)構(gòu)復(fù)雜的數(shù)據(jù)處理,必須有更靈活、也就相對復(fù)雜的尋址方式,是本節(jié)的重點;I/O端口尋址:I/O端口的任務(wù)是實現(xiàn)計算機核心和外界的數(shù)據(jù)交換,故尋址方式也相對簡單。,8086匯編語言程序設(shè)計,5,3.1.1寄存器尋址當(dāng)需要處理寄存器中的數(shù)據(jù)或?qū)⑻幚斫Y(jié)果存入寄存器的時,使用“寄存器尋址”;在匯編語言中直接以寄存器名對寄存器尋址:MOVDS,AX意即將AX的內(nèi)容送入數(shù)據(jù)段寄存器DS。,8086匯編語言程序設(shè)計,6,8086匯編語言程序設(shè)計,7,3.1.2立即數(shù)尋址先看一例子:MOVAX,201H這條指令將16進(jìn)制數(shù)201送入寄存器AX。存放結(jié)果的AX的尋址方式是“寄存器尋址”,而后面的201H是一個常數(shù),它是隨指令從代碼段來的。由于這類操作數(shù)就在指令中,“立即”可以參與運算,故稱作“立即數(shù)尋址方式”。因立即數(shù)伴隨指令在代碼段中,所以這種尋址也應(yīng)屬存儲器尋址。,8086匯編語言程序設(shè)計,8,8086匯編語言程序設(shè)計,9,3.1.3存儲器尋址存儲器尋址必然涉及段,即最終要以邏輯地址段基址:偏移量形成物理地址。由于在大多數(shù)使用場合地址指針的段基址是“現(xiàn)成的”和隱含的,所以本小節(jié)討論的重點是“有效地址”偏移量的問題。偏移量是某存儲單元和段基址間的距離,又被稱作有效地址。,8086匯編語言程序設(shè)計,10,偏移量或有效地址的形成:偏移量位移量基地址變址量上述三個分量的不同組合,演繹出存儲器尋址的各種方式。直接尋址是在指令中直接給出操作數(shù)地址偏移量的尋址方式。比如把200H單元的內(nèi)容送入AL:MOVAL,200H,8086匯編語言程序設(shè)計,11,8086匯編語言程序設(shè)計,12,注意直接尋址和立即數(shù)尋址方式區(qū)別:方括號里的數(shù)字是操作數(shù)的有效地址,200H表示該單元的內(nèi)容。顯然,直接尋址方式是非常直觀的存儲器尋址方式,但不方便處理整塊的數(shù)據(jù)。寄存器間接尋址寄存器的內(nèi)容是某存儲單元的有效地址,以這種方式尋址就叫作寄存器間接尋址。,8086匯編語言程序設(shè)計,13,如要將200H單元的內(nèi)容送入AL,使用寄存器間接尋址需要這樣:MOVBX,200HMOVAL,BX所謂“間接”就是操作數(shù)的取得是通過寄存器間接獲得的。應(yīng)注意寄存器間接尋址方式和寄存器尋址相區(qū)別:后者在意的目標(biāo)的是寄存器的內(nèi)容,而前者是寄存器的內(nèi)容作為偏移量的存儲單元的內(nèi)容。,8086匯編語言程序設(shè)計,14,8086匯編語言程序設(shè)計,15,兩者的書寫形式也不同,寄存器間接尋址時將用作間接尋址的寄存器用方括號括起來。能用作存儲器間接尋址的有下述地址指針寄存器:BX,SI,DI,BP顯然,連續(xù)將上述寄存器的內(nèi)容增一或減一,可方面地處理數(shù)據(jù)塊,如處理一維數(shù)據(jù)或字符串,高精度數(shù)字運算等??蓞⑴c存儲器尋址的寄存器又被成為“地址指針寄存器”,具備“準(zhǔn)指針”的功能。,8086匯編語言程序設(shè)計,16,變址尋址和基址尋址(寄存器相對尋址)某地址指針寄存器的內(nèi)容和指令中給出的位移量之和形成有效地址的尋址方式。它是直接尋址方式和寄存器間接尋址方式的一種組合,請看例子:MOVAL,BX+20HADDAL,10SI指令中10SI和SI+10是等價的。,8086匯編語言程序設(shè)計,17,8086匯編語言程序設(shè)計,18,和寄存器間接尋址方式相比,地址指針寄存器的內(nèi)容可以從開始,這樣地址指針寄存器可以兼作計數(shù)器。至于“變址尋址”和“基址尋址”的差異只涉及使用地址指針寄存器的不同,在編程應(yīng)用上沒有區(qū)別,故這兩種尋址方式又統(tǒng)稱為“寄存器相對尋址”。,8086匯編語言程序設(shè)計,19,相對基址變址尋址有效地址是基址寄存器的內(nèi)容、變址寄存器的內(nèi)容和指令中給出的位移量之和,如:MOVAL,20HBXSIMOVAH,80BSDIMOVDX,100HBXDI20HBXSI也可以寫成20H+BX+SI。這種尋址方式能比較方便地處理二維數(shù)組等更復(fù)雜的結(jié)構(gòu)數(shù)據(jù)。,8086匯編語言程序設(shè)計,20,8086匯編語言程序設(shè)計,21,由于基于BP的基址變址尋址的隱含段寄存器是堆棧段SS,所以在數(shù)據(jù)段的這種尋址方式常是BX分別和SI和DI配合??梢哉J(rèn)為相對基址變址尋址方式是最一般的尋址方式,其他尋址方式都可以看作是基址變址尋址方式的特例。比如:MOVAL,100H+BX+SI去掉其中任一個或二個分量就會是某種其他尋址方式。,8086匯編語言程序設(shè)計,22,3.1.4尋址方式與常量、變量及“準(zhǔn)指針”立即數(shù)尋址方式對應(yīng)匯編語言的常量;存儲器尋址方式對應(yīng)匯編語言的變量;在各種地址指針寄存器參與的存儲器尋址方式中,地址指針寄存器充當(dāng)“準(zhǔn)指針”的角色。串操作尋址和I/O尋址以后介紹。,8086匯編語言程序設(shè)計,23,物理地址、段、邏輯地址和尋址方式小結(jié):物理地址是地址信號和譯碼邏輯對存儲單元的唯一指定,本質(zhì)上是組合邏輯電路的一種應(yīng)用:,8086匯編語言程序設(shè)計,24,8088/8086尋址(或管理)1M的存儲空間是通過段來實現(xiàn)的:段寄存器的內(nèi)容存放和提供段基址的高16位,用于指定低四位為零的存儲單元作為段的起點;16位段內(nèi)偏移量確定段內(nèi)具體單元,段內(nèi)管理64K的存儲空間;段寄存器的內(nèi)容即段基址的高16位和段內(nèi)偏移量合稱為邏輯地址:段基址的高16位:段內(nèi)偏移量,8086匯編語言程序設(shè)計,25,8088/8086CPU按代碼段、數(shù)據(jù)段、堆棧段、附加段對內(nèi)存進(jìn)行分類管理:代碼段:CS:IP;堆棧段:SS:SP;數(shù)據(jù)段:DS:位移量基址量變址量,8086匯編語言程序設(shè)計,26,尋址方式寄存器尋址方式(訪問CPU完成數(shù)據(jù)處理的接口,按“直呼其名”的方式進(jìn)行);立即數(shù)尋址方式(伴隨指令序列來自于代碼段的常量);數(shù)據(jù)段尋址是三種偏移分量的組合:位移量基址量變址量,8086匯編語言程序設(shè)計,27,尋址方式與常量、變量及指針的關(guān)系:立即數(shù)尋址方式對應(yīng)匯編語言的常量;存儲器尋址方式對應(yīng)匯編語言的變量;在各種地址指針寄存器參與的存儲器尋址方式中,地址指針寄存器充當(dāng)“準(zhǔn)指針”的角色。,8086匯編語言程序設(shè)計,28,堆棧是由CPU控制的按“后進(jìn)先出”順序存取數(shù)據(jù)的存儲結(jié)構(gòu),用于暫存子程序調(diào)用、中斷斷點的信息和數(shù)據(jù)。堆棧的用途在這里只作一點說明,只有在學(xué)習(xí)了子程序調(diào)用、中斷斷點的保護(hù)等才會知道為什么要使用堆棧這種特殊的存儲結(jié)構(gòu)。本節(jié)的重點是:堆棧的結(jié)構(gòu)元素和操作指令。,3.2堆棧,8086匯編語言程序設(shè)計,29,3.2.1堆棧的構(gòu)造,8086匯編語言程序設(shè)計,30,堆棧是在存儲器中劃出的一個部分;地址最高的字單元叫作“棧底(Bottom)”;入棧的數(shù)據(jù)從棧底開始逐個向地址低端存入;用堆棧指針SP指向最后入棧的數(shù)據(jù),習(xí)慣上把SP所指的位置叫作“棧頂(Top)”;數(shù)據(jù)是按SP的指向出入堆棧,從而實現(xiàn)了“后進(jìn)先出”的存取機制的。,8086匯編語言程序設(shè)計,31,3.2.28086的堆棧堆棧的組織,8086匯編語言程序設(shè)計,32,堆棧是由SS的內(nèi)容為起點的一段存儲區(qū);SP指向棧頂;以字為單位進(jìn)行存??;當(dāng)堆棧初始化或為空時,SP的值是堆棧段的實際長度,SP指向棧底之下的第二個字節(jié);棧的最大空間是64KB,棧的最大深度是32K;入棧的字,低字節(jié)存放在SP所指的單元,高字節(jié)存放在SP+1所指的單元。,8086匯編語言程序設(shè)計,33,0H,堆棧初始化或空時棧頂“低于”棧底的情形,8086匯編語言程序設(shè)計,34,堆棧的操作堆棧的操作都是通過SP在棧頂進(jìn)行的;基本的操作有兩個:壓棧和出棧。壓棧(數(shù)據(jù)入棧)PUSHSCR(SP)2SP;SCR(SP).,8086匯編語言程序設(shè)計,35,出棧(習(xí)慣上又叫彈出)POPDEST(SP)SCR;(SP)+2SP.問題:堆棧操作的尋址方式是什么?,8086匯編語言程序設(shè)計,36,本章小結(jié):尋址方式是本節(jié)的重點。注意區(qū)分:立即數(shù)尋址和直接尋址;寄存器尋址和寄存器間接尋址。堆棧是按“后進(jìn)先出”機制存取數(shù)據(jù)的有特殊功用的存儲器組織;堆棧的結(jié)構(gòu)完全是由SS和SP的初值決定的。,第五章第1、12題,本章習(xí)題,匯編語言教程.chm,本章參考,