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

下載本文檔

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

文檔簡介

1、匯編語言程序設(shè)計(jì) 教 案編號(hào):1第一章 基礎(chǔ)知識(shí)教學(xué)目的:(1) 了解機(jī)器語言 (2) 理解匯編語言的涵義(3) 理解8086CPU硬件系統(tǒng)結(jié)構(gòu)教學(xué)重點(diǎn)及難點(diǎn):匯編語言的涵義,CPU對存儲(chǔ)器的讀寫原理,內(nèi)存地址空間的分配教學(xué)方法:講授、示例、練習(xí)教學(xué)過程:1. 提出三個(gè)問題n 什么是匯編語言n 為什么學(xué)匯編語言n 如何學(xué)習(xí)匯編語言2. 介紹本書內(nèi)容結(jié)構(gòu)及特點(diǎn)3. 教學(xué)內(nèi)容引言n 匯編語言是直接在硬件之上工作的編程語言,首先要了解硬件系統(tǒng)的結(jié)構(gòu),才能有效的應(yīng)用匯編語言對其編程。1.1 機(jī)器語言n 機(jī)器語言是機(jī)器指令的集合。n 闡述機(jī)器語言的原理,發(fā)展及弊端。1.2 匯編語言的產(chǎn)生n 匯編語言的主

2、體是匯編指令。n 匯編指令是機(jī)器指令的助記符 (兩者一一對應(yīng))。1.3 匯編語言的組成n 匯編語言由以下3類組成:n 1、匯編指令(機(jī)器碼的助記符)n 2、偽指令(由編譯器執(zhí)行)n 3、其它符號(hào)(由編譯器識(shí)別)n 匯編語言的核心是匯編指令,它決定了匯編語言的特性。1.4 存儲(chǔ)器n CPU 是計(jì)算機(jī)的核心部件它控制整個(gè)計(jì)算機(jī)的運(yùn)作并進(jìn)行運(yùn)算,要想讓一個(gè)CPU 工作,就必須向它提供指令和數(shù)據(jù)。n 指令和數(shù)據(jù)在存儲(chǔ)器中存放,也就是平時(shí)所說的內(nèi)存。1.5 指令和數(shù)據(jù)n 指令和數(shù)據(jù)是應(yīng)用上的概念。n 在內(nèi)存或磁盤上,指令和數(shù)據(jù)沒有任何區(qū)別,都是二進(jìn)制信息。1.6 存儲(chǔ)單元n 存儲(chǔ)器被劃分為若干個(gè)存儲(chǔ)單元

3、,每個(gè)存儲(chǔ)單元從0開始順序編號(hào);n 例如:一個(gè)存儲(chǔ)器有128個(gè)存儲(chǔ)單元,編號(hào)從0127。n 存儲(chǔ)器的計(jì)量單位B、KB、MB、GB、TB1.7 CPU對存儲(chǔ)器的讀寫n CPU要想進(jìn)行數(shù)據(jù)的讀寫,必須和外部器件(標(biāo)準(zhǔn)的說法是芯片)進(jìn)行三類信息的交互:n 存儲(chǔ)單元的地址(地址信息)地址總線n 器件的選擇,讀或?qū)懨睿刂菩畔ⅲ?shù)據(jù)總線n 讀或?qū)懙臄?shù)據(jù)(數(shù)據(jù)信息)數(shù)據(jù)總線n CPU在內(nèi)存中讀或?qū)懙臄?shù)據(jù)演示:讀演示、寫演示 機(jī)器碼:10 對應(yīng)的匯編指令:MOV AX,3 含義:傳送3 號(hào)單元的內(nèi)容到AX1.8 地址總線n CPU是通過地址總線來指定存儲(chǔ)單元的。n 一個(gè)CPU有N根地址總線,則可以說這個(gè)C

4、PU的地址總線的寬度為N。n 這樣的CPU最多可以尋找的N次方個(gè)內(nèi)存單元。1.9 數(shù)據(jù)總線n CPU及內(nèi)存或其它器件之間的數(shù)據(jù)傳送是通過數(shù)據(jù)總線來進(jìn)行的。n 數(shù)據(jù)總線的寬度決定了CPU和外界的數(shù)據(jù)傳送速度。1.10 控制總線n CPU對外部器件的控制是通過控制總線來進(jìn)行的。在這里控制總線是個(gè)總稱,控制總線是一些不同控制線的集合。n 有多少根控制總線,就意味著CPU提供了對外部器件的多少種控制。所以,控制總線的寬度決定了CPU對外部器件的控制能力。1.11 內(nèi)存地址空間(概述)n 什么是內(nèi)存地址空間n 不同的計(jì)算機(jī)系統(tǒng)的內(nèi)存地址空間分配情況是不同的。n 講解8086PC機(jī)內(nèi)存地址空間分配的基本情

5、況作業(yè):匯編語言程序設(shè)計(jì) 教 案編號(hào):2第二章 寄存器教學(xué)目的:(1) 理解通用寄存器的邏輯結(jié)構(gòu)及其存儲(chǔ)原理(2) 理解物理地址、段地址及偏移地址的本質(zhì)含義(3) 理解8086CPU讀取執(zhí)行指令的工作原理,及代碼段寄存器CS和指令指針寄存器IP的含義,并掌握其使用方法教學(xué)重點(diǎn)及難點(diǎn):8086CPU讀取執(zhí)行指令的工作原理,及代碼段寄存器CS和指令指針寄存器IP的使用方法教學(xué)方法:講授、示例、練習(xí)教學(xué)過程:1.CPU概述n 一個(gè)典型的CPU由運(yùn)算器、控制器、寄存器等器件組成,這些器件靠內(nèi)部總線相連。n 內(nèi)部總線實(shí)現(xiàn)CPU內(nèi)部各個(gè)器件之間的聯(lián)系。n 外部總線實(shí)現(xiàn)CPU和主板上其它器件的聯(lián)系。2.寄存

6、器概述n 8086CPU有14個(gè)寄存器它們的名稱為: AX、BX、CX、DX、SI、DI、SP、BP、 IP、CS、SS、DS、ES、PSW。3. 教學(xué)內(nèi)容2.1 通用寄存器n 8086CPU所有的寄存器都是16位的,可以存放兩個(gè)字節(jié)。n AX、BX、CX、DX 通常用來存放一般性數(shù)據(jù)被稱為通用寄存器。n 講解寄存器的邏輯結(jié)構(gòu)。n 為保證兼容性,這四個(gè)寄存器都可以分為兩個(gè)獨(dú)立的8位寄存器使用。2.2 字在寄存器中的存儲(chǔ)n 一個(gè)字可以存在一個(gè)16位寄存器中,這個(gè)字的高位字節(jié)和低位字節(jié)自然就存在這個(gè)寄存器的高8位寄存器和低8位寄存器中。2.3 幾條匯編指令匯編指令不區(qū)分大小寫注意:在進(jìn)行數(shù)據(jù)傳送或

