王爽匯編語言第二全部_第1頁
王爽匯編語言第二全部_第2頁
王爽匯編語言第二全部_第3頁
王爽匯編語言第二全部_第4頁
王爽匯編語言第二全部_第5頁
已閱讀5頁,還剩1162頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

引言匯編語言是直接在硬件之上工作的編程語言,首先要了解硬件系統(tǒng)的結(jié)構(gòu),才能有效的應(yīng)用匯編語言對其編程。在本章中,對硬件系統(tǒng)結(jié)構(gòu)的問題進行一部分的探討,以使后續(xù)的課程可在一個好的基礎(chǔ)上進行。目前一頁\總數(shù)一千二百八十九頁\編于十六點引言當(dāng)課程進行到需要補充新的基礎(chǔ)知識(關(guān)于編程結(jié)構(gòu)或其他的)時候,再對相關(guān)的基礎(chǔ)知識進行介紹和探討。本書的原則是,以后用到的知識,以后再說。目前二頁\總數(shù)一千二百八十九頁\編于十六點引言匯編課程的研究重點放在如何利用硬件系統(tǒng)的編程結(jié)構(gòu)和指令集有效靈活的控制系統(tǒng)進行工作。目前三頁\總數(shù)一千二百八十九頁\編于十六點1.1機器語言機器語言是機器指令的集合。機器指令展開來講就是一臺機器可以正確執(zhí)行的命令。目前四頁\總數(shù)一千二百八十九頁\編于十六點1.1機器語言指令:01010000(PUSHAX)電平脈沖:

目前五頁\總數(shù)一千二百八十九頁\編于十六點1.1機器語言以后我們提到的計算機是指由CPU和其他受CPU直接或間接控制的芯片、器件、設(shè)備組成的計算機系統(tǒng);比如我們最常見的PC機。

目前六頁\總數(shù)一千二百八十九頁\編于十六點1.1機器語言程序員們將0、1數(shù)字編程的程序代碼打在紙帶或卡片上,1打孔,0不打孔,再將程序通過紙帶機或卡片機輸入計算機,進行運算。示例應(yīng)用8086CPU完成運算:

S=768+12288–1280目前七頁\總數(shù)一千二百八十九頁\編于十六點1.1機器語言S=768+12288-1280機器碼:

假如將程序錯寫成以下這樣,請找處錯誤:目前八頁\總數(shù)一千二百八十九頁\編于十六點1.1機器語言在顯示器上輸出“welcometomasm”。

機器碼看到這樣的程序,你會有什么感想?如果程序里有一個“1”被誤寫為“0”,又如何去查找呢?目前九頁\總數(shù)一千二百八十九頁\編于十六點1.2匯編語言的產(chǎn)生匯編語言的主體是匯編指令。匯編指令和機器指令的差別在于指令的表示方法上。匯編指令是機器指令便于記憶的書寫格式。匯編指令是機器指令的助記符。目前十頁\總數(shù)一千二百八十九頁\編于十六點1.2匯編語言的產(chǎn)生操作:寄存器BX的內(nèi)容送到AX中匯編指令:MOVAX,BX這樣的寫法與人類語言接近,便于閱讀和記憶。目前十一頁\總數(shù)一千二百八十九頁\編于十六點寄存器寄存器:簡單的講是CPU中可以存儲數(shù)據(jù)的器件,一個CPU中有多個寄存器。AX是其中一個寄存器的代號,BX是另一個寄存器的代號。更詳細(xì)的內(nèi)容我們在以后的課程中將會講到。目前十二頁\總數(shù)一千二百八十九頁\編于十六點1.2匯編語言的產(chǎn)生計算機能讀懂的只有機器指令,那么如何讓計算機執(zhí)行程序員用匯編指令編寫的程序呢?目前十三頁\總數(shù)一千二百八十九頁\編于十六點用匯編語言編寫程序的工作過程目前十四頁\總數(shù)一千二百八十九頁\編于十六點1.3匯編語言的組成匯編語言由以下3類組成:1、匯編指令(機器碼的助記符)2、偽指令(由編譯器執(zhí)行)3、其它符號(由編譯器識別)匯編語言的核心是匯編指令,它決定了匯編語言的特性。目前十五頁\總數(shù)一千二百八十九頁\編于十六點1.4存儲器CPU是計算機的核心部件.它控制整個計算機的運作并進行運算,要想讓一個CPU工作,就必須向它提供指令和數(shù)據(jù)。指令和數(shù)據(jù)在存儲器中存放,也就是平時所說的內(nèi)存。目前十六頁\總數(shù)一千二百八十九頁\編于十六點1.4存儲器在一臺PC機中內(nèi)存的作用僅次于CPU。離開了內(nèi)存,性能再好的CPU也無法工作。目前十七頁\總數(shù)一千二百八十九頁\編于十六點1.4存儲器磁盤不同于內(nèi)存,磁盤上的數(shù)據(jù)或程序如果不讀到內(nèi)存中,就無法被CPU使用。目前十八頁\總數(shù)一千二百八十九頁\編于十六點1.5指令和數(shù)據(jù)指令和數(shù)據(jù)是應(yīng)用上的概念。在內(nèi)存或磁盤上,指令和數(shù)據(jù)沒有任何區(qū)別,都是二進制信息。目前十九頁\總數(shù)一千二百八十九頁\編于十六點1.5指令和數(shù)據(jù)二進制信息:─>89D8H(數(shù)據(jù))─>MOVAX,BX(程序)目前二十頁\總數(shù)一千二百八十九頁\編于十六點1.6存儲單元存儲器被劃分為若干個存儲單元,每個存儲單元從0開始順序編號;例如:一個存儲器有128個存儲單元,編號從0~127。如右圖示:目前二十一頁\總數(shù)一千二百八十九頁\編于十六點1.6存儲單元對于大容量的存儲器一般還用以下單位來計量容量(以下用B來代表Byte):1KB=1024B1MB=1024KB1GB=1024MB1TB=1024GB磁盤的容量單位同內(nèi)存的一樣,實際上以上單位是微機中常用的計量單位。目前二十二頁\總數(shù)一千二百八十九頁\編于十六點1.7CPU對存儲器的讀寫CPU要想進行數(shù)據(jù)的讀寫,必須和外部器件(標(biāo)準(zhǔn)的說法是芯片)進行三類信息的交互:存儲單元的地址(地址信息)器件的選擇,讀或?qū)懨睿刂菩畔ⅲ┳x或?qū)懙臄?shù)據(jù)(數(shù)據(jù)信息)目前二十三頁\總數(shù)一千二百八十九頁\編于十六點1.7CPU對存儲器的讀寫那么CPU是通過什么將地址、數(shù)據(jù)和控制信息傳到存儲芯片中的呢?電子計算機能處理、傳輸?shù)男畔⒍际请娦盘?,電信號?dāng)然要用導(dǎo)線傳送。目前二十四頁\總數(shù)一千二百八十九頁\編于十六點1.7CPU對存儲器的讀寫在計算機中專門有連接CPU和其他芯片的導(dǎo)線,通常稱為總線。物理上:一根根導(dǎo)線的集合;邏輯上劃分為:地址總線數(shù)據(jù)總線控制總線圖示目前二十五頁\總數(shù)一千二百八十九頁\編于十六點1.7CPU對存儲器的讀寫總線在邏輯上劃分的圖示:目前二十六頁\總數(shù)一千二百八十九頁\編于十六點1.7CPU對存儲器的讀寫CPU在內(nèi)存中讀或?qū)懙臄?shù)據(jù)演示:讀演示寫演示從上面我們知道CPU是如何進行數(shù)據(jù)讀寫的??墒俏覀?nèi)绾蚊钣嬎銠C進行數(shù)據(jù)的讀寫呢?目前二十七頁\總數(shù)一千二百八十九頁\編于十六點1.7CPU對存儲器的讀寫目前二十八頁\總數(shù)一千二百八十九頁\編于十六點1.7CPU對存儲器的讀寫目前二十九頁\總數(shù)一千二百八十九頁\編于十六點1.7CPU對存儲器的讀寫對于8086CPU,下面的機器碼能夠完成從3號單元讀數(shù)據(jù):含義:從3號單元讀取數(shù)據(jù)送入寄存器AXCPU接收這條機器碼后將完成上面所述的讀寫工作。目前三十頁\總數(shù)一千二百八十九頁\編于十六點1.7CPU對存儲器的讀寫機器碼難于記憶,用匯編指令來表示,情況如下:對應(yīng)的匯編指令:MOVAX,[3]含義:傳送3號單元的內(nèi)容到AX目前三十一頁\總數(shù)一千二百八十九頁\編于十六點1.8地址總線CPU是通過地址總線來指定存儲單元的。地址總線上能傳送多少個不同的信息,CPU就可以對多少個存儲單元進行尋址。目前三十二頁\總數(shù)一千二百八十九頁\編于十六點1.8地址總線地址總線發(fā)送地址信息演示目前三十三頁\總數(shù)一千二百八十九頁\編于十六點1.8地址總線目前三十四頁\總數(shù)一千二百八十九頁\編于十六點1.8地址總線一個CPU有N根地址總線,則可以說這個CPU的地址總線的寬度為N。這樣的CPU最多可以尋找2的N次方個內(nèi)存單元。目前三十五頁\總數(shù)一千二百八十九頁\編于十六點1.9數(shù)據(jù)總線CPU與內(nèi)存或其它器件之間的數(shù)據(jù)傳送是通過數(shù)據(jù)總線來進行的。數(shù)據(jù)總線的寬度決定了CPU和外界的數(shù)據(jù)傳送速度。目前三十六頁\總數(shù)一千二百八十九頁\編于十六點1.9數(shù)據(jù)總線我們來分別看一下它們向內(nèi)存中寫入數(shù)據(jù)89D8H時,是如何通過數(shù)據(jù)總線傳送數(shù)據(jù)的:8088CPU數(shù)據(jù)總線上的數(shù)據(jù)傳送情況8086CPU數(shù)據(jù)總線上的數(shù)據(jù)傳送情況目前三十七頁\總數(shù)一千二百八十九頁\編于十六點1.9數(shù)據(jù)總線8位數(shù)據(jù)總線上傳送的信息目前三十八頁\總數(shù)一千二百八十九頁\編于十六點1.9數(shù)據(jù)總線16位數(shù)據(jù)總線上傳送的信息目前三十九頁\總數(shù)一千二百八十九頁\編于十六點1.10控制總線CPU對外部器件的控制是通過控制總線來進行的。在這里控制總線是個總稱,控制總線是一些不同控制線的集合。有多少根控制總線,就意味著CPU提供了對外部器件的多少種控制。所以,控制總線的寬度決定了CPU對外部器件的控制能力。控制總線上發(fā)送的控制信息目前四十頁\總數(shù)一千二百八十九頁\編于十六點1.10控制總線目前四十一頁\總數(shù)一千二百八十九頁\編于十六點1.10控制總線前面所講的內(nèi)存讀或?qū)懨钍怯蓭赘刂凭€綜合發(fā)出的:其中有一根名為讀信號輸出控制線負(fù)責(zé)由CPU向外傳送讀信號,CPU向該控制線上輸出低電平表示將要讀取數(shù)據(jù);有一根名為寫信號輸出控制線負(fù)責(zé)由CPU向外傳送寫信號。目前四十二頁\總數(shù)一千二百八十九頁\編于十六點1.1節(jié)~1.10節(jié)小結(jié)(1)匯編指令是機器指令的助記符,同機器指令一一對應(yīng)。(2)每一種CPU都有自己的匯編指令集。目前四十三頁\總數(shù)一千二百八十九頁\編于十六點1.1節(jié)~1.10節(jié)小結(jié)(3)CPU可以直接使用的信息在存儲器中存放。(4)在存儲器中指令和數(shù)據(jù)沒有任何區(qū)別,都是二進制信息。目前四十四頁\總數(shù)一千二百八十九頁\編于十六點1.1節(jié)~1.10節(jié)小結(jié)(5)存儲單元從零開始順序編號。(6)一個存儲單元可以存儲8個bit(用作單位寫成“b”),即8位二進制數(shù)。(7)1B=8b 1KB=1024B1MB=1024KB 1GB=1024MB目前四十五頁\總數(shù)一千二百八十九頁\編于十六點1.1節(jié)~1.10節(jié)小結(jié)(續(xù))(8)每一個CPU芯片都有許多管腳,這些管腳和總線相連。也可以說,這些管腳引出總線。一個CPU可以引出三種總線的寬度標(biāo)志了這個CPU的不同方面的性能:地址總線的寬度決定了CPU的尋址能力;數(shù)據(jù)總線的寬度決定了CPU與其它器件進行數(shù)據(jù)傳送時的一次數(shù)據(jù)傳送量;控制總線寬度決定了CPU對系統(tǒng)中其它器件的控制能力。目前四十六頁\總數(shù)一千二百八十九頁\編于十六點1.1節(jié)~1.10節(jié)小結(jié)(續(xù))在匯編課程中,我們從功能的角度介紹了這三類總線,對實際的連接情況不做討論。特別提示目前四十七頁\總數(shù)一千二百八十九頁\編于十六點特別提示檢測點1.1(Page8)沒有通過檢測點請不要向下學(xué)習(xí)!

