為什么要學習匯編語言_第1頁
為什么要學習匯編語言_第2頁
為什么要學習匯編語言_第3頁
為什么要學習匯編語言_第4頁
為什么要學習匯編語言_第5頁
已閱讀5頁,還剩79頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、為什么要學習匯編語言1實例1:運行一個計算機程序,即從輸入命令到顯示運行結果之間,計算機內(nèi)發(fā)生了什么? Main() short z,x=100, y=50; z=f1(x,y); printf(“z=%dn”, z); short f1(short x, short y)short t = f2(x, y);return t; short f2(short x, short y)return (x+y); 為什么要學習匯編語言為什么要學習匯編語言問題:1. 為什么計算機在調(diào)用了f1之后一定會回到主程序去執(zhí)行語句printf(“z=%dn”, a);而不是去再次執(zhí)行f2?2. 在f1中,為什么

2、能夠知道x和y的值3. 在main中,為什么能夠知道返回的x+y的值 實例2:目前網(wǎng)絡上最常用的攻擊手段是緩沖區(qū)溢出問題,這個問題的原理是什么? 堆棧 低 局部變量 返回地址 攻擊溢出 參數(shù) 高為什么要學習匯編語言為什么要學習匯編語言每當一個函數(shù)調(diào)用發(fā)生,調(diào)用者會在堆棧中記錄函數(shù)結束時返回的地址。攻擊者通過溢出堆棧中的局部變量,使返回地址指向攻擊代碼。通過改變程序的返回地址獲得對于計算機的控制權。 void function(char *str)char buffer16;strcpy(buffer,str);為什么要學習匯編語言從學習的角度1. 學習匯編語言可以使我們深入地了解計算機的工作過

3、程,為后續(xù)課程(組成原理、操作系統(tǒng)、接口技術)的學習打下基礎。2. 有助于理解高級語言的一些語法現(xiàn)象,加深理解先行課程(C)3. 有助于掌握良好的程序設計方法和技巧為什么要學習匯編語言從實用的角度1匯編語言編寫的程序能充分發(fā)揮計算機硬件的功能,匯編語言編寫的程序執(zhí)行速度快、效率高,實時性強。 某些大型系統(tǒng)軟件的核心,特別是并發(fā)控制元語(如操作系統(tǒng)、數(shù)據(jù)庫管理系統(tǒng)等)要求速度快,代碼短的程序2. 可以使我們閱讀、掌握和改進現(xiàn)有的應用軟件和系統(tǒng)軟件;3高級語言的調(diào)試中常常用到匯編語言。4. 編寫安全的代碼。為什么要學習匯編語言注意事項1. 每次作業(yè)、上機必須獨立完成。上機實驗要簽到。一共2次上機,

4、要求每個學生至少第1次到機房。2. 前三章的學習主要掌握基本概念,在第一次上機后掌握調(diào)試工具的使用??梢哉f熟練使用調(diào)試工具是學好匯編語言的必備條件。3. 強調(diào)作業(yè)和上機必須親自動手。4. 總成績 = 平時成績 * 20% + 考試成績 * 80%為什么要學習匯編語言匯編源程序 用匯編語言編寫的程序類似于高級語言編寫的源程序 匯編程序 把匯編源程序翻譯成目標程序的語言加工程序類似于高級語言的編譯程序匯編 匯編程序進行翻譯的過程 類似于高級語言的編譯過程1.1 機器語言與匯編語言機器語言、匯編語言和高級語言的比較1.1 機器語言與匯編語言1.2 Intel系列機簡介微型計算機的構成1.2.2 80

5、 x86微處理器結構80 x86微處理器結構1總線接口部件: 是CPU與整個計算機系統(tǒng)之間的 高速接口 功能:接受所有的總線操作請求,并按優(yōu)先權進 行選擇,最大限度地利用本身的資源為這 些請求服務。2執(zhí)行部件:寄存器組、標志寄存器、算邏部件、 控制部件等組成 功能:從譯碼指令隊列中取出指令并且執(zhí)行1.2.2 80 x86微處理器結構(1) 數(shù)據(jù)寄存器組(EAX,EBX,ECX,EDX) EAX (累加器)Accumulator EBX (基址寄存器)Base ECX (計數(shù)寄存器)Count EDX (數(shù)據(jù)寄存器)Data 作用 :用來保存操作數(shù)、運算結果或作指示 器、變址寄存器,減少存取操作