7、運(yùn)算時(shí),要注意指令的兩個(gè)操作對象的位數(shù)應(yīng)當(dāng)是一致的。2.4 物理地址n CPU訪問內(nèi)存單元時(shí)要給出內(nèi)存單元的地址。所有的內(nèi)存單元構(gòu)成的存儲(chǔ)空間是一個(gè)一維的線性空間。每一個(gè)內(nèi)存單元在這個(gè)空間中都有唯一的地址,這個(gè)唯一的地址稱為物理地址。2.5 16位結(jié)構(gòu)的CPUn 概括的講,16位結(jié)構(gòu)描述了一個(gè)CPU具有以下幾個(gè)方面特征:n 1、運(yùn)算器一次最多可以處理16位的數(shù)據(jù)。n 2、寄存器的最大寬度為16位。n 3、寄存器和運(yùn)算器之間的通路是16位的。2.6 8086CPU給出物理地址的方法n 8086CPU采用一種在內(nèi)部用兩個(gè)16位地址合成的方法來形成一個(gè)20位的物理地址。n 地址加法器合成物理地址的方

8、法:物理地址=段地址16+偏移地址2.7 “段地址16+偏移地址=物理地址”的本質(zhì)含義n 用兩個(gè)比喻說明2.8 段的概念n 錯(cuò)誤認(rèn)識(shí):內(nèi)存被劃分成了一個(gè)一個(gè)的段,每一個(gè)段有一個(gè)段地址。n 其實(shí):內(nèi)存并沒有分段,段的劃分來自于CPU,由于8086CPU用“(段地址16)+偏移地址=物理地址”的方式給出內(nèi)存單元的物理地址,使得我們可以用分段的方式來管理內(nèi)存。n 兩點(diǎn)需要注意(1)段地址16 必然是 16的倍數(shù),所以一個(gè)段的起始地址也一定是16的倍數(shù);(2)偏移地址為16位,16 位地址的尋址能力為 64K,所以一個(gè)段的長度最大為64K。n 結(jié)論:CPU可以用不同的段地址和偏移地址形成同一個(gè)物理地址

9、。2.9節(jié)2.12節(jié)n 1、段地址在8086CPU的寄存器中存放。當(dāng)8086CPU要訪問內(nèi)存時(shí),由段寄存器提供內(nèi)存單元的段地址。8086CPU有4個(gè)段寄存器,其中CS用來存放指令的段地址。n 2、CS存放指令的段地址,IP存放指令的偏移地址。 8086機(jī)中,任意時(shí)刻,CPU將CS:IP指向的內(nèi)容當(dāng)作指令執(zhí)行。n 3、8086CPU的工作過程:(1)從CS:IP指向內(nèi)存單元讀取指令,讀取的指令進(jìn)入指令緩沖器;(2)IP指向下一條指令;(3)執(zhí)行指令。(轉(zhuǎn)到步驟(1),重復(fù)這個(gè)過程。)n 4、8086CPU提供轉(zhuǎn)移指令修改CS、IP的內(nèi)容。作業(yè):匯編語言程序設(shè)計(jì) 教 案編號(hào):3第三章 寄存器(內(nèi)存

10、訪問)教學(xué)目的:(1) 掌握匯編指令訪問內(nèi)存的方法(2) 理解匯編指令mov、add、sub的格式及含義,并掌握其使用方法(3) 理解CPU的堆棧機(jī)制,掌握匯編指令push、pop的含義及其使用方法(4) 理解數(shù)據(jù)段、代碼段、棧段的內(nèi)涵教學(xué)重點(diǎn)及難點(diǎn):匯編指令訪問內(nèi)存的方法,匯編指令格式,及堆棧機(jī)制教學(xué)方法:講授、示例、練習(xí)教學(xué)過程:1.引言在第2章中,我們主要從 CPU 如何執(zhí)行指令的角度講解了8086CPU的邏輯結(jié)構(gòu)、形成物理地址的方法、相關(guān)的寄存器以及一些指令。這一章中,我們從訪問內(nèi)存的角度繼續(xù)學(xué)習(xí)幾個(gè)寄存器。2.教學(xué)內(nèi)容3.1 內(nèi)存中字的存儲(chǔ)結(jié)論:任何兩個(gè)地址連續(xù)的內(nèi)存單元,N號(hào)單元和

11、 N+1號(hào)單元,可以將它們看成兩個(gè)內(nèi)存單元 ,也可以看成一個(gè)地址為N的字單元中的高位字節(jié)單元和低位字節(jié)單元。3.2 DS和addressCPU要讀取一個(gè)內(nèi)存單元的時(shí)候,必須先給出這個(gè)內(nèi)存單元的地址;在8086PC中,內(nèi)存地址由段地址和偏移地址組成。8086CPU中有一個(gè) DS寄存器,通常用來存放要訪問的數(shù)據(jù)的段地址。問題:如何用mov指令從10000H中讀取數(shù)據(jù)?結(jié)論:mov bx,1000Hmov ds,bxmov al,0注意:8086CPU不支持將數(shù)據(jù)直接送入段寄存器的操作,ds是一個(gè)段寄存器。 (硬件設(shè)計(jì)的問題)mov ds,1000H 是非法的。3.3 字的傳送因?yàn)?086CPU是1

12、6位結(jié)構(gòu),有16根數(shù)據(jù)線,所以,可以一次性傳送16位的數(shù)據(jù),也就是一次性傳送一個(gè)字。3.4 mov、add、sub指令已學(xué)mov指令的幾種形式: mov 寄存器,數(shù)據(jù) mov 寄存器,寄存器 mov 寄存器,內(nèi)存單元 mov 內(nèi)存單元,寄存器 mov 段寄存器,寄存器根據(jù)已知指令進(jìn)行推測:mov 段寄存器,寄存器mov 寄存器,段寄存器(驗(yàn)證)mov 內(nèi)存單元,寄存器mov 內(nèi)存單元,段寄存器mov 段寄存器,內(nèi)存單元注意:add和sub指令同mov一樣,都有兩個(gè)操作對象。3.5 數(shù)據(jù)段定義:將一組長度為N(N64K)、地址連續(xù)、起始地址為16的倍數(shù)的內(nèi)存單元當(dāng)作專門存儲(chǔ)數(shù)據(jù)的內(nèi)存空間,從而定

13、義了一個(gè)數(shù)據(jù)段。訪問數(shù)據(jù)段中的數(shù)據(jù):用 ds 存放數(shù)據(jù)段的段地址,再根據(jù)需要,用相關(guān)指令訪問數(shù)據(jù)段中的具體單元。示例3.6 棧棧是一種具有特殊的訪問方式的存儲(chǔ)空間。它的特殊性就在于,最后進(jìn)入這個(gè)空間的數(shù)據(jù),最先出去。棧有兩個(gè)基本的操作:入棧和出棧。入棧:將一個(gè)新的元素放到棧頂;出棧:從棧頂取出一個(gè)元素。棧頂?shù)脑乜偸亲詈笕霔#枰鰲r(shí),又最先被從棧中取出。棧的操作規(guī)則:LIFO(Last In First Out,后進(jìn)先出)3.7 CPU提供的棧機(jī)制8086CPU提供入棧和出棧指令: (最基本的) PUSH(入棧)POP (出棧) push ax:將寄存器ax中的數(shù)據(jù)送入棧中; pop ax