目前四十八頁\總數(shù)一千二百八十九頁\編于十六點1.11內(nèi)存地址空間(概述)什么是內(nèi)存地址空間呢?一個CPU的地址線寬度為10,那么可以尋址1024個內(nèi)存單元,這1024個可尋到的內(nèi)存單元就構(gòu)成這個CPU的內(nèi)存地址空間。下面深入討論。首先需要介紹兩部分基本知識,主板和接口卡。目前四十九頁\總數(shù)一千二百八十九頁\編于十六點1.12主板在每一臺PC機中,都有一個主板,主板上有核心器件和一些主要器件。這些器件通過總線(地址總線、數(shù)據(jù)總線、控制總線)相連。目前五十頁\總數(shù)一千二百八十九頁\編于十六點1.13接口卡計算機系統(tǒng)中,所有可用程序控制其工作的設(shè)備,必須受到CPU的控制。CPU對外部設(shè)備不能直接控制,如顯示器、音箱、打印機等。直接控制這些設(shè)備進行工作的是插在擴展插槽上的接口卡。目前五十一頁\總數(shù)一千二百八十九頁\編于十六點1.14各類存儲器芯片從讀寫屬性上看分為兩類:隨機存儲器(RAM)和只讀存儲器(ROM)從功能和連接上分類:隨機存儲器RAM裝有BIOS的ROM接口卡上的RAMPC機中各類存儲器的邏輯連接情況目前五十二頁\總數(shù)一千二百八十九頁\編于十六點1.14各類存儲器芯片裝有BIOS的ROMBIOS:BasicInput/OutputSystem,基本輸入輸出系統(tǒng)。BIOS是由主板和各類接口卡(如:顯卡、網(wǎng)卡等)廠商提供的軟件系統(tǒng),可以通過它利用該硬件設(shè)備進行最基本的輸入輸出。在主板和某些接口卡上插有存儲相應(yīng)BIOS的ROM。目前五十三頁\總數(shù)一千二百八十九頁\編于十六點目前五十四頁\總數(shù)一千二百八十九頁\編于十六點1.15內(nèi)存地址空間上述的那些存儲器在物理上是獨立的器件。但是它們在以下兩點上相同:1、都和CPU的總線相連。2、CPU對它們進行讀或?qū)懙臅r候都通過控制線發(fā)出內(nèi)存讀寫命令。目前五十五頁\總數(shù)一千二百八十九頁\編于十六點1.15內(nèi)存地址空間將各各類存儲器看作一個邏輯存儲器:所有的物理存儲器被看作一個由若干存儲單元組成的邏輯存儲器;每個物理存儲器在這個邏輯存儲器中占有一個地址段,即一段地址空間;CPU在這段地址空間中讀寫數(shù)據(jù),實際上就是在相對應(yīng)的物理存儲器中讀寫數(shù)據(jù)。目前五十六頁\總數(shù)一千二百八十九頁\編于十六點目前五十七頁\總數(shù)一千二百八十九頁\編于十六點1.15內(nèi)存地址空間假設(shè),上圖中的內(nèi)存空間地址段分配如下:地址0~7FFFH的32KB空間為主隨機存儲器的地址空間;地址8000H~9FFFH的8KB空間為顯存地址空間;地址A000H~FFFFH的24KB空間為各個ROM的地址空間。目前五十八頁\總數(shù)一千二百八十九頁\編于十六點1.15內(nèi)存地址空間不同的計算機系統(tǒng)的內(nèi)存地址空間分配情況是不同的。8086PC機內(nèi)存地址空間分配的基本情況目前五十九頁\總數(shù)一千二百八十九頁\編于十六點8086PC機的內(nèi)存地址空間分配目前六十頁\總數(shù)一千二百八十九頁\編于十六點1.15內(nèi)存地址空間內(nèi)存地址空間:最終運行程序的是CPU,我們用匯編編程的時候,必須要從CPU角度考慮問題。對CPU來講,系統(tǒng)中的所有存儲器中的存儲單元都處于一個統(tǒng)一的邏輯存儲器中,它的容量受CPU尋址能力的限制。這個邏輯存儲器即是我們所說的內(nèi)存地址空間。目前六十一頁\總數(shù)一千二百八十九頁\編于十六點小結(jié)目前六十二頁\總數(shù)一千二百八十九頁\編于十六點《匯編語言》課件