6、數(shù)所需 要的訪問總線和主存儲器的時間,加快 運行速度。1.2.2 80 x86微處理器結構注意:它們既可作32位、16位寄存器,也可作8位寄存器使用。16位和8位的寄存器不能作指示器或變址寄存器。 1.2.2 80 x86微處理器結構(2) 指示器變址寄存器組(ESI、EDI、ESP、EBP) 作用:一般用來存放操作數(shù)的偏移地址,用作 指示器或變址寄存器。ESP(Stack Pointer),稱為堆棧指示器,存放的是當前堆棧段中棧頂?shù)钠频刂罚?EBP(Base Pointer),為對堆棧操作的基址寄存器;ESI(Source Index),稱為源變址寄址器;字符串指令源操作數(shù)的指示器EDI(

7、Destination Index),稱為目的變址寄存器;字符串指令目的操作數(shù)的指示器1.2.2 80 x86微處理器結構3. 指令預取部件和指令譯碼部件指令預取部件:通過總線接口部件,把將要執(zhí)行的指令從主存中取出,送入指令排隊機構中排隊。指令譯碼部件:從指令預取部件中讀出指令并譯碼,再送入譯碼指令隊列排隊供執(zhí)行部件使用。 指令指示器:它總是保存著下一條將要被CPU執(zhí)行的指令的偏移地址(簡稱EA),其值為該指令到所在段首址的字節(jié)距離。1.2.2 80 x86微處理器結構4分段部件和分頁部件使用分段部件和分頁部件實現(xiàn)虛擬存儲空間映射到物理存儲空間程序員使用二維地址 段地址:段內(nèi)偏移地址分段部件段

8、地址:段內(nèi)偏移地址 一維的線性的地址分頁部件虛擬的線性的地址 主存儲器的物理地址 1.2.2 80 x86微處理器結構段寄存器:保存段首地址 代碼段寄存器 CS 堆棧段寄存器 SS 數(shù)據(jù)段寄存器 DS 附加段寄存器 ES 附加段寄存器 FS 附加段寄存器 GS 1.2.2 80 x86微處理器結構指令執(zhí)行過程:(1) 指令預取部件和指令譯碼部件 EIP 指令的偏移地址 EIP增量,形成下一條指令的地址(2) 分段部件和分頁部件CS : EIP 指令的物理地址(3) 總線接口部件從主存中取指令 預取指令隊列1.2.2 80 x86微處理器結構(4) CPU按序從預取指令隊列中取出指令 指令譯碼部

9、件。(5) 指令譯碼部件譯碼 執(zhí)行部件執(zhí)行指令;(6) 執(zhí)行過程中若需要取主存操作數(shù) 操作數(shù)偏移地址(7) 分段部件和分頁部件偏移地址 , 段寄存器 操作數(shù)的物理地址(8) 總線接口部件從主存中取數(shù)據(jù) 執(zhí)行部件1.2.2 80 x86微處理器結構1. 實方式(實際地址)操作相當于一個可進行32位快速運算的8086(內(nèi)部32位、外部總線16位數(shù)據(jù)、20位地址)2. 保護方式(虛地址)是80386設計目標全部達到的工作方式,通過對程序使用的存儲區(qū)采用分段、分頁的存儲管理機制,達到分級使用互不干擾的保護目的。能為每個任務提供一臺虛擬處理器,使每個任務單獨執(zhí)行,快速切換。3. 虛擬8086方式保護方式

10、下所提供的同時模擬多個8086處理器。 1.2.2 80 x86的三種工作方式存儲器:用來存放程序和數(shù)據(jù)的裝置,包括主存和外存。主存儲器:主機內(nèi)部的半導體存儲器,相對外存,容量小,速度快,成本高。1.3 主存儲器和物理地址的形成主存儲器編址方式主存儲器的基本存貯單位是位,它能容納一個二進制數(shù)字0或1。8位組成一個字節(jié),一個字節(jié)是一個存儲單元。為了區(qū)別不同的單元,每一字節(jié)都被指定一個編號,即為此單位的物理地址。1.3.1 主存儲器80X86機是按8位字節(jié)編址的,即以字節(jié)作最小尋址單位。 1.3.1 主存儲器字:由2個字節(jié)組成,字地址由兩字節(jié)中地址較小的一個即低字節(jié)的地址決定。存放的方式是低8位存