14、 :從棧頂取出數(shù)據(jù)送入ax。注意:8086CPU的入棧和出棧操作都是以字為單位進(jìn)行的。push 指令的執(zhí)行過程:push ax(1)SP=SP2;(2)將ax中的內(nèi)容送入SS:SP指向的內(nèi)存單元處,SS:SP此時(shí)指向新棧頂。pop 指令的執(zhí)行過程:pop ax(1)將SS:SP指向的內(nèi)存單元處的數(shù)據(jù)送入ax中;(2)SP = SP+2,SS:SP指向當(dāng)前棧頂下面的單元,以當(dāng)前棧頂下面的單元為新的棧頂。3.8 棧頂超界的問題當(dāng)棧滿的時(shí)候再使用push指令入棧,棧空的時(shí)候再使用pop指令出棧,都將發(fā)生棧頂超界問題。棧頂超界是危險(xiǎn)的。我們在編程的時(shí)候要自己操心棧頂超界的問題 ,要根據(jù)可能用到的最大棧

15、空間,來安排棧的大小,防止入棧的數(shù)據(jù)太多而導(dǎo)致的超界;執(zhí)行出棧操作的時(shí)候也要注意,以防棧空的時(shí)候繼續(xù)出棧而導(dǎo)致的超界。3.9 push、pop指令push和pop指令的格式(1)push 寄存器:將一個(gè)寄存器中的數(shù)據(jù)入棧pop寄存器:出棧,用一個(gè)寄存器接收出棧的數(shù)據(jù)push和pop指令的格式(2)push 段寄存器:將一個(gè)段寄存器中的數(shù)據(jù)入棧pop段寄存器:出棧,用一個(gè)段寄存器接收出棧的數(shù)據(jù)push和pop指令的格式(3)push 內(nèi)存單元:將一個(gè)內(nèi)存單元處的字入棧(棧操作都是以字為單位)pop 內(nèi)存單元:出棧,用一個(gè)內(nèi)存字單元接收出棧的數(shù)據(jù)3.10 棧段定義:將長度為 N(N 64K )的一

16、組地址連續(xù)、起始地址為16的倍數(shù)的內(nèi)存單元,當(dāng)作棧來用,從而定義了一個(gè)棧段。訪問:如何使用如push、pop 等棧操作指令訪問我們定義的棧段呢?將SS:SP指向我們定義的棧段。3、段的綜述我們可以將一段內(nèi)存定義為一個(gè)段,用一個(gè)段地址指示段,用偏移地址訪問段內(nèi)的單元。這完全是我們自己的安排。我們可以用一個(gè)段存放數(shù)據(jù),將它定義為“數(shù)據(jù)段”;我們可以用一個(gè)段存放代碼,將它定義為“代碼段”;我們可以用一個(gè)段當(dāng)作棧,將它定義為“棧段”;一段內(nèi)存,可以既是代碼的存儲(chǔ)空間,又是數(shù)據(jù)的存儲(chǔ)空間,還可以是??臻g,也可以什么也不是。關(guān)鍵在于CPU中寄存器的設(shè)置,即: CS、IP、SS、SP、DS的指向。作業(yè):匯編

17、語言程序設(shè)計(jì) 教 案編號(hào):4第四章 第一個(gè)程序教學(xué)目的:(1) 掌握源程序書寫格式(2) 理解一個(gè)源程序從寫出到執(zhí)行的過程(3) 掌握程序的執(zhí)行過程及其跟蹤方法教學(xué)重點(diǎn)及難點(diǎn):匯編語言源程序的書寫格式,執(zhí)行過程及跟蹤方法教學(xué)方法:講授、示例、練習(xí)教學(xué)過程:4.1 一個(gè)源程序從寫出到執(zhí)行的過程編寫源程序編譯鏈接執(zhí)行注意:解釋可執(zhí)行文件4.2 源程序匯編指令:有對應(yīng)的機(jī)器碼的指令,可以被編譯為機(jī)器指令,最終為CPU所執(zhí)行。1.偽指令沒有對應(yīng)的機(jī)器碼的指令,最終不被CPU所執(zhí)行。3種偽指令(1)段定義偽指令segment和ends(2)匯編結(jié)束偽指令END(3)ASSUME 段分配偽指令 2.標(biāo)號(hào):

18、一個(gè)標(biāo)號(hào)指代了一個(gè)地址。(代表某一存儲(chǔ)單元地址的名字)字母:AZ 數(shù)字:09特殊字符:? . _ $codesg:放在segment的前面,作為一個(gè)段的名稱,這個(gè)段的名稱最終將被編譯、連接程序處理為一個(gè)段的段地址。start:放在某個(gè)指令前,作為程序的入口,程序加載到內(nèi)存后,CS:IP會(huì)指向這個(gè)標(biāo)號(hào),從start指向的指令開始運(yùn)行。3.源程序中的“程序”匯編源程序:偽指令(編譯器處理)、匯編指令(編譯為機(jī)器碼)程序:源程序中最終由計(jì)算機(jī)執(zhí)行、處理的指令或數(shù)據(jù)。4.匯編語言源程序的結(jié)構(gòu) 一般來說,一個(gè)完整的匯編源程序應(yīng)由三個(gè)程序段組成,即代碼段、數(shù)據(jù)段和堆棧段,每個(gè)段都以SEGMENT開始,以E

19、NDS結(jié)束,代碼段包含程序要執(zhí)行的指令;堆棧段用來在內(nèi)存中建立一個(gè)堆棧區(qū);數(shù)據(jù)段用來在內(nèi)存中建立一個(gè)適當(dāng)容量的工作區(qū),以存放程序中所需的數(shù)據(jù)。 注意:一個(gè)源程序中,代碼段是必須的,而數(shù)據(jù)段和堆棧段可以沒有或有其中一個(gè)。段定義時(shí)一般最后定義代碼段。5.程序返回我們的程序最先以匯編指令的形式存在源程序中,經(jīng)編譯、連接后轉(zhuǎn)變?yōu)闄C(jī)器碼,存儲(chǔ)在可執(zhí)行文件中,那么,它怎樣得到運(yùn)行呢?(討論)現(xiàn)在,我們知道,一個(gè)程序結(jié)束后,將CPU的控制權(quán)交還給使它得以運(yùn)行的程序,我們稱這個(gè)過程為:程序返回。應(yīng)該在程序的末尾添加返回的程序段。 mov ax,4c00H int 21H注意:幾個(gè)和結(jié)束相關(guān)的內(nèi)容:段結(jié)束、程序

20、結(jié)束、程序返回6.語法錯(cuò)誤和邏輯錯(cuò)誤語法錯(cuò)誤:程序在編譯時(shí)被編譯器發(fā)現(xiàn)的錯(cuò)誤;容易發(fā)現(xiàn)。邏輯錯(cuò)誤:程序在編譯時(shí)不能表現(xiàn)出來的、在運(yùn)行時(shí)發(fā)生的錯(cuò)誤;不容易發(fā)現(xiàn)。4.3.編輯源程序使用工具:可使用各種文本編輯工具(記事本、寫字板、WORD等),我們使用notepad+文本編輯器。功能:產(chǎn)生一個(gè)存儲(chǔ)源程序的文本文件。使用方法:輸入?yún)R編源程序并保存為.asm文件。4.4 對源程序進(jìn)行編譯使用工具:使用MASM6.15編譯器功能:使用編譯器對源程序文件進(jìn)行編譯,生成包含機(jī)器代碼的目標(biāo)文件 ( .obj)。使用方法:在dos下運(yùn)行masm.exe程序?qū)υ闯绦虻木幾g結(jié)束,編譯器輸出的最后兩行告訴我們這個(gè)源程