王爽著-清華大學(xué)出版社制作工具:MicrosoftPowerPoint2003本課件由匯編網(wǎng)()制作提供目前六十三頁\總數(shù)一千二百八十九頁\編于十六點第2章寄存器(CPU工作原理)2.1通用寄存器2.2字在寄存器中的存儲2.3幾條匯編指令2.4物理地址2.516位結(jié)構(gòu)的CPU2.68086CPU給出物理地址的方法2.7“段地址×16+偏移地址=物理地址”的本質(zhì)含義2.8段的概念2.9段寄存器2.10CS和IP2.12代碼段目前六十四頁\總數(shù)一千二百八十九頁\編于十六點CPU概述一個典型的CPU由運算器、控制器、寄存器等器件組成,這些器件靠內(nèi)部總線相連。內(nèi)部總線實現(xiàn)CPU內(nèi)部各個器件之間的聯(lián)系。外部總線實現(xiàn)CPU和主板上其它器件的聯(lián)系。目前六十五頁\總數(shù)一千二百八十九頁\編于十六點寄存器概述8086CPU有14個寄存器它們的名稱為:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。這些寄存器以后會陸續(xù)介紹目前六十六頁\總數(shù)一千二百八十九頁\編于十六點2.1通用寄存器8086CPU所有的寄存器都是16位的,可以存放兩個字節(jié)。AX、BX、CX、DX通常用來存放一般性數(shù)據(jù)被稱為通用寄存器。下面以AX為例,我們看一下寄存器的邏輯結(jié)構(gòu)。目前六十七頁\總數(shù)一千二百八十九頁\編于十六點一個16位寄存器可以存儲一個16位的數(shù)據(jù)。(數(shù)據(jù)的存放情況)一個16位寄存器所能存儲的數(shù)據(jù)的最大值為多少?答案:216-1。2.1通用寄存器目前六十八頁\總數(shù)一千二百八十九頁\編于十六點16位數(shù)據(jù)在寄存器中的存放情況數(shù)據(jù):18二進制表示:10010在寄存器AX中的存儲:目前六十九頁\總數(shù)一千二百八十九頁\編于十六點16位數(shù)據(jù)在寄存器中的存放情況數(shù)據(jù):20000在寄存器AX中的存儲:目前七十頁\總數(shù)一千二百八十九頁\編于十六點2.1通用寄存器8086上一代CPU中的寄存器都是8位的;為保證兼容性,這四個寄存器都可以分為兩個獨立的8位寄存器使用。AX可以分為AH和AL;BX可以分為BH和BL;CX可以分為CH和CL;DX可以分為DH和DL。8086CPU的8位寄存器存儲邏輯目前七十一頁\總數(shù)一千二百八十九頁\編于十六點2.1通用寄存器以AX為例,8086CPU的16位寄存器分為兩個8位寄存器的情況:目前七十二頁\總數(shù)一千二百八十九頁\編于十六點2.1通用寄存器AX的低8位(0位~7位)構(gòu)成了AL寄存器,高8位(8位~15位)構(gòu)成了AH寄存器。AH和AL寄存器是可以獨立使用的8位寄存器。8086CPU的8位寄存器數(shù)據(jù)存儲情況一個8位寄存器所能存儲的數(shù)據(jù)的最大值是多少?答案:28-1。目前七十三頁\總數(shù)一千二百八十九頁\編于十六點2.1通用寄存器目前七十四頁\總數(shù)一千二百八十九頁\編于十六點2.2字在寄存器中的存儲一個字可以存在一個16位寄存器中,這個字的高位字節(jié)和低位字節(jié)自然就存在這個寄存器的高8位寄存器和低8位寄存器中。目前七十五頁\總數(shù)一千二百八十九頁\編于十六點關(guān)于數(shù)制的討論由于一個內(nèi)存單元可以存放8位數(shù)據(jù),CPU中的寄存器又可存放n個8位數(shù)據(jù)。也就是說,計算機中的數(shù)據(jù)大多是由1~N個8位數(shù)據(jù)構(gòu)成的。用十六進制來表示數(shù)據(jù)可以直觀的看出這個數(shù)據(jù)是由哪些8位數(shù)據(jù)構(gòu)成的。示例目前七十六頁\總數(shù)一千二百八十九頁\編于十六點2.3幾條匯編指令匯編指令不區(qū)分大小寫目前七十七頁\總數(shù)一千二百八十九頁\編于十六點2.3幾條匯編指令CPU執(zhí)行下表中的程序段的每條指令后,對寄存器中的數(shù)據(jù)進行的改變。目前七十八頁\總數(shù)一千二百八十九頁\編于十六點2.3幾條匯編指令目前七十九頁\總數(shù)一千二百八十九頁\編于十六點2.3幾條匯編指令這里的丟失,指的是進位制不能在8位寄存器中保存,但是CPU不是并真的不丟棄這個進位值,這個問題會在后面的課程中討論。目前八十頁\總數(shù)一千二百八十九頁\編于十六點特別提示檢測點2.1(Page18)沒有通過檢測點請不要向下學(xué)習(xí)!目前八十一頁\總數(shù)一千二百八十九頁\編于十六點2.4物理地址CPU訪問內(nèi)存單元時要給出內(nèi)存單元的地址。所有的內(nèi)存單元構(gòu)成的存儲空間是一個一維的線性空間。每一個內(nèi)存單元在這個空間中都有唯一的地址,這個唯一的地址稱為物理地址。目前八十二頁\總數(shù)一千二百八十九頁\編于十六點2.516位結(jié)構(gòu)的CPU概括的講,16位結(jié)構(gòu)描述了一個CPU具有以下幾個方面特征:1、運算器一次最多可以處理16位的數(shù)據(jù)。2、寄存器的最大寬度為16位。3、寄存器和運算器之間的通路是16位的。目前八十三頁\總數(shù)一千二百八十九頁\編于十六點2.68086CPU給出物理地址的方法8086有20位地址總線,可傳送20位地址,尋址能力為1M。8086內(nèi)部為16位結(jié)構(gòu),它只能傳送16位的地址,表現(xiàn)出的尋址能力卻只有64K。目前八十四頁\總數(shù)一千二百八十九頁\編于十六點2.68086CPU給出物理地址的方法8086CPU采用一種在內(nèi)部用兩個16位地址合成的方法來形成一個20位的物理地址。8086CPU相關(guān)部件的邏輯結(jié)構(gòu)目前八十五頁\總數(shù)一千二百八十九頁\編于十六點在8086CPU內(nèi)部用兩個16位地址合成的方法來形成一個20位的物理地址目前八十六頁\總數(shù)一千二百八十九頁\編于十六點地址加法器地址加法器合成物理地址的方法:物理地址=段地址×16+偏移地址例如:

8086CPU訪問地址為123C8H的內(nèi)存單元由段地址×16引發(fā)的討論目前八十七頁\總數(shù)一千二百八十九頁\編于十六點目前八十八頁\總數(shù)一千二百八十九頁\編于十六點觀察移位次數(shù)和各種形式數(shù)據(jù)的關(guān)系:(1)一個數(shù)據(jù)的二進制形式左移1位,相當(dāng)于該數(shù)據(jù)乘以2;(2)一個數(shù)據(jù)的二進制形式左移N位,相當(dāng)于該數(shù)據(jù)乘以2的N次方;(3)地址加法器如何完成段地址×16的運算?以二進制形式存放的段地址左移4位。由段地址×16引發(fā)的討論目前八十九頁\總數(shù)一千二百八十九頁\編于十六點2.7“段地址×16+偏移地址=物理地址”的本質(zhì)含義兩個比喻說明:說明“基礎(chǔ)地址+偏移地址=物理地址”的思想:第一個比喻說明“段地址×16+偏移地址=物理地址”的思想:第二個比喻8086CPU就是這樣一個只能提供兩張3位數(shù)據(jù)紙條的CPU。目前九十頁\總數(shù)一千二百八十九頁\編于十六點“基礎(chǔ)地址+偏移地址=物理地址”比如說,學(xué)校、體育館同在一條筆直的單行路上(學(xué)校位于路的起點0米處)。讀者在學(xué)校,要去圖書館,問我那里的地址,我可以用幾種方式描述這個地址?目前九十一頁\總數(shù)一千二百八十九頁\編于十六點“基礎(chǔ)地址+偏移地址=物理地址”(1)從學(xué)校走2826m到圖書館。這2826可以認(rèn)為是圖書館的物理地址。(2)從學(xué)校走2000m到體育館,從體育館再走826m到圖書館。第一個距離2000m是相對于起點的基礎(chǔ)地址;第二個距離826m是將對于基礎(chǔ)地址的偏移地址。目前九十二頁\總數(shù)一千二百八十九頁\編于十六點“段地址×16+偏移地址=物理地址”比如我們只能通過紙條來通信,讀者問我圖書館的地址,我只能將它寫在紙上告訴讀者。顯然我必須有一張可以容納4位數(shù)據(jù)的紙條才能寫下2826這個數(shù)據(jù):目前九十三頁\總數(shù)一千二百八十九頁\編于十六點“段地址×16+偏移地址=物理地址”不巧的是,沒有能容納4位數(shù)據(jù)的紙條,僅有兩張可以容納3位數(shù)據(jù)的紙條。這樣我只能以這種方式告訴讀者2826這個數(shù)據(jù):目前九十四頁\總數(shù)一千二百八十九頁\編于十六點2.8段的概念錯誤認(rèn)識:內(nèi)存被劃分成了一個一個的段,每一個段有一個段地址。其實:內(nèi)存并沒有分段,段的劃分來自于CPU,由于8086CPU用“(段地址×16)+偏移地址=物理地址”的方式給出內(nèi)存單元的物理地址,使得我們可以用分段的方式來管理內(nèi)存。目前九十五頁\總數(shù)一千二百八十九頁\編于十六點2.8段的概念我們可以認(rèn)為:地址10000H~100FFH的內(nèi)存單元組成一個段,該段的起始地址(基礎(chǔ)地址)為10000H,段地址為1000H,大小為100H。目前九十六頁\總數(shù)一千二百八十九頁\編于十六點2.8段的概念我們也可以認(rèn)為地址10000H~1007FH、10080H~100FFH的內(nèi)存單元組成兩個段,它們的起始地址(基礎(chǔ)地址)為10000H和10080H,段地址為:1000H和1008H,大小都為80H。目前九十七頁\總數(shù)一千二百八十九頁\編于十六點2.8段的概念以后,在編程時可以根據(jù)需要,將若干地址連續(xù)的內(nèi)存單元看作一個段,用段地址×16定位段的起始地址(基礎(chǔ)地址),用偏移地址定位段中的內(nèi)存單元。兩點需要注意內(nèi)存單元地址小結(jié)特別提示目前九十八頁\總數(shù)一千二百八十九頁\編于十六點兩點需要注意(1)段地址×16必然是16的倍數(shù),所以一個段的起始地址也一定是16的倍數(shù);(2)偏移地址為16位,16位地址的尋址能力為64K,所以一個段的長度最大為64K。目前九十九頁\總數(shù)一千二百八十九頁\編于十六點內(nèi)存單元地址小結(jié)CPU訪問內(nèi)存單元時,必須向內(nèi)存提供內(nèi)存單元的物理地址。8086CPU在內(nèi)部用段地址和偏移地址移位相加的方法形成最終的物理地址。思考兩個問題目前一百頁\總數(shù)一千二百八十九頁\編于十六點(1)觀察下面的地址,讀者有什么發(fā)現(xiàn)?結(jié)論:CPU可以用不同的段地址和偏移地址形成同一個物理地址。內(nèi)存單元地址小結(jié)目前一百零一頁\總數(shù)一千二百八十九頁\編于十六點內(nèi)存單元地址小結(jié)(2)如果給定一個段地址,僅通過變化偏移地址來進行尋址,最多可以定位多少內(nèi)存單元?結(jié)論:偏移地址16位,變化范圍為0~FFFFH,僅用偏移地址來尋址最多可尋64K個內(nèi)存單元。比如:給定段地址1000H,用偏移地址尋址,CPU的尋址范圍為:10000H~1FFFFH。目前一百零二頁\總數(shù)一千二百八十九頁\編于十六點內(nèi)存單元地址小結(jié)在8086PC機中,存儲單元的地址用兩個元素來描述。即段地址和偏移地址?!皵?shù)據(jù)在21F60H內(nèi)存單元中。”對于8086PC機的兩種描述:(a)數(shù)據(jù)存在內(nèi)存2000:1F60單元中;(b)數(shù)據(jù)存在內(nèi)存的2000段中的1F60H單元中??筛鶕?jù)需要,將地址連續(xù)、起始地址為16的倍數(shù)的一組內(nèi)存單元定義為一個段。目前一百零三頁\總數(shù)一千二百八十九頁\編于十六點特別提示檢測點2.2(Page23)沒有通過檢測點請不要向下學(xué)習(xí)!目前一百零四頁\總數(shù)一千二百八十九頁\編于十六點2.9段寄存器段寄存器就是提供段地址的。8086CPU有4個段寄存器: CS、DS、SS、ES當(dāng)8086CPU要訪問內(nèi)存時,由這4個段寄存器提供內(nèi)存單元的段地址。目前一百零五頁\總數(shù)一千二百八十九頁\編于十六點2.10CS和IPCS和IP是8086CPU中最關(guān)鍵的寄存器,它們指示了CPU當(dāng)前要讀取指令的地址。CS為代碼段寄存器;IP為指令指針寄存器。目前一百零六頁\總數(shù)一千二百八十九頁\編于十六點8086PC讀取和執(zhí)行指令相關(guān)部件8086PC讀取和執(zhí)行指令演示8086PC工作過程的簡要描述目前一百零七頁\總數(shù)一千二百八十九頁\編于十六點目前一百零八頁\總數(shù)一千二百八十九頁\編于十六點8086PC工作過程的簡要描述(1)從CS:IP指向內(nèi)存單元讀取指令,讀取的指令進入指令緩沖器;(2)IP=IP+所讀取指令的長度,從而指向下一條指令;(3)執(zhí)行指令。轉(zhuǎn)到步驟(1),重復(fù)這個過程。目前一百零九頁\總數(shù)一千二百八十九頁\編于十六點8086PC工作過程的簡要描述在8086CPU加電啟動或復(fù)位后(即CPU剛開始工作時)CS和IP被設(shè)置為CS=FFFFH,IP=0000H,即在8086PC機剛啟動時,CPU從內(nèi)存FFFF0H單元中讀取指令執(zhí)行,F(xiàn)FFF0H單元中的指令是8086PC機開機后執(zhí)行的第一條指令。目前一百一十頁\總數(shù)一千二百八十九頁\編于十六點2.10CS和IP內(nèi)存中指令和數(shù)據(jù)沒有任何區(qū)別,都是二進制信息,CPU在工作的時候把有的信息看作指令,有的信息看作數(shù)據(jù)。CPU根據(jù)什么將內(nèi)存中的信息看作指令?CPU將CS:IP指向的內(nèi)存單元中的內(nèi)容看作指令。目前一百一十一頁\總數(shù)一千二百八十九頁\編于十六點2.10CS和IP在任何時候,CPU將CS、IP中的內(nèi)容當(dāng)作指令的段地址和偏移地址,用它們合成指令的物理地址,到內(nèi)存中讀取指令碼,執(zhí)行。如果說,內(nèi)存中的一段信息曾被CPU執(zhí)行過的話,那么,它所在的內(nèi)存單元必然被CS:IP指向過。目前一百一十二頁\總數(shù)一千二百八十九頁\編于十六點2.11修改CS、IP的指令在CPU中,程序員能夠用指令讀寫的部件只有寄存器,程序員可以通過改變寄存器中的內(nèi)容實現(xiàn)對CPU的控制。CPU從何處執(zhí)行指令是由CS、IP中的內(nèi)容決定的,程序員可以通過改變CS、IP中的內(nèi)容來控制CPU執(zhí)行目標(biāo)指令。我們?nèi)绾胃淖僀S、IP的值呢?目前一百一十三頁\總數(shù)一千二百八十九頁\編于十六點2.11修改CS、IP的指令8086CPU必須提供相應(yīng)的指令先回想我們?nèi)绾涡薷腁X中的值?mov指令不能用于設(shè)置CS、IP的值,8086CPU沒有提供這樣的功能。8086CPU為CS、IP提供了另外的指令來改變它們的值:轉(zhuǎn)移指令目前一百一十四頁\總數(shù)一千二百八十九頁\編于十六點如何修改AX中的值?mov指令如:movax,123mov指令可以改變8086CPU大部分寄存器的值,被稱為傳送指令。能夠通過mov指令改變CS、IP的值嗎?目前一百一十五頁\總數(shù)一千二百八十九頁\編于十六點2.11修改CS、IP的指令同時修改CS、IP的內(nèi)容: jmp段地址:偏移地址 jmp2AE3:3 jmp3:0B16 功能:用指令中給出的段地址修改CS,偏移地址修改IP。目前一百一十六頁\總數(shù)一千二百八十九頁\編于十六點2.11修改CS、IP的指令僅修改IP的內(nèi)容: jmp某一合法寄存器 jmpax(類似于movIP,ax) jmpbx 功能:用寄存器中的值修改IP。目前一百一十七頁\總數(shù)一千二百八十九頁\編于十六點內(nèi)存中存放的機器碼和對應(yīng)匯編指令情況:(初始:CS=2000H,IP=0000H)請寫出指令執(zhí)行序列:問題分析目前一百一十八頁\總數(shù)一千二百八十九頁\編于十六點問題分析結(jié)果:(1)movax,6622(2)jmp1000:3(3)movax,0000(4)movbx,ax(5)jmpbx(6)movax,0123H(7)轉(zhuǎn)到第(3)步執(zhí)行目前一百一十九頁\總數(shù)一千二百八十九頁\編于十六點2.12代碼段對于8086PC機,在編程時,可以根據(jù)需要,將一組內(nèi)存單元定義為一個段??梢詫㈤L度為N(N≤64KB)的一組代碼,存在一組地址連續(xù)、起始地址為16的倍數(shù)的內(nèi)存單元中,這段內(nèi)存是用來存放代碼的,從而定義了一個代碼段。例如目前一百二十頁\總數(shù)一千二百八十九頁\編于十六點2.12代碼段這段長度為10字節(jié)的字節(jié)的指令,存在從123B0H~123B9H的一組內(nèi)存單元中,我們就可以認(rèn)為,123B0H~123B9H這段內(nèi)存單元是用來存放代碼的,是一個代碼段,它的段地址為123BH,長度為10字節(jié)。目前一百二十一頁\總數(shù)一千二百八十九頁\編于十六點2.12代碼段如何使得代碼段中的指令被執(zhí)行呢?將一段內(nèi)存當(dāng)作代碼段,僅僅是我們在編程時的一種安排,CPU并不會由于這種安排,就自動地將我們定義得代碼段中的指令當(dāng)作指令來執(zhí)行。CPU只認(rèn)被CS:IP指向的內(nèi)存單元中的內(nèi)容為指令。所以要將CS:IP指向所定義的代碼段中的第一條指令的首地址。CS=123BH,IP=0000H。目前一百二十二頁\總數(shù)一千二百八十九頁\編于十六點2.9節(jié)~2.12節(jié)小結(jié)1、段地址在8086CPU的寄存器中存放。當(dāng)8086CPU要訪問內(nèi)存時,由段寄存器提供內(nèi)存單元的段地址。8086CPU有4個段寄存器,其中CS用來存放指令的段地址。2、CS存放指令的段地址,IP存放指令的偏移地址。8086機中,任意時刻,CPU將CS:IP指向的內(nèi)容當(dāng)作指令執(zhí)行。目前一百二十三頁\總數(shù)一千二百八十九頁\編于十六點2.9節(jié)~2.12節(jié)小結(jié)(續(xù))3、8086CPU的工作過程:(1)從CS:IP指向內(nèi)存單元讀取指令,讀取的指令進入指令緩沖器;(2)IP指向下一條指令;(3)執(zhí)行指令。(轉(zhuǎn)到步驟(1),重復(fù)這個過程。)4、8086CPU提供轉(zhuǎn)移指令修改CS、IP的內(nèi)容。目前一百二十四頁\總數(shù)一千二百八十九頁\編于十六點特別提示檢測點2.3(Page33)沒有通過檢測點請不要向下學(xué)習(xí)!目前一百二十五頁\總數(shù)一千二百八十九頁\編于十六點小結(jié)目前一百二十六頁\總數(shù)一千二百八十九頁\編于十六點《匯編語言》課件