11、放低字節(jié),高8位存放高字節(jié)。雙字:雙字的地址也由四個字節(jié)中的最低地址確定1.3.1 主存儲器問題: 一個字數(shù)據(jù)該怎樣存入計算機主存呢? 雙字數(shù)據(jù)呢?高-高 低-低字:要占有連續(xù)的兩個字節(jié). 16位中,低8位存放在低地址字節(jié),高8位存放在相鄰的高地址字節(jié)中。雙字:32位中,低16位存放在低地址字,高16位存放在相鄰的高地址字地址中。1.3.1 主存儲器1.3.1 主存儲器從邏輯上來看:是內(nèi)存中開辟的一片存貯區(qū),這片存貯區(qū)采用的存貯方式是一端固定,一端活動,即只允許在一端插入或刪除(訪問可任意)。堆棧中數(shù)據(jù)的存取原則: “先進后出”, 堆棧中的數(shù)據(jù)也稱元素或棧項。元素進棧稱壓入,出棧稱彈出。1.3

12、.2 堆棧從硬件的觀點看堆棧必須由一片存貯單元和一個指示器組成。固定端叫棧底。棧指針用來指示棧頂進棧和出棧時偏移地址的變化指針所指示的最后存入信息的單元叫棧頂,所有信息的存取都在棧頂進行,棧指針總是指向棧頂?shù)摹?.3.2 堆棧問題:為什么要用堆棧?程序中經(jīng)常用到子程序或處理中斷,此時,主程序需要把子程序或中斷程序將用到的寄存器內(nèi)容保護起來,以便子程序或中斷返回后,主程序能夠從調(diào)用點或中斷點處繼續(xù)執(zhí)行。此外,堆棧還經(jīng)常用于:保護和恢復現(xiàn)場主程序和子程序之間傳遞參數(shù)子程序中的局部變量1.3.2 堆棧1.進棧指令PUSH 格式:PUSH OPS 功能:將立即數(shù)、寄存器、段寄存器或存貯器中的一個字/雙

13、字數(shù)據(jù)壓入堆棧。 例:PUSH AX 設:(AX)=4241H (SP)=1000H執(zhí)行: (SP)-2SP (AX)(SP) 1.3.2 堆棧1.3.2 堆棧出棧指令POP 格式:POP OPD 功能:將棧頂元素彈出送至某一寄存器、段寄存器(除CS外)或字/雙字存貯單元中。例:POP BX設指令執(zhí)行前:(BX)=1111H,堆棧內(nèi)容如上題所示。 1.3.2 堆棧1.3.2 堆棧問題的由來 8086的限制,20位地址總線,16位寄存器(SP,BP,SI,DI)。問題:如何通過16位寄存器訪問1MB的內(nèi)存解決:將1M字節(jié)主存分段,每段最多64K字節(jié)1.3.3 存儲器物理地址的形成 分段管理的方法

14、: 段寄存器保存起始首地址 + 段內(nèi)偏移地址的總體策略。段首地址分別存放在:段寄存器CS、DS、ES、SS、FS、GS中 段內(nèi)偏移地址:段內(nèi)相對于段起始地址的偏移值,往往由SP、BP、SI、DI、IP給出。 1.3.3 存儲器物理地址的形成1. 實模式PA = 段寄存器保存的16位二進制數(shù)后補4個0 + EA1.3.3 存儲器物理地址的形成分段的實際作用:(1) 實現(xiàn)了16位表示20位的地址;(2) 當程序和數(shù)據(jù)的大小 0 相加后,原本8位的二進制數(shù)變成了9位,這多出的一位稱為進位位。由于一個字節(jié)只能是8位,多出的一位(即進位位)就被丟掉了,丟失了符號位使得結果成為一正數(shù),這種情況稱為溢出。1