21、序有沒有警告錯(cuò)誤和必須要改正的錯(cuò)誤。4.5 對目標(biāo)文件進(jìn)行連接使用工具:使用 LINK . EXE連接器功能:對目標(biāo)文件(.obj)進(jìn)行連接,從而得到一個(gè)可執(zhí)行文件 . EXE 。使用方法:在DOS下運(yùn)行l(wèi)ink.exe程序: 注意講解連接的作用4.6 以簡化的方式進(jìn)行編譯和連接用一種較為簡捷的方式進(jìn)行編譯、連接。C: MASM masm XXX;C: MASM link XXX;C: MASM ml XXX.asm;4.7 1.exe的執(zhí)行提問:程序到底運(yùn)行沒有?程序運(yùn)行了,只是從屏幕上不可能看到任何運(yùn)行結(jié)果。我們的程序沒有像顯示器輸出任何信息。程序只是做了一些將數(shù)據(jù)送入寄存器和加法的操作,

22、而這些事情,我們不可能從顯示屏上看出來。程序執(zhí)行完成后,返回,屏幕上再次出現(xiàn)操作系統(tǒng)的提示符。4.8 誰將可執(zhí)行文件中的程序裝載進(jìn)入內(nèi)存并使它運(yùn)行?1.exe的執(zhí)行過程:(1)我們在提示符“C:masmml 1.asm” ,按Enter鍵。(編譯連接)(2)1.exe中的程序運(yùn)行;問題4.1(3)運(yùn)行結(jié)束,返回,再次顯示提示符“C:masm”。問題4.2兩個(gè)問題問題4.1:執(zhí)行第(2)步操作,有一個(gè)正在運(yùn)行的程序?qū)?.exe中的程序加載入內(nèi)存,這個(gè)正在運(yùn)行的程序是什么?它將程序加載入內(nèi)存后,如何使程序得以運(yùn)行?問題4.2:執(zhí)行第(3)步操作,程序運(yùn)行結(jié)束后,返回到哪里?回答問題4.1和4.2(

23、1)我們在DOS中直接執(zhí)行 1.exe 時(shí),是正在運(yùn)行的command將1.exe中的程序加載入內(nèi)存。(2)command設(shè)置CPU的CS:IP指向程序的第一條指令(即程序的入口),從而使程序得以運(yùn)行。(3)程序運(yùn)行結(jié)束后,返回到command中,CPU繼續(xù)運(yùn)行command。4.9 程序執(zhí)行過程的跟蹤使用工具:debug功能:觀察程序的運(yùn)行過程 (Debug 可以將程序加載入內(nèi)存,設(shè)置CS:IP指向程序的入口,但Debug并不放棄對CPU 的控制,這樣,我們就可以使用Debug 的相關(guān)命令來單步執(zhí)行程序 ,查看每條指令指令的執(zhí)行結(jié)果。)使用方法:在DOS下運(yùn)行DEBUG . EXE程序。 C

24、: debug xxx.exe(后綴不能省略)作業(yè):匯編語言程序設(shè)計(jì) 教 案編號(hào):5第五章 bx和loop指令教學(xué)目的:(1) 理解匯編語言的循環(huán)結(jié)構(gòu)(2) 掌握bx和loop聯(lián)合使用訪問內(nèi)存實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的方法(3) 掌握匯編指令loop的格式,理解其工作原理(4) 掌握段前綴的使用教學(xué)重點(diǎn)及難點(diǎn):bx和loop聯(lián)合使用實(shí)現(xiàn)循環(huán)結(jié)構(gòu),及l(fā)oop指令的工作原理教學(xué)方法:講授、示例、練習(xí)教學(xué)過程:1、幾個(gè)概念1.bx和內(nèi)存單元的描述2.loop:英文單詞“l(fā)oop”有循環(huán)的含義,顯然這個(gè)指令和循環(huán)有關(guān)。3.描述性符號(hào)“()”:為了描述上的簡潔,在以后的課程中,我們將使用一個(gè)描述性的符號(hào) “() ”

25、來表示一個(gè)寄存器或一個(gè)內(nèi)存單元中的內(nèi)容。4.約定符號(hào)idata表示常量2、教學(xué)內(nèi)容5.1 bx下面指令的功能:mov ax,bx 功能:bx 中存放的數(shù)據(jù)作為一個(gè)偏移地址EA ,段地址SA 默認(rèn)在ds 中,將SA:EA處的數(shù)據(jù)送入ax中。即: (ax)=(ds) *16 +(bx);mov bx,ax 功能:bx中存放的數(shù)據(jù)作為一個(gè)偏移地址EA,段地址SA默認(rèn)在ds中,將ax中的數(shù)據(jù)送入內(nèi)存SA:EA處。即:(ds *16 +(bx) = (ax)。5.2 Loop指令(循環(huán)控制指令)格式:loop 標(biāo)號(hào)CPU 執(zhí)行l(wèi)oop指令的時(shí)候,要進(jìn)行兩步操作: (cx)=(cx)-1; 判斷cx中的值

26、,不為零則轉(zhuǎn)至標(biāo)號(hào)處執(zhí)行程序,如果為零則向下執(zhí)行。注意:loop循環(huán)中用CX作計(jì)數(shù)器控制程序的循環(huán)次數(shù)。補(bǔ)充:通用寄存器:AX:Accumulator 累加器常用于存放算術(shù)邏輯運(yùn)算中的操作數(shù)BX:Base register 基址寄存器常用來存放訪問內(nèi)存時(shí)的基址(段地址)CX:Count register計(jì)數(shù)器在循環(huán)和串操作指令中用作計(jì)數(shù)器DX:Data register一般數(shù)據(jù)寄存器在進(jìn)行乘、除運(yùn)算時(shí),它可作為默認(rèn)的操作數(shù)參及運(yùn)算,也可用于存放I/O的端口地址。 5.3 在Debug中跟蹤用loop指令實(shí)現(xiàn)的循環(huán)程序示例:計(jì)算ffff:0006單元中的數(shù)乘以3,結(jié)果存儲(chǔ)在dx中。分析:(1)運(yùn)

27、算后的結(jié)果是否會(huì)超出dx所能存儲(chǔ)的范圍?(2)我們用循環(huán)累加來實(shí)現(xiàn)乘法,用哪個(gè)寄存器進(jìn)行累加?(3) ffff:0006單元是一個(gè)字節(jié)單元,ax是一個(gè) 16 位寄存器,數(shù)據(jù)長度不一樣,如何賦值?5.4 Debug和匯編編譯器Masm對指令的不同處理示例任務(wù):將內(nèi)存2000:0、2000:1 、2000:2、2000:3單元中的數(shù)據(jù)送入al,bl,cl,dl中。(1)在Debug中編程實(shí)現(xiàn)(2)匯編程序?qū)崿F(xiàn)5.6 段前綴在訪問內(nèi)存單元的指令中,用于顯式地指明內(nèi)存單元的段地址的“段寄存器:”(ds:、cs:、ss:或es:),在匯編語言中稱為段前綴。5.7 一段安全的空間在8086模式中,隨意向一

