王爽匯編語(yǔ)言第二版(全部).ppt
《王爽匯編語(yǔ)言第二版(全部).ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《王爽匯編語(yǔ)言第二版(全部).ppt(1290頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
第1章 基礎(chǔ)知識(shí),1.1 機(jī)器語(yǔ)言 1. 9 數(shù)據(jù)總線 1.2 匯編語(yǔ)言的產(chǎn)生 1.10 控制總線 1.3 匯編語(yǔ)言的組成 1.11 內(nèi)存地址空間(概述) 1.4 存儲(chǔ)器 1.12 主板 1.5 指令和數(shù)據(jù) 1.13 接口卡 1.6 存儲(chǔ)單元 1.14 各類存儲(chǔ)器芯片 1.7 CPU對(duì)存儲(chǔ)器的讀寫 1.15 內(nèi)存地址空間 1.8 地址總線,引言,匯編語(yǔ)言是直接在硬件之上工作的編程語(yǔ)言,首先要了解硬件系統(tǒng)的結(jié)構(gòu),才能有效的應(yīng)用匯編語(yǔ)言對(duì)其編程。 在本章中,對(duì)硬件系統(tǒng)結(jié)構(gòu)的問(wèn)題進(jìn)行一部分的探討,以使后續(xù)的課程可在一個(gè)好的基礎(chǔ)上進(jìn)行。,引言,當(dāng)課程進(jìn)行到需要補(bǔ)充新的基礎(chǔ)知識(shí)(關(guān)于編程結(jié)構(gòu)或其他的)時(shí)候,再對(duì)相關(guān)的基礎(chǔ)知識(shí)進(jìn)行介紹和探討。 本書的原則是,以后用到的知識(shí),以后再說(shuō)。,引言,匯編課程的研究重點(diǎn)放在如何利用硬件系統(tǒng)的編程結(jié)構(gòu)和指令集有效靈活的控制系統(tǒng)進(jìn)行工作。,1.1 機(jī)器語(yǔ)言,機(jī)器語(yǔ)言是機(jī)器指令的集合。 機(jī)器指令展開(kāi)來(lái)講就是一臺(tái)機(jī)器可以正確執(zhí)行的命令。,1.1 機(jī)器語(yǔ)言,指令:01010000 (PUSH AX) 電平脈沖:,1.1 機(jī)器語(yǔ)言,以后我們提到的計(jì)算機(jī)是指由CPU 和其他受CPU 直接或間接控制的芯片、器件、設(shè)備組成的計(jì)算機(jī)系統(tǒng); 比如我們最常見(jiàn)的PC 機(jī)。,1.1 機(jī)器語(yǔ)言,程序員們將 0、1 數(shù)字編程的程序代碼打在紙帶或卡片上,1打孔,0不打孔,再將程序通過(guò)紙帶機(jī)或卡片機(jī)輸入計(jì)算機(jī),進(jìn)行運(yùn)算。 示例 應(yīng)用8086CPU完成運(yùn)算: S = 768 + 12288 – 1280,1.1 機(jī)器語(yǔ)言,S = 768 + 12288 - 1280 機(jī)器碼: 101100000000000000000011 000001010000000000110000 001011010000000000000101 假如將程序錯(cuò)寫成以下這樣,請(qǐng)找處錯(cuò)誤: 101100000000000000000011 000001010000000000110000 000101101000000000000101,1.1 機(jī)器語(yǔ)言,在顯示器上輸出“welcome to masm”。 機(jī)器碼 看到這樣的程序,你會(huì)有什么感想? 如果程序里有一個(gè)“ 1 ”被誤寫為“ 0 ”,又如何去查找呢?,1.2 匯編語(yǔ)言的產(chǎn)生,匯編語(yǔ)言的主體是匯編指令。 匯編指令和機(jī)器指令的差別在于指令的表示方法上。匯編指令是機(jī)器指令便于記憶的書寫格式。 匯編指令是機(jī)器指令的助記符。,1.2 匯編語(yǔ)言的產(chǎn)生,機(jī)器指令: 1000100111011000 操作:寄存器BX的內(nèi)容送到AX中 匯編指令:MOV AX,BX 這樣的寫法與人類語(yǔ)言接近,便于閱讀和記憶。,寄存器,寄存器:簡(jiǎn)單的講是CPU中可以存儲(chǔ)數(shù)據(jù)的器件,一個(gè)CPU中有多個(gè)寄存器。 AX是其中一個(gè)寄存器的代號(hào), BX是另一個(gè)寄存器的代號(hào)。 更詳細(xì)的內(nèi)容我們?cè)谝院蟮恼n程中將會(huì)講到。,,1.2 匯編語(yǔ)言的產(chǎn)生,計(jì)算機(jī)能讀懂的只有機(jī)器指令,那么如何讓計(jì)算機(jī)執(zhí)行程序員用匯編指令編寫的程序呢?,用匯編語(yǔ)言編寫程序的工作過(guò)程,1.3 匯編語(yǔ)言的組成,匯編語(yǔ)言由以下3類組成: 1、匯編指令(機(jī)器碼的助記符) 2、偽指令 (由編譯器執(zhí)行) 3、其它符號(hào)(由編譯器識(shí)別) 匯編語(yǔ)言的核心是匯編指令,它決定了匯編語(yǔ)言的特性。,1.4 存儲(chǔ)器,CPU 是計(jì)算機(jī)的核心部件.它控制整個(gè)計(jì)算機(jī)的運(yùn)作并進(jìn)行運(yùn)算,要想讓一個(gè)CPU 工作,就必須向它提供指令和數(shù)據(jù)。 指令和數(shù)據(jù)在存儲(chǔ)器中存放,也就是平時(shí)所說(shuō)的內(nèi)存。,1.4 存儲(chǔ)器,在一臺(tái)PC機(jī)中內(nèi)存的作用僅次于CPU。 離開(kāi)了內(nèi)存,性能再好的CPU也無(wú)法工作。,1.4 存儲(chǔ)器,磁盤不同于內(nèi)存,磁盤上的數(shù)據(jù)或程序如果不讀到內(nèi)存中,就無(wú)法被CPU 使用。,1.5 指令和數(shù)據(jù),指令和數(shù)據(jù)是應(yīng)用上的概念。 在內(nèi)存或磁盤上,指令和數(shù)據(jù)沒(méi)有任何區(qū)別,都是二進(jìn)制信息。,1.5 指令和數(shù)據(jù),二進(jìn)制信息: 1000100111011000 ─ 89D8H (數(shù)據(jù)) 1000100111011000 ─ MOV AX,BX (程序),1.6 存儲(chǔ)單元,存儲(chǔ)器被劃分為若干個(gè)存儲(chǔ)單元,每個(gè)存儲(chǔ)單元從0開(kāi)始順序編號(hào); 例如: 一個(gè)存儲(chǔ)器有128個(gè)存儲(chǔ)單元, 編號(hào)從0~127。 如右圖示:,1.6 存儲(chǔ)單元,對(duì)于大容量的存儲(chǔ)器一般還用以下單位來(lái)計(jì)量容量(以下用B來(lái)代表Byte): 1KB=1024B 1MB=1024KB 1GB=1024MB 1TB=1024GB 磁盤的容量單位同內(nèi)存的一樣,實(shí)際上以上單位是微機(jī)中常用的計(jì)量單位。,1.7 CPU對(duì)存儲(chǔ)器的讀寫,CPU要想進(jìn)行數(shù)據(jù)的讀寫,必須和外部器件(標(biāo)準(zhǔn)的說(shuō)法是芯片)進(jìn)行三類信息的交互: 存儲(chǔ)單元的地址(地址信息) 器件的選擇,讀或?qū)懨睿刂菩畔ⅲ?讀或?qū)懙臄?shù)據(jù)(數(shù)據(jù)信息),1.7 CPU對(duì)存儲(chǔ)器的讀寫,那么CPU是通過(guò)什么將地址、數(shù)據(jù)和控制信息傳到存儲(chǔ)芯片中的呢? 電子計(jì)算機(jī)能處理、傳輸?shù)男畔⒍际请娦盘?hào),電信號(hào)當(dāng)然要用導(dǎo)線傳送。,1.7 CPU對(duì)存儲(chǔ)器的讀寫,在計(jì)算機(jī)中專門有連接CPU和其他芯片的導(dǎo)線,通常稱為總線。 物理上:一根根導(dǎo)線的集合; 邏輯上劃分為: 地址總線 數(shù)據(jù)總線 控制總線 圖示,1.7 CPU對(duì)存儲(chǔ)器的讀寫,總線在邏輯上劃分的圖示:,1.7 CPU對(duì)存儲(chǔ)器的讀寫,CPU在內(nèi)存中讀或?qū)懙臄?shù)據(jù)演示: 讀演示 寫演示 從上面我們知道CPU是如何進(jìn)行數(shù)據(jù)讀寫的??墒俏覀?nèi)绾蚊钣?jì)算機(jī)進(jìn)行數(shù)據(jù)的讀寫呢?,1.7 CPU對(duì)存儲(chǔ)器的讀寫,,,1.7 CPU對(duì)存儲(chǔ)器的讀寫,,,1.7 CPU對(duì)存儲(chǔ)器的讀寫,對(duì)于8086CPU,下面的機(jī)器碼能夠完成從3號(hào)單元讀數(shù)據(jù): 機(jī)器碼: 101000000000001100000000 含義:從3號(hào)單元讀取數(shù)據(jù)送入寄存器AX CPU接收這條機(jī)器碼后將完成上面所述的讀寫工作。,1.7 CPU對(duì)存儲(chǔ)器的讀寫,機(jī)器碼難于記憶,用匯編指令來(lái)表示,情況如下: 機(jī)器碼:101000000000001100000000 對(duì)應(yīng)的匯編指令:MOV AX,[3] 含義:傳送3號(hào)單元的內(nèi)容到AX,1.8 地址總線,CPU是通過(guò)地址總線來(lái)指定存儲(chǔ)單元的。 地址總線上能傳送多少個(gè)不同的信息,CPU就可以對(duì)多少個(gè)存儲(chǔ)單元進(jìn)行尋址。,1.8 地址總線,地址總線發(fā)送地址信息演示,1.8 地址總線,1.8 地址總線,一個(gè)CPU有N根地址總線,則可以說(shuō)這個(gè)CPU的地址總線的寬度為N。 這樣的CPU最多可以尋找2的N次方個(gè)內(nèi)存單元。,1.9 數(shù)據(jù)總線,CPU與內(nèi)存或其它器件之間的數(shù)據(jù)傳送是通過(guò)數(shù)據(jù)總線來(lái)進(jìn)行的。 數(shù)據(jù)總線的寬度決定了CPU和外界的數(shù)據(jù)傳送速度。,1.9 數(shù)據(jù)總線,我們來(lái)分別看一下它們向內(nèi)存中寫入數(shù)據(jù)89D8H時(shí),是如何通過(guò)數(shù)據(jù)總線傳送數(shù)據(jù)的: 8088CPU數(shù)據(jù)總線上的數(shù)據(jù)傳送情況 8086CPU數(shù)據(jù)總線上的數(shù)據(jù)傳送情況,1.9 數(shù)據(jù)總線,8位數(shù)據(jù)總線上傳送的信息,,1.9 數(shù)據(jù)總線,16位數(shù)據(jù)總線上傳送的信息,,1.10 控制總線,CPU對(duì)外部器件的控制是通過(guò)控制總線來(lái)進(jìn)行的。在這里控制總線是個(gè)總稱,控制總線是一些不同控制線的集合。 有多少根控制總線,就意味著CPU提供了對(duì)外部器件的多少種控制。 所以,控制總線的寬度決定了CPU對(duì)外部器件的控制能力。 控制總線上發(fā)送的控制信息,1.10 控制總線,,,1.10 控制總線,前面所講的內(nèi)存讀或?qū)懨钍怯蓭赘刂凭€綜合發(fā)出的: 其中有一根名為讀信號(hào)輸出控制線負(fù)責(zé)由CPU 向外傳送讀信號(hào),CPU 向該控制線上輸出低電平表示將要讀取數(shù)據(jù); 有一根名為寫信號(hào)輸出控制線負(fù)責(zé)由CPU向外傳送寫信號(hào)。,1.1節(jié)~1.10節(jié) 小結(jié),(1)匯編指令是機(jī)器指令的助記符,同機(jī)器指令一一對(duì)應(yīng)。 (2)每一種CPU都有自己的匯編指令集。,1.1節(jié)~1.10節(jié) 小結(jié),(3)CPU可以直接使用的信息在存儲(chǔ)器中存放。 (4)在存儲(chǔ)器中指令和數(shù)據(jù)沒(méi)有任何區(qū)別,都是二進(jìn)制信息。,1.1節(jié)~1.10節(jié) 小結(jié),(5)存儲(chǔ)單元從零開(kāi)始順序編號(hào)。 (6)一個(gè)存儲(chǔ)單元可以存儲(chǔ) 8 個(gè) bit (用作單位寫成“b”),即 8 位二進(jìn)制數(shù)。 (7)1B = 8b 1KB = 1024B 1MB = 1024KB 1GB = 1024MB,1.1節(jié)~1.10節(jié) 小結(jié)(續(xù)),(8)每一個(gè)CPU芯片都有許多管腳,這些管腳和總線相連。也可以說(shuō),這些管腳引出總線。一個(gè)CPU可以引出三種總線的寬度標(biāo)志了這個(gè)CPU的不同方面的性能: 地址總線的寬度決定了CPU的尋址能力; 數(shù)據(jù)總線的寬度決定了CPU與其它器件進(jìn)行數(shù)據(jù)傳送時(shí)的一次數(shù)據(jù)傳送量; 控制總線寬度決定了CPU對(duì)系統(tǒng)中其它器件的控制能力。,1.1節(jié)~1.10節(jié) 小結(jié)(續(xù)),在匯編課程中,我們從功能的角度介紹了這三類總線,對(duì)實(shí)際的連接情況不做討論。 特別提示,特別提示,檢測(cè)點(diǎn) 1.1(Page 8) 沒(méi)有通過(guò)檢測(cè)點(diǎn)請(qǐng)不要向下學(xué)習(xí)!,1.11 內(nèi)存地址空間(概述),什么是內(nèi)存地址空間呢? 一個(gè)CPU的地址線寬度為10,那么可以尋址1024個(gè)內(nèi)存單元,這1024個(gè)可尋到的內(nèi)存單元就構(gòu)成這個(gè)CPU的內(nèi)存地址空間。下面深入討論。 首先需要介紹兩部分基本知識(shí),主板和接口卡。,1.12 主板,在每一臺(tái)PC機(jī)中,都有一個(gè)主板,主板上有核心器件和一些主要器件。 這些器件通過(guò)總線(地址總線、數(shù)據(jù)總線、控制總線)相連。,1.13 接口卡,計(jì)算機(jī)系統(tǒng)中,所有可用程序控制其工作的設(shè)備,必須受到CPU的控制。 CPU對(duì)外部設(shè)備不能直接控制,如顯示器、音箱、打印機(jī)等。直接控制這些設(shè)備進(jìn)行工作的是插在擴(kuò)展插槽上的接口卡。,1.14 各類存儲(chǔ)器芯片,從讀寫屬性上看分為兩類: 隨機(jī)存儲(chǔ)器(RAM)和只讀存儲(chǔ)器(ROM) 從功能和連接上分類: 隨機(jī)存儲(chǔ)器RAM 裝有BIOS的ROM 接口卡上的RAM PC機(jī)中各類存儲(chǔ)器的邏輯連接情況,1.14 各類存儲(chǔ)器芯片,裝有BIOS的ROM BIOS:Basic Input/Output System,基本輸入輸出系統(tǒng)。 BIOS是由主板和各類接口卡(如:顯卡、網(wǎng)卡等)廠商提供的軟件系統(tǒng),可以通過(guò)它利用該硬件設(shè)備進(jìn)行最基本的輸入輸出。在主板和某些接口卡上插有存儲(chǔ)相應(yīng)BIOS的ROM。,,1.15 內(nèi)存地址空間,上述的那些存儲(chǔ)器在物理上是獨(dú)立的器件。 但是它們?cè)谝韵聝牲c(diǎn)上相同: 1、都和CPU的總線相連。 2、CPU對(duì)它們進(jìn)行讀或?qū)懙臅r(shí)候都通過(guò)控制線發(fā)出內(nèi)存讀寫命令。,1.15 內(nèi)存地址空間,將各各類存儲(chǔ)器看作一個(gè)邏輯存儲(chǔ)器: 所有的物理存儲(chǔ)器被看作一個(gè)由若干存儲(chǔ)單元組成的邏輯存儲(chǔ)器; 每個(gè)物理存儲(chǔ)器在這個(gè)邏輯存儲(chǔ)器中占有一個(gè)地址段,即一段地址空間; CPU在這段地址空間中讀寫數(shù)據(jù),實(shí)際上就是在相對(duì)應(yīng)的物理存儲(chǔ)器中讀寫數(shù)據(jù)。,,,,1.15 內(nèi)存地址空間,假設(shè),上圖中的內(nèi)存空間地址段分配如下: 地址0~7FFFH的32KB空間為主隨機(jī)存儲(chǔ)器的地址空間; 地址8000H~9FFFH的8KB空間為顯存地址空間; 地址A000H~FFFFH的24KB空間為各個(gè)ROM的地址空間。,1.15 內(nèi)存地址空間,不同的計(jì)算機(jī)系統(tǒng)的內(nèi)存地址空間分配情況是不同的。 8086PC機(jī)內(nèi)存地址空間分配的基本情況,8086PC機(jī)的內(nèi)存地址空間分配,1.15 內(nèi)存地址空間,內(nèi)存地址空間: 最終運(yùn)行程序的是CPU,我們用匯編編程的時(shí)候,必須要從CPU角度考慮問(wèn)題。 對(duì)CPU來(lái)講,系統(tǒng)中的所有存儲(chǔ)器中的存儲(chǔ)單元都處于一個(gè)統(tǒng)一的邏輯存儲(chǔ)器中,它的容量受CPU尋址能力的限制。這個(gè)邏輯存儲(chǔ)器即是我們所說(shuō)的內(nèi)存地址空間。,小結(jié),《匯編語(yǔ)言》課件,王爽 著-清華大學(xué)出版社,制作工具:Microsoft PowerPoint2003,本課件由匯編網(wǎng)()制作提供,第2章 寄存器(CPU工作原理),2.1 通用寄存器 2.2 字在寄存器中的存儲(chǔ) 2.3 幾條匯編指令 2.4 物理地址 2.5 16位結(jié)構(gòu)的CPU 2.6 8086CPU給出物理地址的方法,2.7 “段地址×16+偏移地址 =物理地址”的本質(zhì)含義 2.8 段的概念 2.9 段寄存器 2.10 CS和IP 2.12 代碼段,CPU概述,一個(gè)典型的CPU由運(yùn)算器、控制器、寄存器等器件組成,這些器件靠?jī)?nèi)部總線相連。 內(nèi)部總線實(shí)現(xiàn)CPU內(nèi)部各個(gè)器件之間的聯(lián)系。 外部總線實(shí)現(xiàn)CPU和主板上其它器件的聯(lián)系。,寄存器概述,8086CPU有14個(gè)寄存器 它們的名稱為: AX、BX、CX、DX、SI、DI、SP、BP、 IP、CS、SS、DS、ES、PSW。 這些寄存器以后會(huì)陸續(xù)介紹,2.1 通用寄存器,8086CPU所有的寄存器都是16位的,可以存放兩個(gè)字節(jié)。 AX、BX、CX、DX 通常用來(lái)存放一般性數(shù)據(jù)被稱為通用寄存器。 下面以AX為例,我們看一下寄存器的邏輯結(jié)構(gòu)。,一個(gè)16位寄存器可以存儲(chǔ)一個(gè)16位的數(shù)據(jù)。(數(shù)據(jù)的存放情況) 一個(gè)16位寄存器所能存儲(chǔ)的數(shù)據(jù)的最大值為多少? 答案:216-1。,2.1 通用寄存器,16位數(shù)據(jù)在寄存器中的存放情況,數(shù)據(jù):18 二進(jìn)制表示:10010 在寄存器AX中的存儲(chǔ):,16位數(shù)據(jù)在寄存器中的存放情況,數(shù)據(jù):20000 二進(jìn)制表示:0100111000100000 在寄存器AX中的存儲(chǔ):,,2.1 通用寄存器,8086上一代CPU中的寄存器都是8位的; 為保證兼容性,這四個(gè)寄存器都可以分為兩個(gè)獨(dú)立的8位寄存器使用。 AX可以分為AH和AL; BX可以分為BH和BL; CX可以分為CH和CL; DX可以分為DH和DL。 8086CPU的8位寄存器存儲(chǔ)邏輯,2.1 通用寄存器,以AX為例,8086CPU的16位寄存器分為兩個(gè)8位寄存器的情況:,2.1 通用寄存器,AX的低8位(0位~7位)構(gòu)成了AL寄存器,高8位(8位~15位)構(gòu)成了AH寄存器。 AH和AL寄存器是可以獨(dú)立使用的8位寄存器。 8086CPU的8位寄存器數(shù)據(jù)存儲(chǔ)情況 一個(gè)8位寄存器所能存儲(chǔ)的數(shù)據(jù)的最大值是多少? 答案:28-1。,2.1 通用寄存器,,2.2 字在寄存器中的存儲(chǔ),一個(gè)字可以存在一個(gè)16位寄存器中,這個(gè)字的高位字節(jié)和低位字節(jié)自然就存在這個(gè)寄存器的高8位寄存器和低8位寄存器中。,關(guān)于數(shù)制的討論,由于一個(gè)內(nèi)存單元可以存放 8位數(shù)據(jù),CPU中的寄存器又可存放 n 個(gè) 8位數(shù)據(jù)。也就是說(shuō),計(jì)算機(jī)中的數(shù)據(jù)大多 是由1~N個(gè)8位數(shù)據(jù)構(gòu)成的。 用十六進(jìn)制來(lái)表示數(shù)據(jù)可以直觀的看 出這個(gè)數(shù)據(jù)是由哪些8位數(shù)據(jù)構(gòu)成的。 示例,2.3 幾條匯編指令,匯編指令不區(qū)分大小寫,2.3 幾條匯編指令,CPU執(zhí)行下表中的程序段的每條指令后,對(duì)寄存器中的數(shù)據(jù)進(jìn)行的改變。,2.3 幾條匯編指令,,2.3 幾條匯編指令,這里的丟失,指的是進(jìn)位制不能在 8 位寄存器中保存,但是 CPU 不是并真的不丟棄 這個(gè)進(jìn)位值,這個(gè)問(wèn)題會(huì)在后面的課程中討論。,特別提示,檢測(cè)點(diǎn)2.1(Page 18) 沒(méi)有通過(guò)檢測(cè)點(diǎn)請(qǐng)不要向下學(xué)習(xí)!,2.4 物理地址,CPU訪問(wèn)內(nèi)存單元時(shí)要給出內(nèi)存單元的地址。所有的內(nèi)存單元構(gòu)成的存儲(chǔ)空間是一個(gè)一維的線性空間。 每一個(gè)內(nèi)存單元在這個(gè)空間中都有唯一的地址,這個(gè)唯一的地址稱為物理地址。,2.5 16位結(jié)構(gòu)的CPU,概括的講,16位結(jié)構(gòu)描述了一個(gè)CPU具有以下幾個(gè)方面特征: 1、運(yùn)算器一次最多可以處理16位的數(shù)據(jù)。 2、寄存器的最大寬度為16位。 3、寄存器和運(yùn)算器之間的通路是16位的。,2.6 8086CPU給出物理地址的方法,8086有20位地址總線,可傳送20位地址,尋址能力為1M。 8086內(nèi)部為16位結(jié)構(gòu),它只能傳送16位的地址,表現(xiàn)出的尋址能力卻只有64K。,2.6 8086CPU給出物理地址的方法,8086CPU采用一種在內(nèi)部用兩個(gè)16位地址合成的方法來(lái)形成一個(gè)20位的物理地址。 8086CPU相關(guān)部件的邏輯結(jié)構(gòu),在8086CPU內(nèi)部用兩個(gè)16位地址合成的方法來(lái)形成一個(gè)20位的物理地址,,,地址加法器,地址加法器合成物理地址的方法: 物理地址=段地址×16+偏移地址 例如: 8086CPU訪問(wèn)地址為123C8H的內(nèi)存單元 由段地址×16引發(fā)的討論,,,,觀察移位次數(shù)和各種形式數(shù)據(jù)的關(guān)系: (1)一個(gè)數(shù)據(jù)的二進(jìn)制形式左移1位,相當(dāng)于該數(shù)據(jù)乘以2; (2)一個(gè)數(shù)據(jù)的二進(jìn)制形式左移N位,相當(dāng)于該數(shù)據(jù)乘以2的N次方; (3)地址加法器如何完成段地址×16的運(yùn)算? 以二進(jìn)制形式存放的段地址左移4位。,由段地址×16引發(fā)的討論,2.7 “段地址×16+偏移地址=物理地址”的本質(zhì)含義,兩個(gè)比喻說(shuō)明: 說(shuō)明“基礎(chǔ)地址+偏移地址 = 物理地址” 的思想:第一個(gè)比喻 說(shuō)明“段地址×16+偏移地址=物理地址”的思想:第二個(gè)比喻 8086CPU就是這樣一個(gè)只能提供兩張3位數(shù)據(jù)紙條的CPU。,“基礎(chǔ)地址+偏移地址 = 物理地址”,比如說(shuō),學(xué)校、體育館同在一條筆直的單行路上(學(xué)校位于路的起點(diǎn)0米處)。 讀者在學(xué)校,要去圖書館,問(wèn)我那里的地址,我可以用幾種方式描述這個(gè)地址?,“基礎(chǔ)地址+偏移地址 = 物理地址”,(1)從學(xué)校走2826m到圖書館。這2826可以認(rèn)為是圖書館的物理地址。 (2)從學(xué)校走2000m到體育館,從體育館再走826m到圖書館。 第一個(gè)距離2000m是相對(duì)于起點(diǎn)的基礎(chǔ)地址; 第二個(gè)距離826m是將對(duì)于基礎(chǔ)地址的偏移地址。,,“段地址×16+偏移地址=物理地址”,比如我們只能通過(guò)紙條來(lái)通信,讀者問(wèn)我圖書館的地址,我只能將它寫在紙上告訴讀者。 顯然我必須有一張可以容納 4 位數(shù)據(jù)的紙條才能寫下2826這個(gè)數(shù)據(jù):,“段地址×16+偏移地址=物理地址”,不巧的是,沒(méi)有能容納4位數(shù)據(jù)的紙條,僅有兩張可以容納3位數(shù)據(jù)的紙條。 這樣我只能以這種方式告訴讀者2826這個(gè)數(shù)據(jù):,,2.8 段的概念,錯(cuò)誤認(rèn)識(shí): 內(nèi)存被劃分成了一個(gè)一個(gè)的段,每一個(gè)段有一個(gè)段地址。 其實(shí): 內(nèi)存并沒(méi)有分段,段的劃分來(lái)自于CPU,由于8086CPU用“(段地址×16)+偏移地址=物理地址”的方式給出內(nèi)存單元的物理地址,使得我們可以用分段的方式來(lái)管理內(nèi)存。,2.8 段的概念,我們可以認(rèn)為:地址10000H~100FFH的內(nèi)存單元組成一個(gè)段,該段的起始地址( 基礎(chǔ)地址)為10000H,段地址為1000H,大小為100H。,2.8 段的概念,我們也可以認(rèn)為地址10000H~1007FH、10080H~100FFH 的內(nèi)存單元組成兩個(gè)段,它們的起始地址( 基礎(chǔ)地址 )為10000H和10080H,段地址為:1000H 和1008H,大小都為80H。,2.8 段的概念,以后,在編程時(shí)可以根據(jù)需要,將若干地址連續(xù)的內(nèi)存單元看作一個(gè)段,用段地址×16定位段的起始地址(基礎(chǔ)地址),用偏移地址定位段中的內(nèi)存單元。 兩點(diǎn)需要注意 內(nèi)存單元地址小結(jié) 特別提示,兩點(diǎn)需要注意,(1)段地址×16 必然是 16的倍數(shù),所以一個(gè)段的起始地址也一定是16的倍數(shù); (2)偏移地址為16位,16 位地址的尋址能力為 64K,所以一個(gè)段的長(zhǎng)度最大為64K。,,內(nèi)存單元地址小結(jié),CPU訪問(wèn)內(nèi)存單元時(shí),必須向內(nèi)存提供內(nèi)存單元的物理地址。 8086CPU在內(nèi)部用段地址和偏移地址移位相加的方法形成最終的物理地址。 思考兩個(gè)問(wèn)題,(1)觀察下面的地址,讀者有什么發(fā)現(xiàn)? 結(jié)論:CPU可以用不同的段地址和偏移地址形成同一個(gè)物理地址。,內(nèi)存單元地址小結(jié),內(nèi)存單元地址小結(jié),(2)如果給定一個(gè)段地址,僅通過(guò)變化偏移地址來(lái)進(jìn)行尋址,最多可以定位多少內(nèi)存單元? 結(jié)論:偏移地址16位,變化范圍為0~FFFFH,僅用偏移地址來(lái)尋址最多可尋64K個(gè)內(nèi)存單元。 比如:給定段地址1000H,用偏移地址尋址,CPU的尋址范圍為:10000H~1FFFFH。,內(nèi)存單元地址小結(jié),在8086PC機(jī)中,存儲(chǔ)單元的地址用兩個(gè)元素來(lái)描述。即段地址和偏移地址。 “數(shù)據(jù)在21F60H內(nèi)存單元中?!睂?duì)于8086PC機(jī)的兩種描述: (a)數(shù)據(jù)存在內(nèi)存2000:1F60單元中; (b)數(shù)據(jù)存在內(nèi)存的2000段中的1F60H單元中。 可根據(jù)需要,將地址連續(xù)、起始地址為16的倍數(shù)的一組內(nèi)存單元定義為一個(gè)段。,,特別提示,檢測(cè)點(diǎn)2.2(Page 23) 沒(méi)有通過(guò)檢測(cè)點(diǎn)請(qǐng)不要向下學(xué)習(xí)!,2.9 段寄存器,段寄存器就是提供段地址的。 8086CPU有4個(gè)段寄存器: CS、DS、SS、ES 當(dāng)8086CPU要訪問(wèn)內(nèi)存時(shí),由這4個(gè)段寄存器提供內(nèi)存單元的段地址。,2.10 CS和IP,CS和IP是8086CPU中最關(guān)鍵的寄存器,它們指示了CPU當(dāng)前要讀取指令的地址。 CS為代碼段寄存器; IP為指令指針寄存器。,8086PC讀取和執(zhí)行指令相關(guān)部件,8086PC讀取和執(zhí)行指令演示 8086PC工作過(guò)程的簡(jiǎn)要描述,,,,8086PC工作過(guò)程的簡(jiǎn)要描述,(1)從CS:IP指向內(nèi)存單元讀取指令,讀取的指令進(jìn)入指令緩沖器; (2)IP = IP + 所讀取指令的長(zhǎng)度,從而指向下一條指令; (3)執(zhí)行指令。 轉(zhuǎn)到步驟 (1),重復(fù)這個(gè)過(guò)程。,8086PC工作過(guò)程的簡(jiǎn)要描述,在 8086CPU 加電啟動(dòng)或復(fù)位后( 即 CPU剛開(kāi)始工作時(shí))CS和IP被設(shè)置為CS=FFFFH,IP=0000H,即在8086PC機(jī)剛啟動(dòng)時(shí),CPU從內(nèi)存FFFF0H單元中讀取指令執(zhí)行,F(xiàn)FFF0H單元中的指令是8086PC機(jī)開(kāi)機(jī)后執(zhí)行的第一條指令。,2.10 CS和IP,內(nèi)存中指令和數(shù)據(jù)沒(méi)有任何區(qū)別,都是二進(jìn)制信息,CPU在工作的時(shí)候把有的信息看作指令,有的信息看作數(shù)據(jù)。 CPU根據(jù)什么將內(nèi)存中的信息看作指令? CPU將CS:IP指向的內(nèi)存單元中的內(nèi)容看作指令。,2.10 CS和IP,在任何時(shí)候,CPU將CS、IP中的內(nèi)容當(dāng)作指令的段地址和偏移地址,用它們合成指令的物理地址,到內(nèi)存中讀取指令碼,執(zhí)行。 如果說(shuō),內(nèi)存中的一段信息曾被CPU執(zhí)行過(guò)的話,那么,它所在的內(nèi)存單元必然被CS:IP指向過(guò)。,2.11 修改CS、IP的指令,在CPU中,程序員能夠用指令讀寫的部件只有寄存器,程序員可以通過(guò)改變寄存器中的內(nèi)容實(shí)現(xiàn)對(duì)CPU的控制。 CPU從何處執(zhí)行指令是由CS、IP中的內(nèi)容決定的,程序員可以通過(guò)改變CS、IP中的內(nèi)容來(lái)控制CPU執(zhí)行目標(biāo)指令。 我們?nèi)绾胃淖僀S、IP的值呢?,2.11 修改CS、IP的指令,8086CPU必須提供相應(yīng)的指令 先回想我們?nèi)绾涡薷腁X中的值? mov指令不能用于設(shè)置CS、IP的值, 8086CPU沒(méi)有提供這樣的功能。 8086CPU為CS、IP提供了另外的指令來(lái)改變它們的值:轉(zhuǎn)移指令,如何修改AX中的值?,mov 指令 如:mov ax,123 mov指令可以改變8086CPU大部分寄存器的值,被稱為傳送指令。 能夠通過(guò)mov 指令改變CS、IP的值嗎?,,2.11 修改CS、IP的指令,同時(shí)修改CS、IP的內(nèi)容: jmp 段地址:偏移地址 jmp 2AE3:3 jmp 3:0B16 功能:用指令中給出的段地址修改CS,偏移地址修改IP。,2.11 修改CS、IP的指令,僅修改IP的內(nèi)容: jmp 某一合法寄存器 jmp ax (類似于 mov IP,ax) jmp bx 功能:用寄存器中的值修改IP。,內(nèi)存中存放的機(jī)器碼和對(duì)應(yīng)匯編指令情況: (初始:CS=2000H,IP=0000H) 請(qǐng)寫出指令執(zhí)行序列:,問(wèn)題分析,問(wèn)題分析結(jié)果:,(1)mov ax,6622 (2)jmp 1000:3 (3)mov ax,0000 (4)mov bx,ax (5)jmp bx (6)mov ax,0123H (7)轉(zhuǎn)到第(3)步執(zhí)行,2.12 代碼段,對(duì)于8086PC機(jī),在編程時(shí),可以根據(jù)需要,將一組內(nèi)存單元定義為一個(gè)段。 可以將長(zhǎng)度為 N( N≤64KB )的一組代碼,存在一組地址連續(xù)、起始地址為 16的倍數(shù)的內(nèi)存單元中,這段內(nèi)存是用來(lái)存放代碼的,從而定義了一個(gè)代碼段。 例如,2.12 代碼段,這段長(zhǎng)度為 10 字節(jié)的字節(jié)的指令,存在從123B0H~123B9H的一組內(nèi)存單元中,我們就可以認(rèn)為,123B0H~123B9H這段內(nèi)存單元是用來(lái)存放代碼的 ,是一個(gè)代碼段 ,它的段地址為123BH,長(zhǎng)度為10字節(jié)。,2.12 代碼段,如何使得代碼段中的指令被執(zhí)行呢? 將一段內(nèi)存當(dāng)作代碼段,僅僅是我們?cè)诰幊虝r(shí)的一種安排,CPU 并不會(huì)由于這種安排,就自動(dòng)地將我們定義得代碼段中的指令當(dāng)作指令來(lái)執(zhí)行。 CPU 只認(rèn)被 CS:IP 指向的內(nèi)存單元中的內(nèi)容為指令。 所以要將CS:IP指向所定義的代碼段中的第一條指令的首地址。 CS = 123BH,IP = 0000H。,2.9節(jié)~2.12節(jié) 小結(jié),1、段地址在8086CPU的寄存器中存放。當(dāng)8086CPU要訪問(wèn)內(nèi)存時(shí),由段寄存器提供內(nèi)存單元的段地址。8086CPU有4個(gè)段寄存器,其中CS用來(lái)存放指令的段地址。 2、CS存放指令的段地址,IP存放指令的偏移地址。 8086機(jī)中,任意時(shí)刻,CPU將CS:IP指向的內(nèi)容當(dāng)作指令執(zhí)行。,2.9節(jié)~2.12節(jié) 小結(jié)(續(xù)),3、8086CPU的工作過(guò)程: (1)從CS:IP指向內(nèi)存單元讀取指令,讀取的指令進(jìn)入指令緩沖器; (2)IP指向下一條指令; (3)執(zhí)行指令。(轉(zhuǎn)到步驟(1),重復(fù)這個(gè)過(guò)程。) 4、8086CPU提供轉(zhuǎn)移指令修改CS、IP的內(nèi)容。,特別提示,檢測(cè)點(diǎn)2.3(Page 33) 沒(méi)有通過(guò)檢測(cè)點(diǎn)請(qǐng)不要向下學(xué)習(xí)!,小結(jié),,《匯編語(yǔ)言》課件,王爽 著-清華大學(xué)出版社,制作工具:Microsoft PowerPoint2003,本課件由匯編網(wǎng)()制作提供,第3 章寄存器(內(nèi)存訪問(wèn)),3.1 內(nèi)存中字的存儲(chǔ) 3.2 DS和[address] 3.3 字的傳送 3.4 mov、add、sub指令 3.5 數(shù)據(jù)段 3.6 棧 3.7 CPU提供的棧機(jī)制 3.8 棧頂超界的問(wèn)題 3.9 push、pop指令 3.10 棧段,引言,在第2章中,我們主要從 CPU 如何執(zhí)行指令的角度講解了8086CPU的邏輯結(jié)構(gòu)、形成物理地址的方法、相關(guān)的寄存器以及一些指令。 這一章中,我們從訪問(wèn)內(nèi)存的角度繼續(xù)學(xué)習(xí)幾個(gè)寄存器。,在0地址處開(kāi)始存放20000: 0號(hào)單元是低地址單元,1號(hào)單元是高地址單元。,3.1 內(nèi)存中字的存儲(chǔ),3.1 內(nèi)存中字的存儲(chǔ),問(wèn)題: (1)0地址單元中存放的字節(jié)型數(shù)據(jù)是多少? (2)0地址字單元中存放的字型數(shù)據(jù)是多少? (3)2地址字單元中存放的字節(jié)型數(shù)據(jù)是多少?,3.1 內(nèi)存中字的存儲(chǔ),問(wèn)題(續(xù)): (4)2地址單元中存放的字型數(shù)據(jù)是多少? (5)1地址字單元中存放的字型數(shù)據(jù)是多少? 結(jié)論,3.1 內(nèi)存中字的存儲(chǔ),結(jié)論: 任何兩個(gè)地址連續(xù)的內(nèi)存單元,N號(hào)單元和 N+1號(hào)單元,可以將它們看成兩個(gè)內(nèi)存單元 ,也可以看成一個(gè)地址為N的字單元中的高位字節(jié)單元和低位字節(jié)單元。,3.2 DS和[address],CPU要讀取一個(gè)內(nèi)存單元的時(shí)候,必須先給出這個(gè)內(nèi)存單元的地址; 在8086PC中,內(nèi)存地址由段地址和偏移地址組成。 8086CPU中有一個(gè) DS寄存器,通常用來(lái)存放要訪問(wèn)的數(shù)據(jù)的段地址。 例如,3.2 DS和[address],例如:我們要讀取10000H單元的內(nèi)容可以用如下程序段進(jìn)行: mov bx,1000H mov ds,bx mov al,[0] 上面三條指令將10000H(1000:0)中的數(shù)據(jù)讀到al中。,3.2 DS和[address],mov al,[0] 已知的mov指令可完成的兩種傳送功能: (1)將數(shù)據(jù)直接送入寄存器; (2)將一個(gè)寄存器中的內(nèi)容送入另一個(gè)寄存器中。 mov 指令 還可以將一個(gè)內(nèi)存單元中的內(nèi)容送入一個(gè)寄存器。,,3.2 DS和[address],從哪個(gè)內(nèi)存單元送到哪個(gè)寄存器中呢? mov指令的格式: mov 寄存器名,內(nèi)存單元地址 “[…]”表示一個(gè)內(nèi)存單元, “[…]”中的0表示內(nèi)存單元的偏移地址。 那么內(nèi)存單元的段地址是多少呢?,3.2 DS和[address],執(zhí)行指令時(shí),8086CPU自動(dòng)取DS中的數(shù)據(jù)為內(nèi)存單元的段地址。 如何用mov指令從10000H中讀取數(shù)據(jù)? 10000H表示為1000:0(段地址:偏移地址) 將段地址1000H放入ds 用mov al,[0]完成傳送(mov指令中的[]說(shuō)明操作對(duì)象是一個(gè)內(nèi)存單元,[]中的0說(shuō)明這個(gè)內(nèi)存單元的偏移地址是0,它的段地址默認(rèn)放在ds中) 如何把1000H送入ds?,3.2 DS和[address],如何把1000H送入ds? 傳送指令 mov ax,1 相似的方式 mov ds,1000H? 8086CPU不支持將數(shù)據(jù)直接送入段寄存器的操作,ds是一個(gè)段寄存器。 (硬件設(shè)計(jì)的問(wèn)題) mov ds,1000H 是非法的。 數(shù)據(jù)?一般的寄存器?段寄存器,3.2 DS和[address],問(wèn)題: 寫幾條指令,將al中的數(shù)據(jù)送入內(nèi)存單元10000H?(思考后分析) 分析問(wèn)題本質(zhì): 怎樣將數(shù)據(jù)從寄存器送入內(nèi)存單元? 結(jié)論:mov bx,1000H mov ds,bx mov [0],al (一種合理的回答),3.3 字的傳送,因?yàn)?086CPU是16位結(jié)構(gòu),有16根數(shù)據(jù)線,所以,可以一次性傳送16位的數(shù)據(jù),也就是一次性傳送一個(gè)字。,問(wèn)題3.3:內(nèi)存中的情況如右圖,寫出下面指令執(zhí)行后寄存器ax,bx,cx中的值。 思考后看分析。(單步跟蹤),3.3 字的傳送,問(wèn)題3.3分析,,問(wèn)題3.4:內(nèi)存中的情況如右圖,寫出下面指令執(zhí)行后寄存器ax,bx,cx中的值。 思考后看分析。(單步跟蹤),3.3 字的傳送,問(wèn)題3.4分析,,3.4 mov、add、sub指令,已學(xué)mov指令的幾種形式: mov 寄存器,數(shù)據(jù) mov 寄存器,寄存器 mov 寄存器,內(nèi)存單元 mov 內(nèi)存單元,寄存器 mov 段寄存器,寄存器 根據(jù)已知指令進(jìn)行推測(cè),3.4 mov、add、sub指令,根據(jù)已知指令進(jìn)行推測(cè): mov 段寄存器,寄存器 ? mov 寄存器,段寄存器(驗(yàn)證) mov 內(nèi)存單元,寄存器 ? mov 內(nèi)存單元,段寄存器 ? mov 段寄存器,內(nèi)存單元,驗(yàn)證(Debug),mov 段寄存器,寄存器 ? mov 寄存器,段寄存器,add和sub指令同mov一樣,都有兩個(gè)操作對(duì)象。 它們可以對(duì)段寄存器進(jìn)行操作嗎? (請(qǐng)自行在Debug中試驗(yàn)),3.4 mov、add、sub指令,3.5 數(shù)據(jù)段,前面講過(guò),對(duì)于8086PC機(jī),我們可以根據(jù)需要將一組內(nèi)存單元定義為一個(gè)段。 我們可以將一組長(zhǎng)度為N(N≤64K)、地址連續(xù)、起始地址為16的倍數(shù)的內(nèi)存單元當(dāng)作專門存儲(chǔ)數(shù)據(jù)的內(nèi)存空間,從而定義了一個(gè)數(shù)據(jù)段。 比如我們用123B0H~123B9H這段空間來(lái)存放數(shù)據(jù): 段地址:123BH 長(zhǎng)度:10字節(jié),3.5 數(shù)據(jù)段,如何訪問(wèn)數(shù)據(jù)段中的數(shù)據(jù)呢? 將一段內(nèi)存當(dāng)作數(shù)據(jù)段,是我們?cè)诰幊虝r(shí)的一種安排,我們可以在具體操作的時(shí)候 ,用 ds 存放數(shù)據(jù)段的段地址,再根據(jù)需要,用相關(guān)指令訪問(wèn)數(shù)據(jù)段中的具體單元。 示例,3.5 數(shù)據(jù)段,我們將123B0H~123BAH的內(nèi)存單元定義為數(shù)據(jù)段,我們現(xiàn)在要累加這個(gè)數(shù)據(jù)段中的前3個(gè)單元中的數(shù)據(jù),代碼如下:,3.5 數(shù)據(jù)段,問(wèn)題3.5 寫幾條指令,累加數(shù)據(jù)段中的前3個(gè)字型數(shù)據(jù)。 思考后看分析。,問(wèn)題3.5分析,注意:一個(gè)字型數(shù)據(jù)占兩個(gè)單元,所以偏移地址是0、2、4。,3.1節(jié)~3.5節(jié) 小結(jié),(1)字在內(nèi)存中存儲(chǔ)時(shí) ,要用兩個(gè)地址連續(xù)的內(nèi)存單元來(lái)存放,字的低位字節(jié)存放在低地址單元中,高位字節(jié)存放再高地址單元中。 (2)用 mov 指令要訪問(wèn)內(nèi)存單元,可以在mov指令中只給出單元的偏移地址,此時(shí),段地址默認(rèn)在DS寄存器中。 (3)[address]表示一個(gè)偏移地址為address的內(nèi)存單元。,3.1節(jié)~3.5節(jié) 小結(jié)(續(xù)),(4)在內(nèi)存和寄存器之間傳送字型數(shù)據(jù)時(shí),高地址單元和高8位寄存器、低地址單元和低8位寄存器相對(duì)應(yīng)。 (5)mov、add、sub是具有兩個(gè)操作對(duì)象的指令。jmp是具有一個(gè)操作對(duì)象的指令。 (6)可以根據(jù)自己的推測(cè),在Debug中實(shí)驗(yàn)指令的新格式。 特別提示,特別提示,檢測(cè)點(diǎn)3.1 (p52) 沒(méi)有通過(guò)檢測(cè)點(diǎn)請(qǐng)不要向下學(xué)習(xí)!,3.6 棧,我們研究棧的角度: 棧是一種具有特殊的訪問(wèn)方式的存儲(chǔ)空間。它的特殊性就在于,最后進(jìn)入這個(gè)空間的數(shù)據(jù),最先出去。 可以用一個(gè)盒子和3本書來(lái)描述 棧的操作方式,,,3.6 棧,棧有兩個(gè)基本的操作:入棧和出棧。 入棧:將一個(gè)新的元素放到棧頂; 出棧:從棧頂取出一個(gè)元素。 棧頂?shù)脑乜偸亲詈笕霔?,需要出棧時(shí),又最先被從棧中取出。 棧的操作規(guī)則:LIFO (Last In First Out,后進(jìn)先出),3.7 CPU提供的棧機(jī)制,現(xiàn)今的CPU中都有棧的設(shè)計(jì)。 8086CPU提供相關(guān)的指令來(lái)以棧的方式訪問(wèn)內(nèi)存空間。 這意味著,我們?cè)诨?086CPU編程的時(shí)候,可以將一段內(nèi)存當(dāng)作棧來(lái)使用。,3.7 CPU提供的棧機(jī)制,8086CPU提供入棧和出棧指令: (最基本的) PUSH(入棧) POP (出棧) push ax:將寄存器ax中的數(shù)據(jù)送入棧中; pop ax :從棧頂取出數(shù)據(jù)送入ax。 8086CPU的入棧和出棧操作都是以字為單位進(jìn)行的。,3.6 棧,下面舉例說(shuō)明,我們可以將10000H~1000FH這段內(nèi)存當(dāng)作棧來(lái)使用。 下面一段指令的執(zhí)行過(guò)程: mov ax,0123H push ax mov bx,2266H push bx mov cx,1122H push cx pop ax pop bx pop cx,3.6 棧,指令序列的執(zhí)行過(guò)程演示 注意:字型數(shù)據(jù)用兩個(gè)單元存放,高地址單元放高 8 位,低地址單元放低8 位。 是否有疑惑? 兩個(gè)疑問(wèn),,,,兩個(gè)疑問(wèn),1、CPU如何知道一段內(nèi)存空間被當(dāng)作棧使用? 2、執(zhí)行push和pop的時(shí)候,如何知道哪個(gè)單元是棧頂單元? 分析 結(jié)論:任意時(shí)刻,SS:SP指向棧頂元素。,對(duì)于兩個(gè)疑問(wèn)的分析,回想:CPU如何指導(dǎo)當(dāng)前要執(zhí)行的指令所在的位置? 寄存器CS和IP中存放著當(dāng)前指令的段地址和偏移地址。 8086CPU中,有兩個(gè)寄存器: 段寄存器SS 存放棧頂?shù)亩蔚刂?寄存器SP 存放棧頂?shù)钠频刂?任意時(shí)刻,SS:SP指向棧頂元素。,,push 指令的執(zhí)行過(guò)程,push ax (1)SP=SP–2; (2)將ax中的內(nèi)容送入SS:SP指向的內(nèi)存單元處,SS:SP此時(shí)指向新棧頂。 圖示,push 指令的執(zhí)行過(guò)程,,3.6 棧,問(wèn)題3.6:如果我們將10000H~1000FH 這段空間當(dāng)作棧,初始狀態(tài)棧是空的,此時(shí),SS=1000H,SP=? 思考后看分析。,問(wèn)題3.6分析,SP = 0010H,問(wèn)題3.6分析(續(xù)),我們將10000H~1000FH 這段空間當(dāng)作棧段,SS=1000H,??臻g大小為16 字節(jié) ,棧最底部的字單元地址為1000:000E。 任意時(shí)刻,SS:SP指向棧頂,當(dāng)棧中只有一個(gè)元素的時(shí)候,SS = 1000H,SP=000EH。,問(wèn)題3.6分析(續(xù)),棧為空,就相當(dāng)于棧中唯一的元素出棧,出棧后,SP=SP+2 ,SP 原來(lái)為 000EH,加 2 后SP=10H,所以,當(dāng)棧為空的時(shí)候,SS=1000H,SP=10H。 換個(gè)角度看,問(wèn)題3.6分析(續(xù)),換個(gè)角度看: 任意時(shí)刻,SS:SP 指向棧頂元素,當(dāng)棧為空的時(shí)候,棧中沒(méi)有元素,也就不存在棧頂元素,所以SS:SP 只能指向棧的最底部單元下面的單元,該單元的偏移地址為棧最底部的字單元的偏移地址+2,棧最底部字單元的地址為1000:000E,所以棧空時(shí),SP=0010H。,pop 指令的執(zhí)行過(guò)程,pop ax (1)將SS:SP指向的內(nèi)存單元處的數(shù)據(jù)送入ax中; (2)SP = SP+2,SS:SP指向當(dāng)前棧頂下面的單元,以當(dāng)前棧頂下面的單元為新的棧頂。 圖示,pop 指令的執(zhí)行過(guò)程,注意,pop 指令的執(zhí)行過(guò)程,注意: 出棧后,SS:SP指向新的棧頂 1000EH,pop操作前的棧頂元素,1000CH 處的2266H 依然存在 ,但是,它已不在棧中。 當(dāng)再次執(zhí)行push等入棧指令后,SS:SP移至1000CH,并在里面寫入新的數(shù)據(jù),它將被覆蓋。,3.8 棧頂超界的問(wèn)題,SS和SP只記錄了棧頂?shù)牡刂?,依靠SS和SP可以保證在入棧和出棧時(shí)找到棧頂。 可是,如何能夠保證在入棧、出棧時(shí),棧頂不會(huì)超出??臻g?,3.8 棧頂超界的問(wèn)題,當(dāng)棧滿的時(shí)候再使用push指令入棧, ??盏臅r(shí)候再使用pop指令出棧, 都將發(fā)生棧頂超界問(wèn)題。 棧頂超界是危險(xiǎn)的。,,,,,,,3.8 棧頂超界的問(wèn)題,棧頂超界是危險(xiǎn)的: 因?yàn)槲覀兗热粚⒁欢慰臻g安排為棧 ,那么在??臻g之外的空間里很可能存放了具有其他用途的數(shù)據(jù)、代碼等,這些數(shù)據(jù)、代碼可能是我們自己的程序中的,也可能是別的程序中的。 (畢竟一個(gè)計(jì)算機(jī)系統(tǒng)并不是只有我們自己的程序在運(yùn)行),3.8 棧頂超界的問(wèn)題,但是由于我們?cè)谌霔3鰲r(shí)的不小心,而將這些數(shù)據(jù)、代碼意外地改寫,將會(huì)引發(fā)一連串的錯(cuò)誤。 我們當(dāng)然希望CPU 可以幫我們解決這個(gè)問(wèn)題,,3.8 棧頂超界的問(wèn)題,比如說(shuō)在CPU中有記錄棧頂上限和下限的寄存器,我們可以通過(guò)填寫這些寄存器來(lái)指定??臻g的范圍 ,然后 ,CPU 在執(zhí)行push指令的時(shí)候靠檢測(cè)棧頂上限寄存器,在執(zhí)行pop 指令的時(shí)候靠檢測(cè)棧頂下限寄存器保證不會(huì)超界。 實(shí)際情況:8086CPU中并沒(méi)有這樣的寄存器。,3.8 棧頂超界的問(wèn)題,8086CPU不保證對(duì)棧的操作不會(huì)超界。 這就是說(shuō), 8086CPU 只知道棧頂在何處(由SS:SP指示),而不知道讀者安排的??臻g有多大。這點(diǎn)就好像 ,CPU 只知道當(dāng)前要執(zhí)行的指令在何處(由CS:SP指示)而不知道讀者要執(zhí)行的指令有多少。 從這兩點(diǎn)我們可以看出,3.8 棧頂超界的問(wèn)題,8086CPU的工作機(jī)理,只考慮當(dāng)前的情況: 當(dāng)前棧頂在何處; 當(dāng)前要執(zhí)行的指令是哪一條。 結(jié)論,3.8 棧頂超界的問(wèn)題,結(jié)論: 我們?cè)诰幊痰臅r(shí)候要自己操心棧頂超界的問(wèn)題 ,要根據(jù)可能用到的最大??臻g,來(lái)安排棧的大小,防止入棧的數(shù)據(jù)太多而導(dǎo)致的超界;執(zhí)行出棧操作的時(shí)候也要注意,以防棧空的時(shí)候繼續(xù)出棧而導(dǎo)致的超界。,3.9 push、pop指令,push和pop指令是可以在寄存器和內(nèi)存之間傳送數(shù)據(jù)的。 push和pop指令的格式,棧與內(nèi)存,??臻g當(dāng)然也是內(nèi)存空間的一部分,它只是一段可以以一種特殊的方式進(jìn)行訪問(wèn)的內(nèi)存空間。,,3.9 push、pop指令,push和pop指令的格式(1) push 寄存器:將一個(gè)寄存器中的數(shù)據(jù)入棧 pop寄存器:出棧,用一個(gè)寄存器接收出棧的數(shù)據(jù) 例如:push ax pop bx,3.9 push、pop指令,push和pop指令的格式(2) push 段寄存器:將一個(gè)段寄存器中的數(shù)據(jù)入棧 pop段寄存器:出棧,用一個(gè)段寄存器接收出棧的數(shù)據(jù) 例如:push ds pop es,3.9 push、pop指令,push和pop指令的格式(3) push內(nèi)存單元:將一個(gè)內(nèi)存單元處的字入棧(棧操作都是以字為單位) pop 內(nèi)存單元:出棧,用一個(gè)內(nèi)存字單元接收出棧的數(shù)據(jù) 例如:push [0] pop [2] 指令執(zhí)行時(shí) ,CPU 要知道內(nèi)存單元的地址,可以在 push、pop 指令中給出內(nèi)存單元的偏移地址,段地址在指令執(zhí)行時(shí),CPU從ds中取得。,3.9 push、pop指令,問(wèn)題3.7 編程: 將10000H~1000FH 這段空間當(dāng)作棧,初始狀態(tài)是空的,將 AX、BX、DS中的數(shù)據(jù)入棧。 思考后看分析。,問(wèn)題3.7分析,,3.9 push、pop指令,問(wèn)題3.8 編程: (1)將10000H~1000FH 這段空間當(dāng)作棧,初始狀態(tài)是空的; (2)設(shè)置AX=001AH,BX=001BH; (3)將AX、BX中的數(shù)據(jù)入棧; (4)然后將AX、BX清零; (5)從棧中恢復(fù)AX、BX原來(lái)的內(nèi)容。 思考后看分析。,問(wèn)題3.8分析,結(jié)論,問(wèn)題3.8分析,從上面的程序我們看到,用棧來(lái)暫存以后需要恢復(fù)的寄存器中的內(nèi)容時(shí) ,出棧的順序要和入棧的順序相反,因?yàn)樽詈笕霔5募拇嫫鞯膬?nèi)容在棧頂 ,所以在恢復(fù)時(shí),要最先出棧。,3.9 push、pop指令,問(wèn)題3.9 編程: (1)將10000H~1000FH 這段空間當(dāng)作棧,初始狀態(tài)是空的; (2)設(shè)置AX=002AH,BX=002BH; (3)利用棧 ,交換 AX 和 BX 中的數(shù)據(jù)。 思考后看分析。,問(wèn)題3.9分析,,3.9 push、pop指令,問(wèn)題3.10 我們?nèi)绻?0000H處寫入字型數(shù)據(jù)2266H,可以用以下的代碼完成: mov ax,1000H mov ds,ax mov ,ax,2266H mov [0],ax 補(bǔ)全下面的代碼,3.9 push、pop指令,補(bǔ)全下面的代碼,完成同樣的功能: 在10000H處寫入字型數(shù)據(jù)2266H。 __________ __________ __________ mov ax,2266H push ax 要求:不能使用“mov 內(nèi)存單元,寄存器”這類指令 思考后看分析。,問(wèn)題3.10分析,我們看需補(bǔ)全代碼的最后兩條指令,將ax中的2266H壓入棧中,也就是說(shuō),最終應(yīng)由push ax將2266H寫入10000H處。 問(wèn)題的關(guān)鍵就在于:如何使push ax訪問(wèn)的內(nèi)存單元是10000H。 Push指令是入棧指令。(注意執(zhí)行過(guò)程) 完成程序,問(wèn)題3.10分析(續(xù)),完成的程序: mov ax,1000H mov ss,ax mov sp,2 mov ax,2266H push ax 結(jié)論,問(wèn)題3.10分析(續(xù)),結(jié)論 push、pop 實(shí)質(zhì)上就是一種內(nèi)存?zhèn)魉椭噶?,可以在寄存器和?nèi)存之間傳送數(shù)據(jù),與mov指令不同的是,push和pop指令訪問(wèn)的內(nèi)存單元的地址不是在指令中給出的,而是由SS:SP指出的。 同時(shí),push和pop指令還要改變 SP 中的內(nèi)容。,問(wèn)題3.10分析(續(xù)),我們要十分清楚的是,push和pop指令同mov指令不同,CPU執(zhí)行mov指令只需一步操作,就是傳送,而執(zhí)行push、pop指令卻需要兩步操作。 執(zhí)行push時(shí): 先改變SP,后向SS:SP處傳送。 執(zhí)行pop時(shí): 先讀取SS:SP處的數(shù)據(jù),后改變SP。,注意,push、pop 等棧操作指令,修改的只是SP。也就是說(shuō),棧頂?shù)淖兓秶畲鬄椋?~FFFFH。 提供:SS、SP指示棧頂;改變SP后寫內(nèi)存的入棧指令;讀內(nèi)存后改變SP的出棧指令。 這就是8086CPU提供的棧操作機(jī)制。,棧的綜述,(1)8086CPU提供了棧操作機(jī)制,方案如下: 在SS,SP中存放棧頂?shù)亩蔚刂泛推频刂罚?提供入棧和出棧指令,他們根據(jù)SS:SP指示的地址,按照棧的方式訪問(wèn)內(nèi)存單元。 (2)push指令的執(zhí)行步驟: 1)SP=SP-2; 2)向SS:SP指向的字單元中送入數(shù)據(jù)。 (3)pop指令的執(zhí)行步驟: 1)從SS:SP指向的字單元中讀取數(shù)據(jù); 2)SP=SP-2。,棧的綜述(續(xù)),(4)任意時(shí)刻,SS:SP指向棧頂元素。 (5)8086CPU只記錄棧頂,??臻g的大小我們要自己管理。 (6)用棧來(lái)暫存以后需要恢復(fù)的寄存器的內(nèi)容時(shí) ,寄存器出棧的順序要和 入棧的順序相反。 (7)push、pop實(shí)質(zhì)上是一種內(nèi)存?zhèn)魉椭噶?,注意它們的靈活應(yīng)用。 棧是一種非常重要的機(jī)制,一定要深入理解,靈活掌握。,3.10 棧段,前面講過(guò),對(duì)于8086PC機(jī),在編程時(shí),我們可以根據(jù)需要 ,將一組內(nèi)存單元定義為一個(gè)段。 我們可以將長(zhǎng)度為 N(N ≤64K )的一組地址連續(xù)、起始地址為16的倍數(shù)的內(nèi)存單元,當(dāng)作棧來(lái)用,從而定義了一個(gè)棧段。,3.10 棧段,比如我們將10010H~1001FH 這段長(zhǎng)度為 16 字節(jié)的內(nèi)存空間當(dāng)作棧來(lái)用,以棧的方式進(jìn)行訪問(wèn)。 這段空間就可以成為棧段,段地址為1000H,大小為16字節(jié)。,3.10 棧段,將一段內(nèi)存當(dāng)作棧段,僅僅是我們?cè)诰幊虝r(shí)的一種安排,CPU 并不會(huì)由于這種安排,就在執(zhí)行push、pop 等棧操作指令時(shí)就自動(dòng)地將我們定義的棧段當(dāng)作??臻g來(lái)訪問(wèn)。 如何使的如push、pop 等棧操作指令訪問(wèn)我們定義的棧段呢? 將SS:SP指向我們定義的棧段。,3.10 棧段,問(wèn)題3.11 如果我們將10000H~1FFFFH這段空間當(dāng)作棧段,初始狀態(tài)是空的,此時(shí),SS=1000H,SP=? 思考后看分析。,問(wèn)題3.11分析,我們將10000H~1FFFFH這段空間當(dāng)作棧段 ,SS=1000H ,??臻g大小為64KB ,棧最底部的字單元地址為1000:FFFE。 任意時(shí)刻,SS:SP指向棧頂,當(dāng)棧中只有一個(gè)元素的時(shí)候,SS=1000H,SP=FFFEH。,問(wèn)題3.11分析,棧為空,就相當(dāng)于棧中唯一的元素出棧,出棧后,SP=SP+2。 SP原來(lái)為FFFEH,加2后SP=0,所以,當(dāng)棧為空的時(shí)候,SS=1000H,SP=0。 換個(gè)角度看,問(wèn)題3.11分析(續(xù)),換個(gè)角度看 任意時(shí)刻,SS:SP指向棧頂元素,當(dāng)棧為空的時(shí)候 ,棧中沒(méi)有元素 ,也就不存在棧頂元素,所以SS:SP只能指向棧的最底部單元下面的單元 ,該單元的偏移地址為棧最底部的字單元的偏移地址+2 ,棧最底部字單元的地址為1000:FFFE,所以??諘r(shí),SP=0000H。,問(wèn)題3.12,一個(gè)棧段最大可以設(shè)為多少?為什么? 思考后看分析。,問(wèn)題3.12分析,一個(gè)棧段最大可以設(shè)為多少? 分析:這個(gè)問(wèn)題顯而易見(jiàn),提出來(lái)只是為了提示我們將相關(guān)的知識(shí)融會(huì)起來(lái)。 首先從棧操作指令所完成的功能的角度上來(lái)看,push、pop等指令在執(zhí)行的時(shí)候只修改SP;,問(wèn)題3.12分析,所以棧頂?shù)淖兓秶?~FFFFH,從??諘r(shí)候的SP=0,一直壓棧,直到棧滿時(shí)SP=0;如果再次壓棧,棧頂將環(huán)繞,覆蓋了原來(lái)?xiàng)V械膬?nèi)容。 所以一個(gè)棧段的容量最大為64KB。,段的綜述,我們可以將一段內(nèi)存定義為一個(gè)段,用一個(gè)段地址指示段,用偏移地址訪問(wèn)段內(nèi)的單元。這完全是我們自己的安排。 我們可以用一個(gè)段存放數(shù)據(jù),將它定義為“數(shù)據(jù)段”; 我們可以用一個(gè)段存放代碼,將它定義為“代碼段”; 我們可以用一個(gè)段當(dāng)作棧,將它定義為“棧段”;,段的綜述(續(xù)),我們可以這樣安排,但若要讓CPU按照我們的安排來(lái)訪問(wèn)這些段,就要: 對(duì)于數(shù)據(jù)段,將它的段地址放在 DS中,用mov、add、sub等訪問(wèn)內(nèi)存單元的指令時(shí),CPU就將我們定義的數(shù)據(jù)段中的內(nèi)容當(dāng)作數(shù)據(jù)段來(lái)訪問(wèn);,段的綜述(續(xù)),對(duì)于代碼段,將它的段地址放在 CS中,將段中第一條指令的偏移地址放在IP中,這樣CPU就將執(zhí)行我們定義的代碼段中的指令;,段的綜述(續(xù)),對(duì)于棧段,將它的段地址放在SS中,將棧頂單元的偏移地置放在 SP 中,這樣CPU在需要進(jìn)行棧操作的時(shí)候,比如執(zhí)行 push、pop 指令等,就將我們定義的棧段當(dāng)作??臻g來(lái)用。,段的綜述(續(xù)),可見(jiàn),不管我們?nèi)绾伟才?,CPU 將內(nèi)存中的某段內(nèi)存當(dāng)作代碼 ,是因?yàn)镃S:IP指向了那里;CPU將某段內(nèi)存當(dāng)作棧 ,是因?yàn)?SS:IP 指向了那里。,段的綜述(續(xù)),我們一定要清楚 ,什么是我們的安排,以及如何讓CPU按我們的安排行事。 要非常的清楚CPU的工作機(jī)理,才能在控制CPU來(lái)按照我們的安排運(yùn)行的時(shí)候做到游刃有余。,段的綜述(續(xù)),比如我們將10000H~1001FH安排為代碼段,并在里面存儲(chǔ)如下代碼:,mov ax,1000H mov ss,ax mov sp,0020H ;初始化棧頂 mov ax,cs mov ds,ax ;設(shè)置數(shù)據(jù)段段地址 mov ax,[0] add ax,[2] mov bx,[4] add bx,[6] push ax push bx pop ax pop bx,段的綜述(續(xù)),設(shè)置CS=1000H,IP=0,這段代碼將得到執(zhí)行。 可以看到,在這段代碼中,我們又將10000H~1001FH 安排為棧段和數(shù)據(jù)段。 10000H~1001FH這段內(nèi)存,既是代碼段,又是棧段和數(shù)據(jù)段。,段的綜述(續(xù)),一段內(nèi)存,可以既是代碼的存儲(chǔ)空間,又是數(shù)據(jù)的存儲(chǔ)空間,還可以是??臻g,也可以什么也不是。 關(guān)鍵在于CPU中寄存器的設(shè)置,即: CS、IP、SS、SP、DS的指向。,特別提示,檢測(cè)點(diǎn)3.2 (p66) 沒(méi)有通過(guò)檢測(cè)點(diǎn)請(qǐng)不要向下學(xué)習(xí)!,小結(jié),,《匯編語(yǔ)言》課件- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
15 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 匯編語(yǔ)言 第二 全部
鏈接地址:http://kudomayuko.com/p-1983263.html