王爽著-清華大學(xué)出版社制作工具:MicrosoftPowerPoint2003本課件由匯編網(wǎng)()制作提供目前一百二十七頁\總數(shù)一千二百八十九頁\編于十六點第3章寄存器(內(nèi)存訪問)3.1內(nèi)存中字的存儲3.2DS和[address]3.3字的傳送3.4mov、add、sub指令3.5數(shù)據(jù)段3.6棧3.7CPU提供的棧機制3.8棧頂超界的問題3.9push、pop指令3.10棧段目前一百二十八頁\總數(shù)一千二百八十九頁\編于十六點引言在第2章中,我們主要從CPU如何執(zhí)行指令的角度講解了8086CPU的邏輯結(jié)構(gòu)、形成物理地址的方法、相關(guān)的寄存器以及一些指令。這一章中,我們從訪問內(nèi)存的角度繼續(xù)學(xué)習(xí)幾個寄存器。目前一百二十九頁\總數(shù)一千二百八十九頁\編于十六點在0地址處開始存放20000:0號單元是低地址單元,1號單元是高地址單元。3.1內(nèi)存中字的存儲目前一百三十頁\總數(shù)一千二百八十九頁\編于十六點3.1內(nèi)存中字的存儲問題:(1)0地址單元中存放的字節(jié)型數(shù)據(jù)是多少?(2)0地址字單元中存放的字型數(shù)據(jù)是多少?(3)2地址字單元中存放的字節(jié)型數(shù)據(jù)是多少?目前一百三十一頁\總數(shù)一千二百八十九頁\編于十六點3.1內(nèi)存中字的存儲問題(續(xù)):(4)2地址單元中存放的字型數(shù)據(jù)是多少?(5)1地址字單元中存放的字型數(shù)據(jù)是多少?結(jié)論目前一百三十二頁\總數(shù)一千二百八十九頁\編于十六點3.1內(nèi)存中字的存儲結(jié)論:任何兩個地址連續(xù)的內(nèi)存單元,N號單元和N+1號單元,可以將它們看成兩個內(nèi)存單元,也可以看成一個地址為N的字單元中的高位字節(jié)單元和低位字節(jié)單元。目前一百三十三頁\總數(shù)一千二百八十九頁\編于十六點3.2DS和[address]CPU要讀取一個內(nèi)存單元的時候,必須先給出這個內(nèi)存單元的地址;在8086PC中,內(nèi)存地址由段地址和偏移地址組成。8086CPU中有一個DS寄存器,通常用來存放要訪問的數(shù)據(jù)的段地址。例如目前一百三十四頁\總數(shù)一千二百八十九頁\編于十六點3.2DS和[address]例如:我們要讀取10000H單元的內(nèi)容可以用如下程序段進行:movbx,1000Hmovds,bx

moval,[0]上面三條指令將10000H(1000:0)中的數(shù)據(jù)讀到al中。目前一百三十五頁\總數(shù)一千二百八十九頁\編于十六點3.2DS和[address]moval,[0]已知的mov指令可完成的兩種傳送功能:(1)將數(shù)據(jù)直接送入寄存器;(2)將一個寄存器中的內(nèi)容送入另一個寄存器中。mov指令還可以將一個內(nèi)存單元中的內(nèi)容送入一個寄存器。目前一百三十六頁\總數(shù)一千二百八十九頁\編于十六點3.2DS和[address]從哪個內(nèi)存單元送到哪個寄存器中呢?mov指令的格式:mov寄存器名,內(nèi)存單元地址“[…]”表示一個內(nèi)存單元,“[…]”中的0表示內(nèi)存單元的偏移地址。那么內(nèi)存單元的段地址是多少呢?目前一百三十七頁\總數(shù)一千二百八十九頁\編于十六點3.2DS和[address]執(zhí)行指令時,8086CPU自動取DS中的數(shù)據(jù)為內(nèi)存單元的段地址。如何用mov指令從10000H中讀取數(shù)據(jù)?10000H表示為1000:0(段地址:偏移地址)將段地址1000H放入ds用moval,[0]完成傳送(mov指令中的[]說明操作對象是一個內(nèi)存單元,[]中的0說明這個內(nèi)存單元的偏移地址是0,它的段地址默認(rèn)放在ds中)如何把1000H送入ds?目前一百三十八頁\總數(shù)一千二百八十九頁\編于十六點3.2DS和[address]如何把1000H送入ds?傳送指令movax,1相似的方式movds,1000H?8086CPU不支持將數(shù)據(jù)直接送入段寄存器的操作,ds是一個段寄存器。(硬件設(shè)計的問題)movds,1000H是非法的。數(shù)據(jù)一般的寄存器段寄存器目前一百三十九頁\總數(shù)一千二百八十九頁\編于十六點3.2DS和[address]問題:寫幾條指令,將al中的數(shù)據(jù)送入內(nèi)存單元10000H?(思考后分析)分析問題本質(zhì):怎樣將數(shù)據(jù)從寄存器送入內(nèi)存單元?結(jié)論:movbx,1000Hmovds,bxmov[0],al(一種合理的回答)目前一百四十頁\總數(shù)一千二百八十九頁\編于十六點3.3字的傳送因為8086CPU是16位結(jié)構(gòu),有16根數(shù)據(jù)線,所以,可以一次性傳送16位的數(shù)據(jù),也就是一次性傳送一個字。

目前一百四十一頁\總數(shù)一千二百八十九頁\編于十六點問題3.3:內(nèi)存中的情況如右圖,寫出下面指令執(zhí)行后寄存器ax,bx,cx中的值。思考后看分析。(單步跟蹤)3.3字的傳送目前一百四十二頁\總數(shù)一千二百八十九頁\編于十六點問題3.3分析目前一百四十三頁\總數(shù)一千二百八十九頁\編于十六點問題3.4:內(nèi)存中的情況如右圖,寫出下面指令執(zhí)行后寄存器ax,bx,cx中的值。思考后看分析。(單步跟蹤)3.3字的傳送目前一百四十四頁\總數(shù)一千二百八十九頁\編于十六點問題3.4分析目前一百四十五頁\總數(shù)一千二百八十九頁\編于十六點3.4mov、add、sub指令已學(xué)mov指令的幾種形式:mov寄存器,數(shù)據(jù)mov寄存器,寄存器mov寄存器,內(nèi)存單元mov內(nèi)存單元,寄存器mov段寄存器,寄存器根據(jù)已知指令進行推測目前一百四十六頁\總數(shù)一千二百八十九頁\編于十六點3.4mov、add、sub指令根據(jù)已知指令進行推測:mov段寄存器,寄存器 mov寄存器,段寄存器(驗證)mov內(nèi)存單元,寄存器 mov內(nèi)存單元,段寄存器 mov段寄存器,內(nèi)存單元目前一百四十七頁\總數(shù)一千二百八十九頁\編于十六點驗證(Debug)mov段寄存器,寄存器 mov寄存器,段寄存器目前一百四十八頁\總數(shù)一千二百八十九頁\編于十六點add和sub指令同mov一樣,都有兩個操作對象。它們可以對段寄存器進行操作嗎? (請自行在Debug中試驗)3.4mov、add、sub指令目前一百四十九頁\總數(shù)一千二百八十九頁\編于十六點3.5數(shù)據(jù)段前面講過,對于8086PC機,我們可以根據(jù)需要將一組內(nèi)存單元定義為一個段。我們可以將一組長度為N(N≤64K)、地址連續(xù)、起始地址為16的倍數(shù)的內(nèi)存單元當(dāng)作專門存儲數(shù)據(jù)的內(nèi)存空間,從而定義了一個數(shù)據(jù)段。比如我們用123B0H~123B9H這段空間來存放數(shù)據(jù):段地址:123BH長度:10字節(jié)目前一百五十頁\總數(shù)一千二百八十九頁\編于十六點3.5數(shù)據(jù)段如何訪問數(shù)據(jù)段中的數(shù)據(jù)呢?將一段內(nèi)存當(dāng)作數(shù)據(jù)段,是我們在編程時的一種安排,我們可以在具體操作的時候,用ds存放數(shù)據(jù)段的段地址,再根據(jù)需要,用相關(guān)指令訪問數(shù)據(jù)段中的具體單元。示例目前一百五十一頁\總數(shù)一千二百八十九頁\編于十六點3.5數(shù)據(jù)段我們將123B0H~123BAH的內(nèi)存單元定義為數(shù)據(jù)段,我們現(xiàn)在要累加這個數(shù)據(jù)段中的前3個單元中的數(shù)據(jù),代碼如下:目前一百五十二頁\總數(shù)一千二百八十九頁\編于十六點3.5數(shù)據(jù)段問題3.5寫幾條指令,累加數(shù)據(jù)段中的前3個字型數(shù)據(jù)。思考后看分析。目前一百五十三頁\總數(shù)一千二百八十九頁\編于十六點問題3.5分析注意:一個字型數(shù)據(jù)占兩個單元,所以偏移地址是0、2、4。目前一百五十四頁\總數(shù)一千二百八十九頁\編于十六點3.1節(jié)~3.5節(jié)小結(jié)(1)字在內(nèi)存中存儲時,要用兩個地址連續(xù)的內(nèi)存單元來存放,字的低位字節(jié)存放在低地址單元中,高位字節(jié)存放再高地址單元中。(2)用mov指令要訪問內(nèi)存單元,可以在mov指令中只給出單元的偏移地址,此時,段地址默認(rèn)在DS寄存器中。(3)[address]表示一個偏移地址為address的內(nèi)存單元。目前一百五十五頁\總數(shù)一千二百八十九頁\編于十六點3.1節(jié)~3.5節(jié)小結(jié)(續(xù))(4)在內(nèi)存和寄存器之間傳送字型數(shù)據(jù)時,高地址單元和高8位寄存器、低地址單元和低8位寄存器相對應(yīng)。(5)mov、add、sub是具有兩個操作對象的指令。jmp是具有一個操作對象的指令。(6)可以根據(jù)自己的推測,在Debug中實驗指令的新格式。特別提示目前一百五十六頁\總數(shù)一千二百八十九頁\編于十六點特別提示檢測點3.1(p52)沒有通過檢測點請不要向下學(xué)習(xí)!目前一百五十七頁\總數(shù)一千二百八十九頁\編于十六點3.6棧我們研究棧的角度:棧是一種具有特殊的訪問方式的存儲空間。它的特殊性就在于,最后進入這個空間的數(shù)據(jù),最先出去??梢杂靡粋€盒子和3本書來描述