28、段內(nèi)存空間寫入內(nèi)容是很危險(xiǎn)的 ,因?yàn)檫@段空間中可能存放著重要的系統(tǒng)數(shù)據(jù)或代碼。匯編語言程序直接面向機(jī)器,如果我們要向內(nèi)存空間寫入數(shù)據(jù)時(shí),要保證所寫入的內(nèi)存中沒有重要的數(shù)據(jù),否則會(huì)影響系統(tǒng)的正常運(yùn)行,在一般的PC機(jī)中都不使用0:2000:2ff(00200h002ffh)這段256個(gè)字節(jié)內(nèi)存空間,所以我們可以放心使用這段安全的空間。5.8 段前綴的使用將內(nèi)存ffff:0ffff:b段元中的數(shù)據(jù)拷貝到 0:2000:20b單元中。作業(yè):匯編語言程序設(shè)計(jì) 教 案編號(hào):6第六章 包含多個(gè)段的程序教學(xué)目的:(1) 理解在代碼段中使用數(shù)據(jù)的原理及不便之處(2) 理解在代碼段中使用棧的原理及不便之處(3)

29、掌握將數(shù)據(jù)、代碼、棧放入不同的段的應(yīng)用教學(xué)重點(diǎn)及難點(diǎn):將數(shù)據(jù)、代碼、棧放入不同的段的應(yīng)用教學(xué)方法:講授、示例、練習(xí)教學(xué)過程:1、引言前面我們寫的程序中,只有一個(gè)代碼段?,F(xiàn)在有一個(gè)問題是:如果程序需要用其他空間來存放數(shù)據(jù),我們使用哪里呢?我們將以這樣的順序來深入地討論多個(gè)段的問題:(1)在一個(gè)段中存放數(shù)據(jù)、代碼、棧,我們先來體會(huì)一下不使用多個(gè)段時(shí)的情況;(2)將數(shù)據(jù)、代碼、棧放入不同的段中。 6.1 在代碼段中使用數(shù)據(jù)(將數(shù)據(jù)定義在代碼段中)示例:編程計(jì)算以下8個(gè)數(shù)據(jù)的和,結(jié)果存在ax 寄存器中: 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H。6

30、.3 將數(shù)據(jù)、代碼、棧放入不同的段在前面的內(nèi)容中,我們在程序中用到了數(shù)據(jù)和棧,我們將數(shù)據(jù)、棧和代碼都放到了一個(gè)段里面。我們在編程的時(shí)候要注意何處是數(shù)據(jù),何處是棧,何處是代碼。這樣做顯然有兩個(gè)問題:(1)把它們放到一個(gè)段中使程序顯得混亂;(2)前面程序中處理的數(shù)據(jù)很少,用到的棧空間也小,加上沒有多長的代碼,放到一個(gè)段里面沒有問題。但如果數(shù)據(jù)、棧和代碼需要的空間超過64KB,就不能放在一個(gè)段中(一個(gè)段的容量不能大于64 KB,是我們在學(xué)習(xí)中所用的8086模式的限制,并不是所有的處理器都這樣)。 所以,我們應(yīng)該考慮用多個(gè)段來存放數(shù)據(jù)、代碼和棧。 作業(yè):匯編語言程序設(shè)計(jì) 教 案編號(hào):7第七章 更靈活的

31、定位內(nèi)存地址的方法教學(xué)目的:(1) 掌握匯編邏輯運(yùn)算指令and和or的格式及含義(2) 理解字符串大小寫轉(zhuǎn)換問題,并掌握其實(shí)現(xiàn)方法(3) 掌握內(nèi)存的尋址方式,并會(huì)靈活應(yīng)用教學(xué)重點(diǎn)及難點(diǎn):邏輯運(yùn)算指令的格式及應(yīng)用,內(nèi)存的尋址方式教學(xué)方法:講授、示例、練習(xí)教學(xué)過程:1、引言前面,我們用0、bx的方法,在訪問內(nèi)存的指令中,定位內(nèi)存單元的地址。在這一章中,我們主要講解一些更靈活的定位內(nèi)存地址的方法和相關(guān)的編程方法。2、教學(xué)內(nèi)容7.1 and和or指令(1)and 指令:邏輯及指令,按位進(jìn)行及運(yùn)算。 通過該指令可將操作對象的相應(yīng)位設(shè)為0,其他位不變。(2)or 指令:邏輯或指令,按位進(jìn)行或運(yùn)算。 通過該

32、指令可將操作對象的相應(yīng)位設(shè)為1,其他位不變。7.2 關(guān)于ASCII碼世界上有很多編碼方案,有種方案叫做ASCII編碼,是在計(jì)算機(jī)系統(tǒng)中通常被采用的。簡單地說,所謂編碼方案,就是一套規(guī)則,它約定了用什么樣的信息來表示現(xiàn)實(shí)對象。比如說,在ASCII編碼方案中,用 61H 表示“a”,62H表示“b”。7.3 以字符形式給出的數(shù)據(jù)在匯編程序中,用一對單引號(hào)括起的內(nèi)容作為字符處理。編譯器將把它們轉(zhuǎn)化為相對應(yīng)的ASCII碼。7.4 大小寫轉(zhuǎn)換的問題首先分析一下,我們知道同一個(gè)字母的大寫字符和小寫字符對應(yīng)的 ASCII 碼是不同的,比如 “A” 的 ASCII 碼是41H,“a”的ASCII碼是61H。要

33、改變一個(gè)字母的大小寫,實(shí)際上就是要改變它所對應(yīng)的ASCII 碼。 舉例說明7.5 bx+idata在前面,我們可以用bx的方式來指明一個(gè)內(nèi)存單元, 我們還可以用一種更為靈活的方式來指明內(nèi)存單元: bx+idata:表示一個(gè)內(nèi)存單元,它的偏移地址為(bx)+idata(bx中的數(shù)值加上idata)。注意:用bx+idata的方式亦可進(jìn)行數(shù)組的處理7.7 SI和DIsi源變址寄存器di目的變址寄存器si和di只能用作16位寄存器,常用于對內(nèi)存單元的尋址,功能及bx寄存器相近。7.8 bx+si和bx+di在前面,我們用bx(si或di)bx(si或di)+idata 的方式來指明一個(gè)內(nèi)存單元,我們

34、還可以用更靈活的方式:bx+sibx+dibx+si和bx+di的含義相似,我們以bx+si為例進(jìn)行講解。bx+si表示一個(gè)內(nèi)存單元,它的偏移地址為(bx)+(si)(即bx中的數(shù)值加上si中的數(shù)值),段地址在ds中。mov ax,bx+si 指令也可寫成格式:mov ax,bxsi 7.9 bx+si+idata和bx+di+idatabx+si+idata和bx+di+idata的含義相似,我們以bx+si+idata為例進(jìn)行講解。bx+si+idata表示一個(gè)內(nèi)存單元它的偏移地址為(bx)+(si)+idata。 (即bx中的數(shù)值加上si中的數(shù)值再加上idata) (段地址在ds中)注意