15、.4.1 數(shù)值數(shù)據(jù) 在標志寄存器中有一溢出位OF,當出現(xiàn)上述情況時,則OF位置1,檢查OF就可判斷運算是否溢出。 對加運算來說,使OF位置1的條件是:同符號數(shù)相加,結果的符號與之相反,則OF為1,否則為0。 即:正數(shù) + 正數(shù) = 負數(shù) 負數(shù) + 負數(shù) = 正數(shù) OF = 1 正數(shù) + 正數(shù) = 正數(shù) 負數(shù) + 負數(shù) = 負數(shù) OF = 01.4.1 數(shù)值數(shù)據(jù)例:設n=8,X1=-0100 0010B(-66), X2=0110 1101B(109),求X1補-X2補。 X1補-X2補 = X1補+X2補 = 1011 1110B + 1001 0011B = 1 0101 0001B (81

16、)0 在用補碼作減運算時,負數(shù)減正數(shù),一定為負數(shù)(結果),而結果為正說明產(chǎn)生了溢出。 1.4.1 數(shù)值數(shù)據(jù) 對減運算來說,如果被減數(shù)與減數(shù)異號,且結果的符號與減數(shù)相同(與被減數(shù)相反),說明運算產(chǎn)生了溢出,結果是錯誤,否則不是溢出。 即:正數(shù) - 負數(shù) = 負數(shù) 負數(shù) - 正數(shù) = 正數(shù) OF = 1 正數(shù) - 負數(shù) = 正數(shù) 負數(shù) - 正數(shù) = 負數(shù) OF = 01.4.1 數(shù)值數(shù)據(jù)n十進制數(shù)表示范圍十六進制數(shù)表示范圍最大值最小值最大值最小值8位25500FFH016位6553500FFFFH032位429496729500FFFFFFFFH0無符號數(shù)表示范圍1.4.1 數(shù)值數(shù)據(jù)有符號數(shù)表示范

17、圍1.4.1 數(shù)值數(shù)據(jù)n十進制數(shù)表示范圍二進制數(shù)表示范圍補碼表示范圍最大值最小值最大值最小值最大值最小值8位+127-12827-1-277FH80H16位+32767-32768215-1-2157FFFH8000H32位+2147483647-2147483648231-1-2317FFFFFFFH80000000HBCD( Binary Coded Decimal)碼用4位二進制數(shù)(例如0000-1001)表示1位十進制數(shù)(0-9)。如:1983 = 0001 1001 1000 0011 BCD非壓縮的BCD碼:一個字節(jié)存放一個十進制數(shù)字位0000 0000 = 0 0000 0001

18、 = 1 0000 0010 = 2壓縮的BCD碼:一個字節(jié)存放2個十進制數(shù)字位0001 0000 =10 1000 1001 =891.4.2 BCD碼1.4.3 字符數(shù)據(jù) 鍵盤輸入的字母和數(shù)字、顯示器顯示的文字等都是字符信息。 西文:常用的將字符與2進制數(shù)對應起來的編碼方法是美國信息標準交換代碼ASCII碼。 漢字: GB2312編碼 區(qū)位碼表:分94區(qū)*94位,包括一級漢字(最常用漢字,按拼音排序)和二級漢字(稍常用漢字,按部首排序),均為簡體漢字,共約6700個。標志寄存器用來保存在一條指令執(zhí)行之后,CPU所處狀態(tài)的信息及運算結果的特征16位標志寄存器:FLAGS32位標志寄存器:EF

19、LAGS1.5 標志寄存器一、條件標志位 1符號標志SF 若運算結果為負則SF=1,否則SF=0;這里負是指運算結果的最高位為1則SF=1 2零標志ZF 若運算結果為0則ZF=1否則ZF=0例:MOV AX, 0ADD AX, 1 SF=0 ZF=0SUB AX, 1 SF=0 ZF=1SUB AX, 2 SF=1 ZF=01.5.1 標志位3溢出標志OF 當將操作數(shù)作為有符號數(shù)看時,使用該標志位判斷運算結果是否溢出。加法:若同符號數(shù)相加,結果的符號與之相反則OF=1,否則OF置0。減法:被減數(shù)與減數(shù)異號,而結果的符號與減數(shù)相同則OF=1,否則置0。1.5.1 標志位 4進位標志CF 將操作數(shù)