棧的操作方式目前一百五十八頁\總數(shù)一千二百八十九頁\編于十六點目前一百五十九頁\總數(shù)一千二百八十九頁\編于十六點目前一百六十頁\總數(shù)一千二百八十九頁\編于十六點3.6棧棧有兩個基本的操作:入棧和出棧。入棧:將一個新的元素放到棧頂;出棧:從棧頂取出一個元素。棧頂?shù)脑乜偸亲詈笕霔#枰鰲r,又最先被從棧中取出。棧的操作規(guī)則:LIFO (LastInFirstOut,后進先出)目前一百六十一頁\總數(shù)一千二百八十九頁\編于十六點3.7CPU提供的棧機制現(xiàn)今的CPU中都有棧的設(shè)計。8086CPU提供相關(guān)的指令來以棧的方式訪問內(nèi)存空間。這意味著,我們在基于8086CPU編程的時候,可以將一段內(nèi)存當(dāng)作棧來使用。目前一百六十二頁\總數(shù)一千二百八十九頁\編于十六點3.7CPU提供的棧機制8086CPU提供入棧和出棧指令:(最基本的)PUSH(入棧)POP(出棧)pushax:將寄存器ax中的數(shù)據(jù)送入棧中;popax:從棧頂取出數(shù)據(jù)送入ax。8086CPU的入棧和出棧操作都是以字為單位進行的。目前一百六十三頁\總數(shù)一千二百八十九頁\編于十六點3.6棧下面舉例說明,我們可以將10000H~1000FH這段內(nèi)存當(dāng)作棧來使用。下面一段指令的執(zhí)行過程:movax,0123Hpushaxmovbx,2266Hpushbxmovcx,1122Hpushcxpopaxpopbxpopcx目前一百六十四頁\總數(shù)一千二百八十九頁\編于十六點3.6棧指令序列的執(zhí)行過程演示注意:字型數(shù)據(jù)用兩個單元存放,高地址單元放高8位,低地址單元放低8位。是否有疑惑?

兩個疑問

目前一百六十五頁\總數(shù)一千二百八十九頁\編于十六點目前一百六十六頁\總數(shù)一千二百八十九頁\編于十六點兩個疑問1、CPU如何知道一段內(nèi)存空間被當(dāng)作棧使用?2、執(zhí)行push和pop的時候,如何知道哪個單元是棧頂單元?分析結(jié)論:任意時刻,SS:SP指向棧頂元素。

目前一百六十七頁\總數(shù)一千二百八十九頁\編于十六點對于兩個疑問的分析回想:CPU如何指導(dǎo)當(dāng)前要執(zhí)行的指令所在的位置?寄存器CS和IP中存放著當(dāng)前指令的段地址和偏移地址。8086CPU中,有兩個寄存器: 段寄存器SS存放棧頂?shù)亩蔚刂? 寄存器SP存放棧頂?shù)钠频刂啡我鈺r刻,SS:SP指向棧頂元素。目前一百六十八頁\總數(shù)一千二百八十九頁\編于十六點push指令的執(zhí)行過程pushax(1)SP=SP–2;(2)將ax中的內(nèi)容送入SS:SP指向的內(nèi)存單元處,SS:SP此時指向新棧頂。圖示目前一百六十九頁\總數(shù)一千二百八十九頁\編于十六點push指令的執(zhí)行過程目前一百七十頁\總數(shù)一千二百八十九頁\編于十六點3.6棧問題3.6:如果我們將10000H~1000FH這段空間當(dāng)作棧,初始狀態(tài)棧是空的,此時,SS=1000H,SP=?思考后看分析。目前一百七十一頁\總數(shù)一千二百八十九頁\編于十六點問題3.6分析SP=0010H目前一百七十二頁\總數(shù)一千二百八十九頁\編于十六點問題3.6分析(續(xù))我們將10000H~1000FH這段空間當(dāng)作棧段,SS=1000H,??臻g大小為16字節(jié),棧最底部的字單元地址為1000:000E。任意時刻,SS:SP指向棧頂,當(dāng)棧中只有一個元素的時候,SS=1000H,SP=000EH。目前一百七十三頁\總數(shù)一千二百八十九頁\編于十六點問題3.6分析(續(xù))棧為空,就相當(dāng)于棧中唯一的元素出棧,出棧后,SP=SP+2,SP原來為000EH,加2后SP=10H,所以,當(dāng)棧為空的時候,SS=1000H,SP=10H。換個角度看目前一百七十四頁\總數(shù)一千二百八十九頁\編于十六點問題3.6分析(續(xù))換個角度看:任意時刻,SS:SP指向棧頂元素,當(dāng)棧為空的時候,棧中沒有元素,也就不存在棧頂元素,所以SS:SP只能指向棧的最底部單元下面的單元,該單元的偏移地址為棧最底部的字單元的偏移地址+2,棧最底部字單元的地址為1000:000E,所以??諘r,SP=0010H。目前一百七十五頁\總數(shù)一千二百八十九頁\編于十六點pop指令的執(zhí)行過程popax(1)將SS:SP指向的內(nèi)存單元處的數(shù)據(jù)送入ax中;(2)SP=SP+2,SS:SP指向當(dāng)前棧頂下面的單元,以當(dāng)前棧頂下面的單元為新的棧頂。圖示目前一百七十六頁\總數(shù)一千二百八十九頁\編于十六點pop指令的執(zhí)行過程注意目前一百七十七頁\總數(shù)一千二百八十九頁\編于十六點pop指令的執(zhí)行過程注意:出棧后,SS:SP指向新的棧頂1000EH,pop操作前的棧頂元素,1000CH處的2266H依然存在,但是,它已不在棧中。當(dāng)再次執(zhí)行push等入棧指令后,SS:SP移至1000CH,并在里面寫入新的數(shù)據(jù),它將被覆蓋。目前一百七十八頁\總數(shù)一千二百八十九頁\編于十六點3.8棧頂超界的問題SS和SP只記錄了棧頂?shù)牡刂?,依靠SS和SP可以保證在入棧和出棧時找到棧頂??墒?,如何能夠保證在入棧、出棧時,棧頂不會超出棧空間?目前一百七十九頁\總數(shù)一千二百八十九頁\編于十六點3.8棧頂超界的問題當(dāng)棧滿的時候再使用push指令入棧,