35、指令mov ax,bx+si+idata的其他表示方式7.10 不同的尋址方式的靈活應(yīng)用idata 用一個(gè)常量來表示地址,可用于直接定位一個(gè)內(nèi)存單元。例:1000hbx 用一個(gè)變量來表示內(nèi)存地址,可用于間接定位一個(gè)內(nèi)存單元。bx+idata 用一個(gè)變量和常量表示地址,可在一個(gè)起始地址的基礎(chǔ)上用變量間接定位一個(gè)內(nèi)存單元。bx+si 用兩個(gè)變量表示地址。bx+si+idata 用兩個(gè)變量和一個(gè)常量表示地址。 從idata一直到bx+si+idata,我們可以用更加靈活的方式來定位一個(gè)內(nèi)存單元的地址。 這使我們可以從更加結(jié)構(gòu)化的角度來看待所要處理的數(shù)據(jù)。舉例說明。作業(yè):匯編語言程序設(shè)計(jì) 教 案編號(hào):

36、8第八章 數(shù)據(jù)處理的兩個(gè)基本問題教學(xué)目的:(1) 理解數(shù)據(jù)處理的基本問題一:指令要處理的數(shù)據(jù)在什么地方(2) 理解數(shù)據(jù)處理的基本問題二:指令要處理的數(shù)據(jù)長度是多少(3) 掌握匯編指令div,偽指令dd,操作符dup的格式及應(yīng)用教學(xué)重點(diǎn)及難點(diǎn):在理解數(shù)據(jù)處理的兩個(gè)基本問題的基礎(chǔ)上,掌握尋址方式的靈活應(yīng)用教學(xué)方法:講授、示例、練習(xí)教學(xué)過程:1、引言兩個(gè)問題:(1)處理的數(shù)據(jù)在什么地方?(2)要處理的數(shù)據(jù)有多長?reg的集合包括:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di;sreg的集合包括:ds、ss、cs、es。8.1 bx、si、di、bpl

37、 在8086CPU中,只能使用這4個(gè)寄存器尋址內(nèi)存單元。l 在 中,這4個(gè)寄存器可以單個(gè)出現(xiàn),或只能以下列組合出現(xiàn):bx和si、di ; bp和si、di ;l 只要在 中使用寄存器bp,段地址就默認(rèn)在ss中。8.2 機(jī)器指令處理的數(shù)據(jù)所在位置數(shù)據(jù)處理的方式:讀、寫、運(yùn)算數(shù)據(jù)所在位置:CPU內(nèi)部、內(nèi)存、端口8.3 匯編語言中數(shù)據(jù)位置的表達(dá)立即數(shù)要處理的數(shù)據(jù)直接包含在指令中寄存器要處理的數(shù)據(jù)在指令中的寄存器中段地址(SA):偏移地址(EA)要處理的數(shù)據(jù)在內(nèi)存中8.4 尋址方式當(dāng)數(shù)據(jù)存放在內(nèi)存中的時(shí)候,我們可以用多種方式來給定這個(gè)內(nèi)存單元的偏移地址,這種定位內(nèi)存單元的方法一般被稱為尋址方式。直接尋

38、址,寄存器間接尋址,寄存器相對尋址,基址變址尋址,基址變址相對尋址。8.5 指令要處理的數(shù)據(jù)有多長?8086CPU可以處理的數(shù)據(jù)長度:8位byte字節(jié)型數(shù)據(jù)16位word字?jǐn)?shù)據(jù)匯編語言中的處理方法:l 通過寄存器指明要處理的數(shù)據(jù)長度;l 在沒有寄存器的情況下用word ptr/byte ptr指明數(shù)據(jù)長度 l 其他方法(默認(rèn)長度) :push8.6 尋址方式的綜合應(yīng)用任務(wù):編程修改內(nèi)存中的過時(shí)數(shù)據(jù)。一般來說,我們可以用bx+idata+si的方式來訪問結(jié)構(gòu)體中的數(shù)據(jù)。用bx定位整個(gè)結(jié)構(gòu)體,用idata定位結(jié)構(gòu)體中的某一個(gè)數(shù)據(jù)項(xiàng),用 si 定位數(shù)組項(xiàng)中的每個(gè)元素 。為此,匯編語言提供了更為貼切的

39、書寫方式。如:bx.idata、bx.idatasi。8.7 div 除法指令格式: div op(內(nèi)存單元、寄存器)說明:div指令示例div byte ptr ds:0 含義為:(al)=(ax)/(ds)*16+0)的商; (ah)=(ax)/(ds)*16+0)的余數(shù)div word ptr es:0 含義為:(ax)=(dx)*10000H+(ax)/(ds)*16+0)的商;(dx)=(dx)*10000H+(ax)/(ds)*16+0)的余數(shù)編程: 利用除法指令計(jì)算100001/100。利用除法指令計(jì)算1001/100。8.8 偽指令 dd前面我們用db和dw定義字節(jié)型數(shù)據(jù)和字型

40、數(shù)據(jù)。dd是用來定義dword (double word雙字)型數(shù)據(jù)的。8.9 dupdup是一個(gè)操作符,在匯編語言中同db、dw、dd 等一樣,也是由編譯器識(shí)別處理的符號(hào)。它是和db、dw、dd 等數(shù)據(jù)定義偽指令配合使用的,用來進(jìn)行數(shù)據(jù)的重復(fù)。dup的使用格式如下:db 重復(fù)的次數(shù) dup (重復(fù)的字節(jié)型數(shù)據(jù))dw 重復(fù)的次數(shù) dup (重復(fù)的字型數(shù)據(jù))dd 重復(fù)的次數(shù) dup (重復(fù)的雙字?jǐn)?shù)據(jù))作業(yè):匯編語言程序設(shè)計(jì) 教 案編號(hào):9第九章 轉(zhuǎn)移指令的原理教學(xué)目的:(1) 理解匯編語言的分支結(jié)構(gòu)(2) 掌握無條件轉(zhuǎn)移指令jmp的格式、分類、原理及其應(yīng)用(3) 掌握有條件轉(zhuǎn)移指令jcxz的格式

41、、原理及應(yīng)用教學(xué)重點(diǎn)及難點(diǎn):無條件轉(zhuǎn)移指令jmp的格式、分類及其應(yīng)用教學(xué)方法:講授、示例、練習(xí)教學(xué)過程:1、引言:轉(zhuǎn)移指令就是可以控制CPU執(zhí)行指令順序的指令(即可以修改IP,或者同時(shí)修改CS和IP的指令)。8086CPU的轉(zhuǎn)移行為分為:段內(nèi)轉(zhuǎn)移只修改IP的值。短轉(zhuǎn)移:IP的變化范圍為-128+127近轉(zhuǎn)移:IP的變化范圍為-32768+32767段間轉(zhuǎn)移同時(shí)修改CS和IP的值。8086CPU的轉(zhuǎn)移指令分為以下幾類:無條件轉(zhuǎn)移指令 (如:jmp),條件轉(zhuǎn)移指令,循環(huán)指令(如:loop),過程,中斷9.1 操作符offset操作符offset在匯編語言中是由編譯器處理的符號(hào),它的功能是取得標(biāo)號(hào)的