20、看作無符號數(shù)時,使用該標志位判斷運算結果是否發(fā)生了進位或者借位。加法:若運算結果從字或字節(jié)的最高位向前產(chǎn)生了進位則CF置1,否則置0。減法:兩數(shù)相減,若將它們看作無符號數(shù),則夠減無借位置0,有借位置1。1.5.1 標志位 實際運算結果 應得結果 看作無符號數(shù) 看作有符號數(shù) 0000 0100 4 +4 + 0000 1011 + 11 + (+11) 0000 1111 15 +15 無符號數(shù) 15 CF=0 OF=0 有符號數(shù) 151.5.1 標志位1.5.1 標志位 實際運算結果 應得結果 看作無符號數(shù) 看作有符號數(shù) 0000 0111 7 +7 + 1111 1011 + 251 + (

21、-5) 1 0000 0010 258 +2 無符號數(shù)2 CF=1 OF=0 有符號數(shù)21.5.1 標志位 實際運算結果 應得結果 看作無符號數(shù) 看作有符號數(shù) 0000 1001 9 +9 + 0111 1100 + 124 + (+124) 1000 0101 133 +133 無符號數(shù)133 CF=0 OF=1有符號數(shù)-1231.5.1 標志位 實際運算結果 應得結果 看作無符號數(shù) 看作有符號數(shù) 1000 0111 135 -121 + 1111 0101 + 245 + (-11) 1 0111 1100 380 -132 無符號數(shù)124 CF=0 OF=0有符號數(shù)1245奇偶標志位PF

22、 當運算結果(指低8位)中1的個數(shù)為偶數(shù)時,PF置1,否則置0。該標志位主要用于檢測數(shù)據(jù)在傳輸過程中的錯誤。6輔助進位標志位AF 標識作字節(jié)運算的時候低半字節(jié)向高半字節(jié)的進位和借位。1.5.1 標志位二、控制標志位1方向標志DF 控制串操作指令的處理方向DF=0,正向(從低地址向高地址)DF=1,反向(從低地址向高地址)2中斷允許標志IF控制CPU是否允許響應外設的中斷請求。IF=0,關中斷(CPU屏蔽外設的中斷請求)IF=1,開中斷(CPU響應外設的中斷請求)3跟蹤標志TF控制單步執(zhí)行。IF=0,CPU連續(xù)工作IF=1,CPU單步執(zhí)行1.5.1 標志位1. 標志寄存器傳送指令 LAHF 功能

23、:將標志寄存器的低8位AH 說明:本指令不帶操作數(shù),也不影響標志位。 SAHF 功能:將(AH)標志寄存器的低8位。 說明:標志寄存器原來低8位的內(nèi)容全部被沖掉,以AH的內(nèi)容來取代。但它算不影響高字節(jié)內(nèi)容。(因高字節(jié)中以控制標志為主,不能隨便改變) 1.5.2 標志寄存器操作指令 標志寄存器進棧指令PUSHF 功能:將標志寄存器內(nèi)容壓入堆棧 即: (SP)2SP (FLAGS)(SP) 標志寄存器出棧指令POPF 功能:將棧頂?shù)膬?nèi)容送入標志寄存器1.5.2 標志寄存器操作指令2.標志位操作指令 CLC 使CF=0 (Clear carry)進位標志CF CMC 使CF取反(Complement

24、 carry) STC 使CF=1 (Set carry) CLD 使DF=0 (Clear direction)方向標志DF STD 使DF=1 (Set direction) CLI 使IF=0 (Clear interrupt)中斷標志IF STI 使IF=1 (Set interrupt)1.5.2 標志寄存器操作指令.386;數(shù)據(jù)段DATA SEGMENT USE16 ;段為16位段 SUM DW ? ;SUM為字變量,初值不定 BB DD 1 ;BB為雙字變量,初值為1DATA ENDS1.6 匯編源程序舉例;堆棧段 STACK SEGMENT USE16 STACK;段名和組合類型 DB 200 DUP(0) ;堆棧的大小為200個字節(jié)STACK SEGMENT1.6 匯編源程序舉例;代碼段CODE SEGMENT USE16 ASSUME

溫馨提示

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

評論

0/150

提交評論