??盏臅r候再使用pop指令出棧,都將發(fā)生棧頂超界問題。棧頂超界是危險的。目前一百八十頁\總數(shù)一千二百八十九頁\編于十六點目前一百八十一頁\總數(shù)一千二百八十九頁\編于十六點目前一百八十二頁\總數(shù)一千二百八十九頁\編于十六點3.8棧頂超界的問題棧頂超界是危險的:因為我們既然將一段空間安排為棧,那么在??臻g之外的空間里很可能存放了具有其他用途的數(shù)據(jù)、代碼等,這些數(shù)據(jù)、代碼可能是我們自己的程序中的,也可能是別的程序中的。(畢竟一個計算機系統(tǒng)并不是只有我們自己的程序在運行)目前一百八十三頁\總數(shù)一千二百八十九頁\編于十六點3.8棧頂超界的問題但是由于我們在入棧出棧時的不小心,而將這些數(shù)據(jù)、代碼意外地改寫,將會引發(fā)一連串的錯誤。我們當(dāng)然希望CPU可以幫我們解決這個問題,目前一百八十四頁\總數(shù)一千二百八十九頁\編于十六點3.8棧頂超界的問題比如說在CPU中有記錄棧頂上限和下限的寄存器,我們可以通過填寫這些寄存器來指定??臻g的范圍,然后,CPU在執(zhí)行push指令的時候靠檢測棧頂上限寄存器,在執(zhí)行pop指令的時候靠檢測棧頂下限寄存器保證不會超界。實際情況:8086CPU中并沒有這樣的寄存器。目前一百八十五頁\總數(shù)一千二百八十九頁\編于十六點3.8棧頂超界的問題8086CPU不保證對棧的操作不會超界。這就是說,8086CPU只知道棧頂在何處(由SS:SP指示),而不知道讀者安排的??臻g有多大。這點就好像,CPU只知道當(dāng)前要執(zhí)行的指令在何處(由CS:SP指示)而不知道讀者要執(zhí)行的指令有多少。從這兩點我們可以看出目前一百八十六頁\總數(shù)一千二百八十九頁\編于十六點3.8棧頂超界的問題8086CPU的工作機理,只考慮當(dāng)前的情況:當(dāng)前棧頂在何處;當(dāng)前要執(zhí)行的指令是哪一條。結(jié)論目前一百八十七頁\總數(shù)一千二百八十九頁\編于十六點3.8棧頂超界的問題結(jié)論:我們在編程的時候要自己操心棧頂超界的問題,要根據(jù)可能用到的最大??臻g,來安排棧的大小,防止入棧的數(shù)據(jù)太多而導(dǎo)致的超界;執(zhí)行出棧操作的時候也要注意,以防??盏臅r候繼續(xù)出棧而導(dǎo)致的超界。目前一百八十八頁\總數(shù)一千二百八十九頁\編于十六點3.9push、pop指令push和pop指令是可以在寄存器和內(nèi)存之間傳送數(shù)據(jù)的。push和pop指令的格式目前一百八十九頁\總數(shù)一千二百八十九頁\編于十六點棧與內(nèi)存??臻g當(dāng)然也是內(nèi)存空間的一部分,它只是一段可以以一種特殊的方式進行訪問的內(nèi)存空間。目前一百九十頁\總數(shù)一千二百八十九頁\編于十六點3.9push、pop指令push和pop指令的格式(1)push寄存器:將一個寄存器中的數(shù)據(jù)入棧pop寄存器:出棧,用一個寄存器接收出棧的數(shù)據(jù)例如:pushaxpopbx目前一百九十一頁\總數(shù)一千二百八十九頁\編于十六點3.9push、pop指令push和pop指令的格式(2)push段寄存器:將一個段寄存器中的數(shù)據(jù)入棧pop段寄存器:出棧,用一個段寄存器接收出棧的數(shù)據(jù)例如:pushdspopes目前一百九十二頁\總數(shù)一千二百八十九頁\編于十六點3.9push、pop指令push和pop指令的格式(3)push內(nèi)存單元:將一個內(nèi)存單元處的字入棧(棧操作都是以字為單位)pop內(nèi)存單元:出棧,用一個內(nèi)存字單元接收出棧的數(shù)據(jù)例如:push[0]pop[2]指令執(zhí)行時,CPU要知道內(nèi)存單元的地址,可以在push、pop指令中給出內(nèi)存單元的偏移地址,段地址在指令執(zhí)行時,CPU從ds中取得。目前一百九十三頁\總數(shù)一千二百八十九頁\編于十六點3.9push、pop指令問題3.7編程:將10000H~1000FH這段空間當(dāng)作棧,初始狀態(tài)是空的,將AX、BX、DS中的數(shù)據(jù)入棧。思考后看分析。目前一百九十四頁\總數(shù)一千二百八十九頁\編于十六點問題3.7分析目前一百九十五頁\總數(shù)一千二百八十九頁\編于十六點3.9push、pop指令問題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原來的內(nèi)容。思考后看分析。目前一百九十六頁\總數(shù)一千二百八十九頁\編于十六點問題3.8分析結(jié)論目前一百九十七頁\總數(shù)一千二百八十九頁\編于十六點問題3.8分析從上面的程序我們看到,用棧來暫存以后需要恢復(fù)的寄存器中的內(nèi)容時,出棧的順序要和入棧的順序相反,因為最后入棧的寄存器的內(nèi)容在棧頂,所以在恢復(fù)時,要最先出棧。目前一百九十八頁\總數(shù)一千二百八十九頁\編于十六點3.9push、pop指令問題3.9編程:(1)將10000H~1000FH這段空間當(dāng)作棧,初始狀態(tài)是空的;(2)設(shè)置AX=002AH,BX=002BH;(3)利用棧,交換AX和BX中的數(shù)據(jù)。思考后看分析。目前一百九十九頁\總數(shù)一千二百八十九頁\編于十六點問題3.9分析目前二百頁\總數(shù)一千二百八十九頁\編于十六點3.9push、pop指令問題3.10我們?nèi)绻?0000H處寫入字型數(shù)據(jù)2266H,可以用以下的代碼完成:movax,1000Hmovds,axmov,ax,2266Hmov[0],ax補全下面的代碼目前二百零一頁\總數(shù)一千二百八十九頁\編于十六點3.9push、pop指令補全下面的代碼,完成同樣的功能: 在10000H處寫入字型數(shù)據(jù)2266H。______________________________movax,2266Hpushax要求:不能使用“mov內(nèi)存單元,寄存器”這類指令思考后看分析。目前二百零二頁\總數(shù)一千二百八十九頁\編于十六點問題3.10分析我們看需補全代碼的最后兩條指令,將ax中的2266H壓入棧中,也就是說,最終應(yīng)由pushax將2266H寫入10000H處。問題的關(guān)鍵就在于:如何使pushax訪問的內(nèi)存單元是10000H。Push指令是入棧指令。(注意執(zhí)行過程)完成程序目前二百零三頁\總數(shù)一千二百八十九頁\編于十六點問題3.10分析(續(xù))完成的程序: movax,1000Hmovss,axmovsp,2movax,2266Hpushax結(jié)論目前二百零四頁\總數(shù)一千二百八十九頁\編于十六點問題3.10分析(續(xù))結(jié)論push、pop實質(zhì)上就是一種內(nèi)存?zhèn)魉椭噶?,可以在寄存器和?nèi)存之間傳送數(shù)據(jù),與mov指令不同的是,push和pop指令訪問的內(nèi)存單元的地址不是在指令中給出的,而是由SS:SP指出的。同時,push和pop指令還要改變SP中的內(nèi)容。目前二百零五頁\總數(shù)一千二百八十九頁\編于十六點問題3.10分析(續(xù))我們要十分清楚的是,push和pop指令同mov指令不同,CPU執(zhí)行mov指令只需一步操作,就是傳送,而執(zhí)行push、pop指令卻需要兩步操作。執(zhí)行push時:先改變SP,后向SS:SP處傳送。執(zhí)行pop時:先讀取SS:SP處的數(shù)據(jù),后改變SP。目前二百零六頁\總數(shù)一千二百八十九頁\編于十六點注意push、pop等棧操作指令,修改的只是SP。也就是說,棧頂?shù)淖兓秶畲鬄椋?~FFFFH。提供:SS、SP指示棧頂;改變SP后寫內(nèi)存的入棧指令;讀內(nèi)存后改變SP的出棧指令。這就是8086CPU提供的棧操作機制。目前二百零七頁\總數(shù)一千二百八十九頁\編于十六點棧的綜述(1)8086CPU提供了棧操作機制,方案如下:在SS,SP中存放棧頂?shù)亩蔚刂泛推频刂?;提供入棧和出棧指令,他們根?jù)SS:SP指示的地址,按照棧的方式訪問內(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。目前二百零八頁\總數(shù)一千二百八十九頁\編于十六點棧的綜述(續(xù))(4)任意時刻,SS:SP指向棧頂元素。(5)8086CPU只記錄棧頂,棧空間的大小我們要自己管理。(6)用棧來暫存以后需要恢復(fù)的寄存器的內(nèi)容時,寄存器出棧的順序要和入棧的順序相反。(7)push、pop實質(zhì)上是一種內(nèi)存?zhèn)魉椭噶?,注意它們的靈活應(yīng)用。棧是一種非常重要的機制,一定要深入理解,靈活掌握。目前二百零九頁\總數(shù)一千二百八十九頁\編于十六點3.10棧段前面講過,對于8086PC機,在編程時,我們可以根據(jù)需要,將一組內(nèi)存單元定義為一個段。我們可以將長度為N(N≤64K)的一組地址連續(xù)、起始地址為16的倍數(shù)的內(nèi)存單元,當(dāng)作棧來用,從而定義了一個棧段。目前二百一十頁\總數(shù)一千二百八十九頁\編于十六點3.10棧段比如我們將10010H~1001FH這段長度為16字節(jié)的內(nèi)存空間當(dāng)作棧來用,以棧的方式進行訪問。這段空間就可以成為棧段,段地址為1000H,大小為16字節(jié)。目前二百一十一頁\總數(shù)一千二百八十九頁\編于十六點3.10棧段將一段內(nèi)存當(dāng)作棧段,僅僅是我們在編程時的一種安排,CPU并不會由于這種安排,就在執(zhí)行push、pop等棧操作指令時就自動地將我們定義的棧段當(dāng)作棧空間來訪問。如何使的如push、pop等棧操作指令訪問我們定義的棧段呢?將SS:SP指向我們定義的棧段。目前二百一十二頁\總數(shù)一千二百八十九頁\編于十六點3.10棧段問題3.11如果我們將10000H~1FFFFH這段空間當(dāng)作棧段,初始狀態(tài)是空的,此時,SS=1000H,SP=?思考后看分析。目前二百一十三頁\總數(shù)一千二百八十九頁\編于十六點問題3.11分析我們將10000H~1FFFFH這段空間當(dāng)作棧段,SS=1000H,??臻g大小為64KB,棧最底部的字單元地址為1000:FFFE。任意時刻,SS:SP指向棧頂,當(dāng)棧中只有一個元素的時候,SS=1000H,SP=FFFEH。目前二百一十四頁\總數(shù)一千二百八十九頁\編于十六點問題3.11分析棧為空,就相當(dāng)于棧中唯一的元素出棧,出棧后,SP=SP+2。SP原來為FFFEH,加2后SP=0,所以,當(dāng)棧為空的時候,SS=1000H,SP=0。換個角度看目前二百一十五頁\總數(shù)一千二百八十九頁\編于十六點問題3.11分析(續(xù))換個角度看 任意時刻,SS:SP指向棧頂元素,當(dāng)棧為空的時候,棧中沒有元素,也就不存在棧頂元素,所以SS:SP只能指向棧的最底部單元下面的單元,該單元的偏移地址為棧最底部的字單元的偏移地址+2,棧最底部字單元的地址為1000:FFFE,所以??諘r,SP=0000H。目前二百一十六頁\總數(shù)一千二百八十九頁\編于十六點問題3.12一個棧段最大可以設(shè)為多少?為什么?思考后看分析。目前二百一十七頁\總數(shù)一千二百八十九頁\編于十六點問題3.12分析一個棧段最大可以設(shè)為多少?分析:這個問題顯而易見,提出來只是為了提示我們將相關(guān)的知識融會起來。首先從棧操作指令所完成的功能的角度上來看,push、pop等指令在執(zhí)行的時候只修改SP;目前二百一十八頁\總數(shù)一千二百八十九頁\編于十六點問題3.12分析所以棧頂?shù)淖兓秶?~FFFFH,從棧空時候的SP=0,一直壓棧,直到棧滿時SP=0;如果再次壓棧,棧頂將環(huán)繞,覆蓋了原來棧中的內(nèi)容。所以一個棧段的容量最大為64KB。目前二百一十九頁\總數(shù)一千二百八十九頁\編于十六點段的綜述我們可以將一段內(nèi)存定義為一個段,用一個段地址指示段,用偏移地址訪問段內(nèi)的單元。這完全是我們自己的安排。我們可以用一個段存放數(shù)據(jù),將它定義為“數(shù)據(jù)段”;我們可以用一個段存放代碼,將它定義為“代碼段”;我們可以用一個段當(dāng)作棧,將它定義為“棧段”;目前二百二十頁\總數(shù)一千二百八十九頁\編于十六點段的綜述(續(xù))我們可以這樣安排,但若要讓CPU按照我們的安排來訪問這些段,就要:對于數(shù)據(jù)段,將它的段地址放在DS中,用mov、add、sub等訪問內(nèi)存單元的指令時,CPU就將我們定義的數(shù)據(jù)段中的內(nèi)容當(dāng)作數(shù)據(jù)段來訪問;目前二百二十一頁\總數(shù)一千二百八十九頁\編于十六點段的綜述(續(xù))對于代碼段,將它的段地址放在CS中,將段中第一條指令的偏移地址放在IP中,這樣CPU就將執(zhí)行我們定義的代碼段中的指令;目前二百二十二頁\總數(shù)一千二百八十九頁\編于十六點段的綜述(續(xù))對于棧段,將它的段地址放在SS中,將棧頂單元的偏移地置放在SP中,這樣CPU在需要進行棧操作的時候,比如執(zhí)行push、pop指令等,就將我們定義的棧段當(dāng)作??臻g來用。目前二百二十三頁\總數(shù)一千二百八十九頁\編于十六點段的綜述(續(xù))可見,不管我們?nèi)绾伟才?,CPU將內(nèi)存中的某段內(nèi)存當(dāng)作代碼,是因為CS:IP指向了那里;CPU將某段內(nèi)存當(dāng)作棧,是因為SS:IP指向了那里。目前二百二十四頁\總數(shù)一千二百八十九頁\編于十六點段的綜述(續(xù))我們一定要清楚,什么是我們的安排,以及如何讓CPU按我們的安排行事。要非常的清楚CPU的工作機理,才能在控制CPU來按照我們的安排運行的時候做到游刃有余。目前二百二十五頁\總數(shù)一千二百八十九頁\編于十六點段的綜述(續(xù))比如我們將10000H~1001FH安排為代碼段,并在里面存儲如下代碼:movax,1000Hmovss,axmovsp,0020H;初始化棧頂movax,csmovds,ax;設(shè)置數(shù)據(jù)段段地址movax,[0]addax,[2]movbx,[4]addbx,[6]pushaxpushbxpopaxpopbx目前二百二十六頁\總數(shù)一千二百八十九頁\編于十六點段的綜述(續(xù))設(shè)置CS=1000H,IP=0,這段代碼將得到執(zhí)行。可以看到,在這段代碼中,我們又將10000H~1001FH安排為棧段和數(shù)據(jù)段。10000H~1001FH這段內(nèi)存,既是代碼段,又是棧段和數(shù)據(jù)段。目前二百二十七頁\總數(shù)一千二百八十九頁\編于十六點段的綜述(續(xù))一段內(nèi)存,可以既是代碼的存儲空間,又是數(shù)據(jù)的存儲空間,還可以是??臻g,也可以什么也不是。關(guān)鍵在于CPU中寄存器的設(shè)置,即:CS、IP、SS、SP、DS的指向。目前二百二十八頁\總數(shù)一千二百八十九頁\編于十六點特別提示檢測點3.2(p66)沒有通過檢測點請不要向下學(xué)習(xí)!目前二百二十九頁\總數(shù)一千二百八十九頁\編于十六點小結(jié)目前二百三十頁\總數(shù)一千二百八十九頁\編于十六點《匯編語言》課件