42、偏移地址。9.2 jmp指令jmp為無條件轉(zhuǎn)移,可以只修改IP,也可以同時(shí)修改CS和IP;jmp指令要給出兩種信息:轉(zhuǎn)移的目的地址(直接轉(zhuǎn)移、間接轉(zhuǎn)移)轉(zhuǎn)移的距離(段內(nèi)短轉(zhuǎn)移,段內(nèi)近轉(zhuǎn)移、段間轉(zhuǎn)移 )1、段內(nèi)轉(zhuǎn)移段內(nèi)轉(zhuǎn)移又可分為下面三種形式:段內(nèi)直接短轉(zhuǎn)移,段內(nèi)直接近轉(zhuǎn)移,段內(nèi)間接轉(zhuǎn)移2、段間轉(zhuǎn)移段間轉(zhuǎn)移又可分為下面二種形式:段間直接轉(zhuǎn)移,段間間接轉(zhuǎn)移 9.3 依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令l jmp short 標(biāo)號(hào)(轉(zhuǎn)到標(biāo)號(hào)處執(zhí)行指令)注意:在“jmp short 標(biāo)號(hào)”指令所對應(yīng)的機(jī)器碼中,并不包含轉(zhuǎn)移的目的地址,而包含的是轉(zhuǎn)移的位移。這個(gè)位移,使編譯器根據(jù)匯編指令中的“標(biāo)號(hào)”計(jì)算出來的。

43、指令“jmp short 標(biāo)號(hào)”的功能為(IP)=(IP)+8位位移。(1)8位位移=“標(biāo)號(hào)”處的地址-jmp指令后的第一個(gè)字節(jié)的地址;(2)short指明此處的位移為8位位移;(3)8位位移的范圍為-128127,用補(bǔ)碼表示。(4)8位位移由編譯程序在編譯時(shí)算出。l jmp near ptr 標(biāo)號(hào)它實(shí)現(xiàn)的是段內(nèi)近轉(zhuǎn)移。指令“jmp near ptr 標(biāo)號(hào)”的功能為:(IP)=(IP)+16位位移。指令“jmp near ptr 標(biāo)號(hào)”的說明:(1)16位位移=“標(biāo)號(hào)”處的地址-jmp指令后的第一個(gè)字節(jié)的地址;(2)near ptr指明此處的位移為16位位移,進(jìn)行的是段內(nèi)近轉(zhuǎn)移;(3)16位位

44、移的范圍為 -3276932767,用補(bǔ)碼表示;(4)16位位移由編譯程序在編譯時(shí)算出。9.4 轉(zhuǎn)移的目的地址在指令中的jmp指令l 指令 “jmp far ptr 標(biāo)號(hào)”: 實(shí)現(xiàn)的是段間轉(zhuǎn)移,又稱為遠(yuǎn)轉(zhuǎn)移。指令 “jmp far ptr 標(biāo)號(hào)” 功能如下:(CS)=標(biāo)號(hào)所在段的段地址;(IP)=標(biāo)號(hào)所在段中的偏移地址。far ptr指明了指令用標(biāo)號(hào)的段地址和偏移地址修改CS和IP。9.5 轉(zhuǎn)移地址在寄存器中的jmp指令指令格式:jmp 16位寄存器功能:IP =(16位寄存器)9.6 轉(zhuǎn)移地址在內(nèi)存中的jmp指令轉(zhuǎn)移地址在內(nèi)存中的jmp指令有兩種格式:(1) jmp word ptr 內(nèi)存單

45、元地址(段內(nèi)轉(zhuǎn)移) 功能:從內(nèi)存單元地址處開始存放著一個(gè)字,是轉(zhuǎn)移的目的偏移地址。 內(nèi)存單元地址可用尋址方式的任一格式給出。(2) jmp dword ptr 內(nèi)存單元地址(段間轉(zhuǎn)移) 功能:從內(nèi)存單元地址處開始存放著兩個(gè)字,高地址處的字是轉(zhuǎn)移的目的段地址,低地址處是轉(zhuǎn)移的目的偏移地址。(CS)=(內(nèi)存單元地址+2)(IP)=(內(nèi)存單元地址) 9.7 jcxz指令有條件轉(zhuǎn)移指令指令格式:jcxz 標(biāo)號(hào) 功能:如果(cx)=0,則轉(zhuǎn)移到標(biāo)號(hào)處執(zhí)行。注意:所有的有條件轉(zhuǎn)移都是段內(nèi)短轉(zhuǎn)移,在對應(yīng)的機(jī)器碼中包含轉(zhuǎn)移的位移,對IP的修改范圍都為-128127。jcxz 標(biāo)號(hào) 指令操作:當(dāng)(cx)=0時(shí),

46、(IP)=(IP)+8位位移)8位位移=“標(biāo)號(hào)”處的地址-jcxz指令后的第一個(gè)字節(jié)的地址;8位位移的范圍為-128127,用補(bǔ)碼表示;8位位移由編譯程序在編譯時(shí)算出。當(dāng)(cx)=0時(shí),什么也不做(程序向下執(zhí)行)。9.8 loop指令循環(huán)指令指令格式:loop 標(biāo)號(hào)功能:(cx)=(cx)-1,如果(cx)0,轉(zhuǎn)移到標(biāo)號(hào)處執(zhí)行。注意:所有的循環(huán)指令都是段內(nèi)短轉(zhuǎn)移,在對應(yīng)的機(jī)器碼中包含轉(zhuǎn)移的位移,對IP的修改范圍都為-128127。loop 標(biāo)號(hào) 指令操作:(1)(cx)=(cx)-1;(2)如果(cx)0,(IP)=(IP)+8位位移。8位位移=“標(biāo)號(hào)”處的地址-loop指令后的第一個(gè)字節(jié)的地

47、址;8位位移的范圍為-128127,用補(bǔ)碼表示;8位位移由編譯程序在編譯時(shí)算出。當(dāng)(cx)=0,什么也不做(程序向下執(zhí)行)。9.9 根據(jù)位移進(jìn)行轉(zhuǎn)移的意義前面我們講到: jmp short 標(biāo)號(hào) jmp near ptr 標(biāo)號(hào) jcxz 標(biāo)號(hào) loop 標(biāo)號(hào) 等幾種匯編指令,它們對 IP的修改是根據(jù)轉(zhuǎn)移目的地址和轉(zhuǎn)移起始地址之間的位移來進(jìn)行的。在它們對應(yīng)的機(jī)器碼中不包含轉(zhuǎn)移的目的地址,而包含的是到目的地址的位移。這樣設(shè)計(jì),方便了程序段在內(nèi)存中的浮動(dòng)裝配。9.10 編譯器對轉(zhuǎn)移位移超界的檢測注意,根據(jù)位移進(jìn)行轉(zhuǎn)移的指令,它們的轉(zhuǎn)移范圍受到轉(zhuǎn)移位移的限制,如果在源程序中出現(xiàn)了轉(zhuǎn)移范圍超界的問題,在