王爽著-清華大學(xué)出版社制作工具:MicrosoftPowerPoint2003本課件由匯編網(wǎng)()制作提供目前二百三十一頁\總數(shù)一千二百八十九頁\編于十六點第4章第1個程序4.1一個源程序從寫出到執(zhí)行的過程4.2源程序4.3編輯源程序4.4編譯4.5連接4.6以簡化的方式進行編譯和連接4.71.exe的執(zhí)行4.8可執(zhí)行文件中的程序裝入內(nèi)存并運行的原理4.9程序執(zhí)行過程的跟蹤目前二百三十二頁\總數(shù)一千二百八十九頁\編于十六點引言現(xiàn)在我們將開始編寫完整的匯編語言程序,用編譯器將它們編譯成為可執(zhí)行文件(如:*.exe文件),在操作系統(tǒng)中運行。這一章,我們將編寫第一個這樣的程序。目前二百三十三頁\總數(shù)一千二百八十九頁\編于十六點4.1一個源程序從寫出到執(zhí)行的過程一個匯編語言程序從寫出到最終執(zhí)行的簡要過程:

編寫--〉編譯--〉連接--〉執(zhí)行演示目前二百三十四頁\總數(shù)一千二百八十九頁\編于十六點編寫匯編源程序使用文本編輯器(如Edit、記事本等),用匯編語言編寫匯編源程序。目前二百三十五頁\總數(shù)一千二百八十九頁\編于十六點對源程序進行編譯連接使用匯編語言編譯程序?qū)υ闯绦蛭募械脑闯绦蜻M行編譯,產(chǎn)生目標(biāo)文件;再用連接程序?qū)δ繕?biāo)文件進行連接,生成可在操作系統(tǒng)中直接運行的可執(zhí)行文件。目前二百三十六頁\總數(shù)一千二百八十九頁\編于十六點可執(zhí)行文件可執(zhí)行文件中包含兩部分內(nèi)容:程序(從原程序中的匯編指令翻譯過來的機器碼)和數(shù)據(jù)(源程序中定義的數(shù)據(jù))相關(guān)的描述信息(比如:程序有多大、要占多少內(nèi)存空間等)目前二百三十七頁\總數(shù)一千二百八十九頁\編于十六點執(zhí)行可執(zhí)行文件中的程序在操作系統(tǒng)中,執(zhí)行可執(zhí)行文件中的程序。操作系統(tǒng)依照可執(zhí)行文件中的描述信息,將可執(zhí)行文件中的機

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論