48、編譯的時(shí)候,編譯器將報(bào)錯(cuò)。作業(yè):匯編語言程序設(shè)計(jì) 教 案編號(hào):10第十章 CALL和RET指令教學(xué)目的:(1) 理解匯編語言的子程序結(jié)構(gòu)及模塊化程序設(shè)計(jì)思想(2) 掌握轉(zhuǎn)移指令call的格式、分類、原理及其應(yīng)用(3) 掌握轉(zhuǎn)移指令call和ret的配合使用以實(shí)現(xiàn)子程序的機(jī)制(4) 掌握運(yùn)算指令mul的格式及應(yīng)用教學(xué)重點(diǎn)及難點(diǎn):call指令的分類及原理,子程序結(jié)構(gòu)中的參數(shù)和結(jié)果傳遞問題教學(xué)方法:講授、示例、練習(xí)教學(xué)過程:1、引言call和ret 指令都是轉(zhuǎn)移指令,它們都修改IP,或同時(shí)修改CS和IP。它們經(jīng)常被共同用來實(shí)現(xiàn)自程序的設(shè)計(jì)。2、教學(xué)內(nèi)容10.1 ret 和 retf 返回指令ret指

49、令用棧中的數(shù)據(jù),修改IP的內(nèi)容,從而實(shí)現(xiàn)近轉(zhuǎn)移;操作:相當(dāng)于pop ipretf指令用棧中的數(shù)據(jù),修改CS和IP的內(nèi)容,從而實(shí)現(xiàn)遠(yuǎn)轉(zhuǎn)移;操作:相當(dāng)于pop ippop cs10.2 call 指令CPU執(zhí)行call指令,進(jìn)行兩步操作:(1)將當(dāng)前的 IP 或 CS和IP 壓入棧中; push ip或push cs、push ip;(2)轉(zhuǎn)移。 修改當(dāng)前ip或ip和cs指向目的地址。 call 指令不能實(shí)現(xiàn)短轉(zhuǎn)移,除此之外,call指令實(shí)現(xiàn)轉(zhuǎn)移的方法和 jmp 指令的原理相同,下面的幾個(gè)小節(jié)中 ,我們以給出轉(zhuǎn)移目的地址的不同方法為主線,講解call指令的主要應(yīng)用格式:根據(jù)位移轉(zhuǎn)移、轉(zhuǎn)移的目的地址

50、在指令中、轉(zhuǎn)移地址在寄存器中、轉(zhuǎn)移地址在內(nèi)存中。10.3 依據(jù)位移進(jìn)行轉(zhuǎn)移的call指令格式:call 標(biāo)號(hào)功能:將當(dāng)前IP壓棧,IP=IP+16位的位移量,轉(zhuǎn)移到標(biāo)號(hào)處執(zhí)行,實(shí)現(xiàn)近轉(zhuǎn)移。相當(dāng)于: push ipjmp near ptr 標(biāo)號(hào)10.4 轉(zhuǎn)移的目的地址在指令中的call指令格式: call far ptr 標(biāo)號(hào)功能: 將當(dāng)前CS、IP壓棧,用標(biāo)號(hào)所在地址修改CS和IP實(shí)現(xiàn)遠(yuǎn)轉(zhuǎn)移(段間轉(zhuǎn)移)。相當(dāng)于: push cs push ip jmp far ptr 標(biāo)號(hào)10.5 轉(zhuǎn)移地址在寄存器中的call指令格式: call reg(16位的寄存器)功能: 將當(dāng)前IP壓棧,用寄存器中的值

51、修改IP實(shí)現(xiàn)近轉(zhuǎn)移。相當(dāng)于: push ipjmp 16位reg10.6 轉(zhuǎn)移地址在內(nèi)存中的call指令轉(zhuǎn)移地址在內(nèi)存中的call指令有兩種格式:(1) call word ptr 內(nèi)存單元地址功能: 將當(dāng)前IP壓棧,用內(nèi)存單元中的字修改IP。匯編語法解釋: push ip jmp word ptr 內(nèi)存單元地址(2) call dword ptr 內(nèi)存單元地址功能: 將當(dāng)前IP、CS壓棧,用內(nèi)存單元中雙字修改IP和CS。匯編語法解釋: push cspush ip jmp dword ptr 內(nèi)存單元地址10.7 call 和 ret 的配合使用前面,我們已經(jīng)分別學(xué)習(xí)了 ret 和call指

52、令的原理?,F(xiàn)在我們看一下,如何將它們配合使用來實(shí)現(xiàn)子程序的機(jī)制。舉例說明。10.8 mul 指令乘法指令格式:mul reg mul 內(nèi)存單元功能:字節(jié)(8位)或字(16位)的無符號(hào)相乘 說明:兩個(gè)相乘的數(shù)位數(shù)相同,8位乘法(乘數(shù)和被乘數(shù)都為8位數(shù));16位乘法(乘數(shù)和被乘數(shù)都為16位。)8位乘法中,一個(gè)乘數(shù)默認(rèn)在AL中,另一個(gè)由指令給出,16位的結(jié)果默認(rèn)保存在AX中。16位乘法中,一個(gè)乘數(shù)默認(rèn)在AX中,另一個(gè)由指令給出,32位的結(jié)果中高位保存在DX中,低位在AX中。10.9 模塊化程序設(shè)計(jì)在實(shí)際編程中,程序的模塊化是必不可少的。因?yàn)楝F(xiàn)實(shí)的問題比較復(fù)雜,對現(xiàn)實(shí)問題進(jìn)行分析時(shí),把它轉(zhuǎn)化成為相互聯(lián)

53、系、不同層次的子問題,是必須的解決方法。從上面我們看到 ,call 及 ret 指令共同支持了匯編語言編程中的模塊化設(shè)計(jì)。可使用call指令在主程序中調(diào)用子程序來解決子問題,子問題解決后用ret指令來返回主程序。10.10 參數(shù)和結(jié)果傳遞的問題子程序一般都要根據(jù)提供的參數(shù)處理一定的事務(wù),處理后,將結(jié)果(返回值)提供給調(diào)用者。我們討論參數(shù)和返回值傳遞的問題,實(shí)際上就是在探討,應(yīng)該如何存儲(chǔ)子程序需要的參數(shù)和產(chǎn)生的返回值。 舉例說明用寄存器來存儲(chǔ)參數(shù)和結(jié)果是最常使用的方法。對于存放參數(shù)的寄存器和存放結(jié)果的寄存器,調(diào)用者和子程序的讀寫操作恰恰相反:調(diào)用者將參數(shù)送入?yún)?shù)寄存器(寫),從結(jié)果寄存器中取到返回值(讀);子程序從參數(shù)寄存器中取到參數(shù)(讀),將返回值送入結(jié)果寄存器(寫)。 10.11 批量數(shù)據(jù)的傳遞前面的例程中,子程序 cube 只有一個(gè)參數(shù),放在bx中。如果有兩個(gè)參數(shù),那么可以用兩個(gè)寄存器來放,可是如果需要傳遞的數(shù)據(jù)有3個(gè)、4個(gè)或更多直至 N個(gè),我們怎樣存放呢?寄存器的數(shù)量終究有限,我們不可能簡單地用寄存器來存放多個(gè)需要傳遞的數(shù)據(jù)。對于返回值,也有同樣的問題。在這種時(shí)候,我們將批量數(shù)據(jù)放到內(nèi)存中,然

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論