第11~12講 第4章語(yǔ)言程序設(shè)計(jì)_第1頁(yè)
第11~12講 第4章語(yǔ)言程序設(shè)計(jì)_第2頁(yè)
第11~12講 第4章語(yǔ)言程序設(shè)計(jì)_第3頁(yè)
第11~12講 第4章語(yǔ)言程序設(shè)計(jì)_第4頁(yè)
第11~12講 第4章語(yǔ)言程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩61頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第 4 章stackstacksegment stacksegment stack; ;定義堆棧段定義堆棧段dw 512 dup(?)dw 512 dup(?); ;堆棧段有堆棧段有512512字(字(10241024字節(jié))空間字節(jié))空間stackstackendsends; ;堆棧段結(jié)束堆棧段結(jié)束datadatasegmentsegment; ;定義數(shù)據(jù)段定義數(shù)據(jù)段stringstringdb db Hello, Everybody !Hello, Everybody !,0dh,0ah,0dh,0ah,$ $datadataendsendscodecodesegment segment c

2、odecode; ;定義代碼段定義代碼段assume cs:code,ds:data,ss:stackassume cs:code,ds:data,ss:stackstart:start:mov ax,datamov ax,data; ;建立建立DSDS段地址段地址mov ds,axmov ds,axmov dx,offset stringmov dx,offset stringmov ah,9mov ah,9int 21hint 21hmov ax,4c00hmov ax,4c00hint 21hint 21h; ;利用功能調(diào)用返回利用功能調(diào)用返回DOSDOScodecodeendsends

3、; ;代碼段結(jié)束代碼段結(jié)束end startend start; ;匯編結(jié)束,同時(shí)指明程序起始點(diǎn)匯編結(jié)束,同時(shí)指明程序起始點(diǎn)完整段定義格式完整段定義格式數(shù)據(jù)段數(shù)據(jù)段堆棧段堆棧段(可略)可略)分配段寄存器分配段寄存器首指令位置首指令位置返回返回DOS設(shè)置設(shè)置DS段寄存器內(nèi)容段寄存器內(nèi)容源程序結(jié)束,第源程序結(jié)束,第一條指令的地址一條指令的地址n這是編寫(xiě)程序的模版:極其重要。這是編寫(xiě)程序的模版:極其重要。n匯編語(yǔ)言匯編語(yǔ)言的的main 在哪里?在哪里?第 4 章 例例 data seg ARR1 DB 00H,11H,22H,33H ARR2 DW 3456H,1024,2525,1000/3,10

4、A0H data endsARR100H11H22H33HARR256H34H00H04H71H02H4DH01HA0H10H0123456789ABCDEARR1的偏移地址是 0ARR2的偏移地址是 4MOV AX , ARR2 ; (AX) = ?MOV AX , OFFSET ARR2 ; (AX) = ?MOV AL , ARR2 + 5 ;(AL) = ? (X) MOV AX , ARR1+1 ; (AX) = ? (X)n偏移偏移地址地址這個(gè)這個(gè)例子說(shuō)明兩點(diǎn):例子說(shuō)明兩點(diǎn):1。變量的值與變量的地址的區(qū)別。變量的值與變量的地址的區(qū)別2。變量的類型。變量的類型-字節(jié)與字的區(qū)別字節(jié)與字

5、的區(qū)別第 4 章編輯編輯文本編輯器,如文本編輯器,如 EDIT.COM源程序:文件名源程序:文件名.asm匯編匯編匯編程序,如匯編程序,如 MASM.EXE目標(biāo)模塊:文件名目標(biāo)模塊:文件名.obj連接連接連接程序,如連接程序,如 LINK.EXE可執(zhí)行文件:文件名可執(zhí)行文件:文件名.exe調(diào)試調(diào)試調(diào)試程序,如調(diào)試程序,如 DEBUG.EXE應(yīng)用程序應(yīng)用程序錯(cuò)誤錯(cuò)誤錯(cuò)誤錯(cuò)誤錯(cuò)誤錯(cuò)誤錯(cuò)誤錯(cuò)誤注意:注意:MASM及及LINK生成的是后綴為生成的是后綴為EXE的可執(zhí)行的可執(zhí)行文件文件,與普通與普通CPU的的BIN或或HEX文件是不同的文件是不同的第 4 章微機(jī)原理與接口技術(shù) 第第4章章 深入淺出學(xué)編程

6、深入淺出學(xué)編程第 4 章通過(guò)本章的學(xué)習(xí),應(yīng)當(dāng)掌握以下內(nèi)容:n了解匯編語(yǔ)言的基本知識(shí)和特點(diǎn)。n熟悉匯編語(yǔ)言的程序結(jié)構(gòu)、段定義以及語(yǔ)句的格式。n掌握匯編語(yǔ)言常用偽指令的使用方法。n熟練掌握匯編語(yǔ)言程序設(shè)計(jì)的基本方法:順序結(jié)構(gòu)、 分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu)。n*掌握程序設(shè)計(jì)中的宏指令和常用的系統(tǒng)功能的調(diào)用方法。教學(xué)目的綜合硬指令和偽指令,從程綜合硬指令和偽指令,從程序結(jié)構(gòu)角度展開(kāi)程序設(shè)計(jì),:序結(jié)構(gòu)角度展開(kāi)程序設(shè)計(jì),:分支結(jié)構(gòu)程序設(shè)計(jì)分支結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)程序設(shè)計(jì)子程序結(jié)構(gòu)程序設(shè)計(jì)子程序結(jié)構(gòu)程序設(shè)計(jì)教學(xué)重點(diǎn)教學(xué)重點(diǎn)1. 掌握掌握、及其匯編語(yǔ)言程序設(shè)計(jì)及其匯編語(yǔ)言程序設(shè)計(jì)2. 問(wèn)題

7、:?jiǎn)栴}:(09、AZ、az);第 4 章 一、匯編語(yǔ)言程序設(shè)計(jì)的一般步驟一、匯編語(yǔ)言程序設(shè)計(jì)的一般步驟 分析課題分析課題 確定算法確定算法 畫(huà)流程圖畫(huà)流程圖 編寫(xiě)程序編寫(xiě)程序 上機(jī)調(diào)試上機(jī)調(diào)試 當(dāng)接到程序設(shè)計(jì)的任務(wù)后,當(dāng)接到程序設(shè)計(jì)的任務(wù)后,首先對(duì)任務(wù)進(jìn)行詳盡的分首先對(duì)任務(wù)進(jìn)行詳盡的分析,搞清楚已知的數(shù)據(jù)和析,搞清楚已知的數(shù)據(jù)和想要得到的結(jié)果,想要得到的結(jié)果,程序應(yīng)程序應(yīng)該完成何種的功能。該完成何種的功能。匯編語(yǔ)言設(shè)計(jì)的一般步驟第 4 章 一、匯編語(yǔ)言程序設(shè)計(jì)的一般步驟一、匯編語(yǔ)言程序設(shè)計(jì)的一般步驟 分析課題分析課題 確定算法確定算法 畫(huà)流程圖畫(huà)流程圖 編寫(xiě)程序編寫(xiě)程序 上機(jī)調(diào)試上機(jī)調(diào)試 根據(jù)

8、實(shí)際問(wèn)題的要求和指令根據(jù)實(shí)際問(wèn)題的要求和指令系統(tǒng)的特點(diǎn),確定解決問(wèn)題系統(tǒng)的特點(diǎn),確定解決問(wèn)題的具體步驟。根據(jù)任務(wù)要求,的具體步驟。根據(jù)任務(wù)要求,對(duì)不同的計(jì)算方法進(jìn)行比較,對(duì)不同的計(jì)算方法進(jìn)行比較,選擇最適宜的算法選擇最適宜的算法。 匯編語(yǔ)言設(shè)計(jì)的一般步驟第 4 章 一、匯編語(yǔ)言程序設(shè)計(jì)的一般步驟一、匯編語(yǔ)言程序設(shè)計(jì)的一般步驟 分析課題分析課題 確定算法確定算法 畫(huà)流程圖畫(huà)流程圖 編寫(xiě)程序編寫(xiě)程序 上機(jī)調(diào)試上機(jī)調(diào)試將解決問(wèn)題的具體步驟用一將解決問(wèn)題的具體步驟用一種約定的幾何圖形、指向線種約定的幾何圖形、指向線和必要的文字說(shuō)明描述出來(lái)和必要的文字說(shuō)明描述出來(lái)的圖形。工具:的圖形。工具:VISIO,

9、AUTOCAD匯編語(yǔ)言設(shè)計(jì)的一般步驟第 4 章 一、匯編語(yǔ)言程序設(shè)計(jì)的一般步驟一、匯編語(yǔ)言程序設(shè)計(jì)的一般步驟 分析課題分析課題 確定算法確定算法 畫(huà)流程圖畫(huà)流程圖 編寫(xiě)程序編寫(xiě)程序 上機(jī)調(diào)試上機(jī)調(diào)試 經(jīng)過(guò)上述各步驟后,解決問(wèn)題經(jīng)過(guò)上述各步驟后,解決問(wèn)題的思路已經(jīng)非常清楚,所以接下來(lái)的思路已經(jīng)非常清楚,所以接下來(lái)就可以按流程圖的順序?qū)γ恳粋€(gè)功就可以按流程圖的順序?qū)γ恳粋€(gè)功能框選用合適的指令編寫(xiě)出匯編語(yǔ)能框選用合適的指令編寫(xiě)出匯編語(yǔ)言程序。言程序。 工具工具: UltraEdit, Beyond Compare 2匯編語(yǔ)言設(shè)計(jì)的一般步驟第 4 章 一、匯編語(yǔ)言程序設(shè)計(jì)的一般步驟一、匯編語(yǔ)言程序設(shè)計(jì)

10、的一般步驟 分析課題分析課題 確定算法確定算法 畫(huà)流程圖畫(huà)流程圖 編寫(xiě)程序編寫(xiě)程序 上機(jī)調(diào)試上機(jī)調(diào)試在應(yīng)用程序的設(shè)計(jì)中,幾乎在應(yīng)用程序的設(shè)計(jì)中,幾乎沒(méi)有一個(gè)程序只經(jīng)過(guò)一次編沒(méi)有一個(gè)程序只經(jīng)過(guò)一次編寫(xiě)就完全成功的,所以必須寫(xiě)就完全成功的,所以必須經(jīng)過(guò)上機(jī)調(diào)試。工具:經(jīng)過(guò)上機(jī)調(diào)試。工具: MASM,TASM,Emu8086, ReallyASM, Debug匯編語(yǔ)言設(shè)計(jì)的一般步驟一個(gè)程序應(yīng)包括兩個(gè)方面的內(nèi)容一個(gè)程序應(yīng)包括兩個(gè)方面的內(nèi)容對(duì)數(shù)據(jù)的描述:數(shù)據(jù)結(jié)構(gòu)對(duì)數(shù)據(jù)的描述:數(shù)據(jù)結(jié)構(gòu)(data structure)對(duì)操作的描述:算法對(duì)操作的描述:算法(algorithm)著名計(jì)算機(jī)科學(xué)家沃思提出一個(gè)公式

11、: 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) + 算法算法 = 程序程序數(shù)據(jù)結(jié)構(gòu)算法程序設(shè)計(jì)方法合適語(yǔ)言工具數(shù)據(jù)結(jié)構(gòu)算法程序設(shè)計(jì)方法合適語(yǔ)言工具完整的程序設(shè)計(jì)應(yīng)該是:第 4 章算法的概念 廣義地說(shuō),為解決一個(gè)問(wèn)題而采取的方法和步驟,就稱廣義地說(shuō),為解決一個(gè)問(wèn)題而采取的方法和步驟,就稱為為“算法算法”。方法方法1:1+2,+3,+4,一直加到,一直加到100 加加99次次方法方法2:100+(1+99)+(2+98)+(49 +51)+50 = 100 + 49100 +50 加加51次次對(duì)同一個(gè)問(wèn)題,可有不同的解題方法和步驟對(duì)同一個(gè)問(wèn)題,可有不同的解題方法和步驟例: 求1001nn簡(jiǎn)單地說(shuō):算法就簡(jiǎn)單地說(shuō):算法就是解

12、決問(wèn)題的思路是解決問(wèn)題的思路問(wèn)題是:匯編語(yǔ)言問(wèn)題是:匯編語(yǔ)言與高級(jí)語(yǔ)言的思路與高級(jí)語(yǔ)言的思路不太一樣不太一樣第 4 章用流程圖表示算法用流程圖表示算法美國(guó)國(guó)家標(biāo)準(zhǔn)化協(xié)會(huì)美國(guó)國(guó)家標(biāo)準(zhǔn)化協(xié)會(huì)ANSI(American National Standard ANSI(American National Standard Institute)Institute)規(guī)定了一些常用的流程圖符號(hào):規(guī)定了一些常用的流程圖符號(hào):起止框起止框判斷框判斷框處理框處理框輸入輸入/輸出框輸出框注釋框注釋框流向線流向線連接點(diǎn)連接點(diǎn)希望大希望大家重視家重視流程圖是表示算法的較好的工具。一個(gè)流程流程圖是表示算法的較好的工具。一個(gè)

13、流程圖包括以下幾部分圖包括以下幾部分 :(1)(1)表示相應(yīng)操作的框;表示相應(yīng)操作的框;(2)(2)帶箭頭的流程線;帶箭頭的流程線;(3)(3)框內(nèi)外必要的文字說(shuō)明??騼?nèi)外必要的文字說(shuō)明。 第 4 章傳統(tǒng)流程圖的流程可以是:傳統(tǒng)流程圖的流程可以是: 這種如同亂麻一樣的算法稱為這種如同亂麻一樣的算法稱為BSBS型算法,意為一碗型算法,意為一碗面條面條(A Bowl of Spaghetti)(A Bowl of Spaghetti),亂無(wú)頭緒。,亂無(wú)頭緒。缺點(diǎn):難以閱讀、修改,使算法的可靠性和可維護(hù)性難以保證。解決辦法:必須限制箭頭的濫用,即不允許無(wú)規(guī)律地使流程隨意轉(zhuǎn)向,只能順序地進(jìn)行下去。 第

14、 4 章 (3 3)分支)分支( (選擇)結(jié)構(gòu)選擇)結(jié)構(gòu) (4 4) 子程序結(jié)構(gòu)子程序結(jié)構(gòu) 程序結(jié)構(gòu)程序結(jié)構(gòu)(5)復(fù)合結(jié)構(gòu):多種程序結(jié)構(gòu)的組合)復(fù)合結(jié)構(gòu):多種程序結(jié)構(gòu)的組合 (1 1) 順序結(jié)構(gòu)順序結(jié)構(gòu) (2 2) 循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)Bohra和Jacopini提出了以下三種基本結(jié)構(gòu): 順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu) 用這三種基本結(jié)構(gòu)作為表示一個(gè)良好算法的基本單元。第 4 章 圖中沒(méi)有一條從入口圖中沒(méi)有一條從入口到出口的路徑通過(guò)到出口的路徑通過(guò)A A框。框。不正確的流程表示:不正確的流程表示:流程內(nèi)的死循環(huán)流程內(nèi)的死循環(huán)第 4 章4.3 順序程序設(shè)計(jì)順序程序完全按指令書(shū)

15、順序程序完全按指令書(shū)寫(xiě)的前后順序執(zhí)行每一寫(xiě)的前后順序執(zhí)行每一條指令,是最基本、最條指令,是最基本、最常見(jiàn)的程序結(jié)構(gòu)常見(jiàn)的程序結(jié)構(gòu)一般純粹的順序結(jié)構(gòu)的一般純粹的順序結(jié)構(gòu)的程序設(shè)計(jì)較少程序設(shè)計(jì)較少開(kāi)始執(zhí)行1結(jié)束執(zhí)行2例4.1.model small.model small.stack.stack.data.dataX Xdw 5dw 5Y Ydw 6dw 6Z Zdw 7dw 7W Wdw ?dw ?.code.code.startup.startupmov ax,Xmov ax,Xadd ax,Yadd ax,Yadd ax,Zadd ax,Zmov W,axmov W,ax.exit 0.ex

16、it 0endend計(jì)算:Z=X+Y,結(jié)果放在W64位數(shù)據(jù)左移8位 例4.21/2.data.dataqvarqvar dq 1234567887654321hdq 1234567887654321h.code.codemov al,mov al,byte ptr qvar6byte ptr qvar6mov mov byte ptr qvar7byte ptr qvar7,al,almov al,byte ptr qvar5mov al,byte ptr qvar5mov byte ptr qvar6,almov byte ptr qvar6,almov al,byte ptr qvar4m

17、ov al,byte ptr qvar4mov byte ptr qvar5,almov byte ptr qvar5,almov al,byte ptr qvar3mov al,byte ptr qvar3mov byte ptr qvar4,almov byte ptr qvar4,al圖示圖示3456788765432100例4.22/2mov al,byte ptr qvar2mov al,byte ptr qvar2mov byte ptr qvar3,almov byte ptr qvar3,almov al,byte ptr qvar1mov al,byte ptr qvar1m

18、ov byte ptr qvar2,almov byte ptr qvar2,almov al,byte ptr qvar0mov al,byte ptr qvar0mov byte ptr qvar1,almov byte ptr qvar1,almov mov byte ptr qvar0,0byte ptr qvar0,01212 3434 5656 7878 8787 6565 4343 2121h h3434 5656 7878 8787 6565 4343 2121 0000h h移位后移位后圖示圖示第 4 章64位數(shù)據(jù)左移8位123456788765432100qvar0qvar

19、1qvar2qvar3qvar4qvar5qvar6qvar7例題 代碼轉(zhuǎn)換1/2;查表法,實(shí)現(xiàn)一位;查表法,實(shí)現(xiàn)一位1616進(jìn)制數(shù)轉(zhuǎn)換為進(jìn)制數(shù)轉(zhuǎn)換為ASCIIASCII碼顯示碼顯示.model small.model small.stack.stack.data.dataASCIIASCII db 30h,31h,32h,33h,34h,35hdb 30h,31h,32h,33h,34h,35hdb 36h,37h,38h,39hdb 36h,37h,38h,39h ;0;09 9的的ASCIIASCII碼碼db 41h,42h,43h,44h,45h,46hdb 41h,42h,43h,4

20、4h,45h,46h;A;AF F的的ASCIIASCII碼碼hexhexdb 0bhdb 0bh; ;任意設(shè)定了一個(gè)待轉(zhuǎn)換的一位任意設(shè)定了一個(gè)待轉(zhuǎn)換的一位1616進(jìn)制數(shù)進(jìn)制數(shù)例題 代碼轉(zhuǎn)換2/2.code.code.startup.startupmov bx,offset ASCIImov bx,offset ASCII;BX;BX指向指向ASCIIASCII碼表碼表mov al,hexmov al,hex;AL;AL取得一位取得一位1616進(jìn)制數(shù),正是進(jìn)制數(shù),正是ASCIIASCII碼表中位移碼表中位移and al,0fhand al,0fh; ;只有低只有低4 4位是有效的,高位是有效的

21、,高4 4位清位清0 0 xlatxlat; ;換碼:換碼:ALDS:BXALDS:BXALALmov dl,almov dl,al; ;入口參數(shù):入口參數(shù):DLALDLALmov ah,2mov ah,2;02;02號(hào)號(hào)DOSDOS功能調(diào)用功能調(diào)用 顯示出來(lái)顯示出來(lái)int 21hint 21h; ;顯示一個(gè)顯示一個(gè)ASCIIASCII碼字符碼字符.exit 0.exit 0endend第 4 章開(kāi)始設(shè)置數(shù)據(jù)段和堆棧段地址設(shè)置堆棧指針取數(shù)據(jù)截取高四位右移四位 例:例:設(shè)內(nèi)存DATA單元存放一個(gè)無(wú)符號(hào)字節(jié)數(shù)據(jù),編制程序?qū)⑵洳鸪蓛晌皇M(jìn)制數(shù), 并存入HEX和HEX+1單元的低4位,HEX存放高位

22、十六進(jìn)制數(shù), HEX+1單元存放低位十六進(jìn)制數(shù) 解解 : 分析命題分析命題確定算法確定算法畫(huà)流程圖畫(huà)流程圖拆字程序拆字程序取原數(shù)據(jù)結(jié)束保存高位十六進(jìn)制數(shù)截取低四位保存低位十六進(jìn)制數(shù)保存結(jié)果第 4 章 MOV SS,AX MOV SP,LENGTH STK MOV AL,DATA MOV AH,AL AND AL,0F0H MOV CL,04 SHR AL,CL MOV HEX,AL AND AH,0FH MOV HEX+1,AH MOV AX,4C00H INT 21HCSEG ENDS END BEG 例:例:設(shè)內(nèi)存DATA單元存放一個(gè)無(wú)符號(hào)字節(jié)數(shù)據(jù),編制程序?qū)⑵洳鸪蓛晌皇M(jìn)制數(shù), 并存入

23、HEX和HEX+1單元的低4位,HEX存放高位十六進(jìn)制數(shù), HEX+1單元存放低位十六進(jìn)制數(shù) 解解 : 分析命題分析命題確定算法確定算法畫(huà)流程圖畫(huà)流程圖編寫(xiě)程序編寫(xiě)程序上機(jī)調(diào)試上機(jī)調(diào)試拆字程序拆字程序 SSEGSEGMENT STACKSTKDB 20 DUP(0)SSEG ENDSDSEG SEGMENTDATA DB 0B5HHEXDB 0,0DSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGASSUME SS:SSEGBEG: MOV AX,DSEGMOV DS,AX MOV AX,SSEG第 4 章4.4 分支程序設(shè)計(jì)分支程序根據(jù)條件是真或假?zèng)Q定執(zhí)行

24、分支程序根據(jù)條件是真或假?zèng)Q定執(zhí)行與否與否判斷的條件是各種指令,如判斷的條件是各種指令,如CMP、TEST等執(zhí)行后形成的狀態(tài)標(biāo)志等執(zhí)行后形成的狀態(tài)標(biāo)志轉(zhuǎn)移指令轉(zhuǎn)移指令Jcc和和JMP可以實(shí)現(xiàn)分支控制可以實(shí)現(xiàn)分支控制單分支:求絕對(duì)值等雙分支:顯示BX最高位等多分支:例4.4等第 4 章29/18匯編語(yǔ)言程序的基本結(jié)構(gòu)分支結(jié)構(gòu)分支結(jié)構(gòu):n利用條件轉(zhuǎn)移指令,使程序執(zhí)行到某一指令后,根利用條件轉(zhuǎn)移指令,使程序執(zhí)行到某一指令后,根據(jù)條件是否滿足,來(lái)改變程序執(zhí)行的順序。據(jù)條件是否滿足,來(lái)改變程序執(zhí)行的順序。n一般先用一般先用比較指令比較指令或或數(shù)據(jù)操作數(shù)據(jù)操作及及位檢測(cè)指令位檢測(cè)指令來(lái)改變來(lái)改變標(biāo)志寄存器各

25、個(gè)標(biāo)志位,然后用標(biāo)志寄存器各個(gè)標(biāo)志位,然后用條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令進(jìn)行進(jìn)行分支。分支。n繪制程序流程圖步驟必不可少!繪制程序流程圖步驟必不可少!n繪制程序流程圖,一般先按上下流程線寫(xiě),再完成繪制程序流程圖,一般先按上下流程線寫(xiě),再完成分支部分。分支部分。n繪制程序流程圖的判斷環(huán)節(jié)時(shí),要特別注意把握繪制程序流程圖的判斷環(huán)節(jié)時(shí),要特別注意把握邏邏輯關(guān)系輯關(guān)系和和標(biāo)志位的意義標(biāo)志位的意義。分支如何產(chǎn)生第 4 章單分支程序設(shè)計(jì)條件成立跳轉(zhuǎn),否條件成立跳轉(zhuǎn),否則順序執(zhí)行分支語(yǔ)則順序執(zhí)行分支語(yǔ)句體;注意選擇正句體;注意選擇正確的條件轉(zhuǎn)移指令確的條件轉(zhuǎn)移指令和轉(zhuǎn)移目標(biāo)地址和轉(zhuǎn)移目標(biāo)地址例題 求絕對(duì)值;計(jì)算

26、;計(jì)算AXAX的絕對(duì)值的絕對(duì)值cmp ax,0cmp ax,0jns no_negjns no_neg ; ;分支條件:分支條件:AX0AX0neg axneg ax; ;條件不滿足,求補(bǔ)條件不滿足,求補(bǔ)no_neg:no_neg: mov result,axmov result,ax; ;條件滿足條件滿足;計(jì)算;計(jì)算AXAX的絕對(duì)值的絕對(duì)值cmp ax,0cmp ax,0js yesnegjs yesneg; ;分支條件:分支條件:AXAX0 0jmp nonneg ;jmp nonneg ;分支條件:分支條件:AX=0AX=0yesneg:yesneg: neg axneg ax; ;條件

27、不滿足,求補(bǔ)條件不滿足,求補(bǔ)nonneg:nonneg: mov result,axmov result,ax; ;條件滿足條件滿足Good Bad例題 無(wú)符號(hào)數(shù)除以2(自學(xué));AXAX中存放的無(wú)符號(hào)數(shù)中存放的無(wú)符號(hào)數(shù); ;如果是偶數(shù)除以如果是偶數(shù)除以2 2,如果,如果是奇數(shù),則加是奇數(shù),則加1 1后除以后除以2 2test ax,01htest ax,01h; ;測(cè)試測(cè)試AXAX最低位最低位jz evenjz even; ;最低位為最低位為0 0:AXAX為偶數(shù)為偶數(shù)add ax,1add ax,1; ;最低位為最低位為1 1:AXAX為奇數(shù),需要加為奇數(shù),需要加1 1even:even:

28、rcr ax,1rcr ax,1;AXAX;AXAX2 2; ;如果采用如果采用SHR/SARSHR/SAR指令,則不能處理指令,則不能處理AXAXFFFFHFFFFH的特殊情況的特殊情況第 4 章分析命題分析命題確定算法確定算法畫(huà)流程圖畫(huà)流程圖開(kāi)始取十六進(jìn)制數(shù)X+30H0=X=9YN0A=X=0FHX+37H結(jié)束YN分支程序設(shè)計(jì)分支程序設(shè)計(jì)例:例:寫(xiě)一個(gè)實(shí)現(xiàn)把一位十六進(jìn)制數(shù)轉(zhuǎn)化為對(duì)應(yīng)ASCII碼的程序。 流程流程圖的圖的例子例子第 4 章分析命題分析命題確定算法確定算法畫(huà)流程圖畫(huà)流程圖編寫(xiě)程序編寫(xiě)程序上機(jī)調(diào)試上機(jī)調(diào)試 JMP LAB2 LAB1: ADD AL,37H LAB2: MOV A

29、SCII,AL MOV AH,4CH INT 21H CODE ENDS END START DATASEGMENT XX DB 4 ASCII DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AL,0FH CMP AL,9 JA LAB1 ADD AL,30H分支程序設(shè)計(jì)分支程序設(shè)計(jì)例:例:寫(xiě)一個(gè)實(shí)現(xiàn)把一位十六進(jìn)制數(shù)轉(zhuǎn)化為對(duì)應(yīng)ASCII碼的程序。 第 4 章雙分支程序設(shè)計(jì)條件成立跳轉(zhuǎn)執(zhí)行條件成立跳轉(zhuǎn)執(zhí)行第第2個(gè)分支語(yǔ)句體,個(gè)分支語(yǔ)句體,否則順序執(zhí)行第否則順序執(zhí)行第1個(gè)個(gè)分支語(yǔ)

30、句體。注意第分支語(yǔ)句體。注意第1個(gè)分支體后一定要個(gè)分支體后一定要有一個(gè)有一個(gè)JMP指令跳到指令跳到第第2個(gè)分支體后個(gè)分支體后例題 顯示BX最高位-解法1shl bx,1shl bx,1;BX;BX最高位移入最高位移入CFCFjc onejc one;CF;CF1 1,即最高位為,即最高位為1 1,轉(zhuǎn)移,轉(zhuǎn)移mov dl,mov dl,0 0 ;CF;CF0 0,即最高位為,即最高位為0 0,DLDL0 0jmp twojmp two; ;一定要跳過(guò)另一個(gè)分支體一定要跳過(guò)另一個(gè)分支體one:one: mov dl,mov dl,1 1 ;DL;DL1 1two:two: mov ah,2mov

31、ah,2int 21hint 21h; ;顯示顯示另一種解法例題 顯示BX最高位-解法2shl bx,1shl bx,1;BX;BX最高位移入最高位移入CFCFjnc onejnc one;CF;CF0 0,即最高位為,即最高位為0 0,轉(zhuǎn)移,轉(zhuǎn)移mov dl,mov dl,1 1 ;CF ;CF1 1,即最高位為,即最高位為1 1,DLDL1 1jmp twojmp two; ;一定要跳過(guò)另一個(gè)分支體一定要跳過(guò)另一個(gè)分支體one:one: mov dl,mov dl,0 0 ;DL;DL0 0two:two: mov ah,2mov ah,2int 21hint 21h; ;顯示顯示另一種解

32、法例題 顯示BX最高位-解法3mov dl,mov dl,0 0 ;DL;DL0 0shl bx,1shl bx,1;BX;BX最高位移入最高位移入CFCFjnc twojnc two;CF;CF0 0,最高位為,最高位為0 0,轉(zhuǎn)移,轉(zhuǎn)移mov dl,mov dl,1 1 ;CF;CF1 1,最高位為,最高位為1 1,DLDL1 1two:two: mov ah,2mov ah,2int 21hint 21h; ;顯示顯示 解法三說(shuō)明:雙分支程解法三說(shuō)明:雙分支程序可以改為單分支程序序可以改為單分支程序第 4 章多分支程序設(shè)計(jì)多個(gè)條件對(duì)應(yīng)各自的分支語(yǔ)句體,哪個(gè)條多個(gè)條件對(duì)應(yīng)各自的分支語(yǔ)句體,

33、哪個(gè)條件成立就轉(zhuǎn)入相應(yīng)分支體執(zhí)行。多分支可以件成立就轉(zhuǎn)入相應(yīng)分支體執(zhí)行。多分支可以化解為雙分支或單分支結(jié)構(gòu)的組合,例如:化解為雙分支或單分支結(jié)構(gòu)的組合,例如: or ah,ahor ah,ah; ;等效于等效于cmp ah,0cmp ah,0 jz function0 jz function0;ah;ah0 0,轉(zhuǎn)向,轉(zhuǎn)向function0function0 dec ah dec ah; ;等效于等效于cmp ah,1cmp ah,1 jz function1 jz function1;ah;ah1 1,轉(zhuǎn)向,轉(zhuǎn)向function1function1 dec ah dec ah; ;等效于等效

34、于cmp ah,2cmp ah,2 jz function2 jz function2;ah;ah2 2,轉(zhuǎn)向,轉(zhuǎn)向function2function2圖示圖示想想想想C語(yǔ)言語(yǔ)言的的CASE多分支結(jié)構(gòu)AH=0function0YNAH=1function1YNAH=2function2YN第 4 章第 4 章【例】編程實(shí)現(xiàn)下列函數(shù)的功能,其中X、Y為無(wú)符號(hào)字節(jié)數(shù)。(多分支)YXYXYXZ1011:畫(huà)出詳細(xì)流程2:編寫(xiě)完整程序第 4 章流程圖第 4 章地址表形成多分支(太技巧,不用看)需要在數(shù)據(jù)段事先安排一個(gè)按順序排需要在數(shù)據(jù)段事先安排一個(gè)按順序排列的轉(zhuǎn)移地址表列的轉(zhuǎn)移地址表輸入的數(shù)字作為偏移量

35、。因?yàn)橛休斎氲臄?shù)字作為偏移量。因?yàn)橛?個(gè)字個(gè)字節(jié)節(jié)16位偏移地址,所以偏移量需要乘位偏移地址,所以偏移量需要乘2關(guān)鍵是要理解間接尋址方式關(guān)鍵是要理解間接尋址方式JMP指令指令地址表地址表分支分支1地址地址分支分支2地址地址.table dw disp1, disp2, disp3, disp4, .此例有此例有點(diǎn)難不點(diǎn)難不用看,用看,但這個(gè)但這個(gè)方法方法(技技巧)是巧)是匯編經(jīng)匯編經(jīng)常用到常用到的的.data.datamsgmsgdb Input number(18):,0dh,0ah,$db Input number(18):,0dh,0ah,$msg1msg1db Chapter 1 :

36、.,0dh,0ah,$db Chapter 1 : .,0dh,0ah,$msg2msg2db Chapter 2 : .,0dh,0ah,$db Chapter 2 : .,0dh,0ah,$.msg8msg8db Chapter 8 : . ,0dh,0ah,$db Chapter 8 : . ,0dh,0ah,$tabletable dw disp1,disp2,disp3,disp4dw disp1,disp2,disp3,disp4dw disp5,disp6,disp7,disp8dw disp5,disp6,disp7,disp8; ;取得各個(gè)標(biāo)號(hào)的偏移地址取得各個(gè)標(biāo)號(hào)的偏移地址

37、例4.4 數(shù)據(jù)段1/3此處等同于此處等同于 offset disp1start1:start1: mov dx,offset msgmov dx,offset msg ; ;提示輸入數(shù)字提示輸入數(shù)字mov ah,9mov ah,9int 21hint 21hmov ah,1mov ah,1; ;等待按鍵等待按鍵,ASCII CODE,ASCII CODEint 21hint 21hcmp al,1cmp al,1; ;數(shù)字?jǐn)?shù)字 1 8 8?ja start1ja start1and ax,000fhand ax,000fh ; ;將將ASCIIASCII碼轉(zhuǎn)換成數(shù)字碼轉(zhuǎn)換成數(shù)字例4.4 代碼段

38、2/3dec axdec axshl ax,1shl ax,1; ;等效于等效于add ax,axadd ax,axmov bx,axmov bx,axjmp tablebxjmp tablebx; ;(段內(nèi))間接轉(zhuǎn)移:(段內(nèi))間接轉(zhuǎn)移:IPtable+bxIPtable+bxstart2:start2:mov ah,9mov ah,9int 21hint 21h.exit 0.exit 0disp1:disp1:mov dx,offset msg1mov dx,offset msg1; ;處理程序處理程序1 1jmp start2jmp start2disp2:disp2:mov dx,of

39、fset msg2mov dx,offset msg2; ;處理程序處理程序2 2jmp start2jmp start2 .例4.4 代碼段3/3可以改為可以改為 call tablebx對(duì)應(yīng)修改為對(duì)應(yīng)修改為 ret第 4 章4.5 循環(huán)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)一般是根據(jù)某一條件判斷為循環(huán)結(jié)構(gòu)一般是根據(jù)某一條件判斷為真或假來(lái)確定是否重復(fù)執(zhí)行循環(huán)體真或假來(lái)確定是否重復(fù)執(zhí)行循環(huán)體循環(huán)指令和轉(zhuǎn)移指令可以實(shí)現(xiàn)循環(huán)控循環(huán)指令和轉(zhuǎn)移指令可以實(shí)現(xiàn)循環(huán)控制制循環(huán)指令LOOPE:例4.6轉(zhuǎn)移指令:例4.7多重循環(huán):例4.8等循環(huán)指令LOOP:例4.5第 4 章循環(huán)結(jié)構(gòu) 結(jié)束結(jié)束 初始化初始化 循環(huán)的初始狀態(tài)循環(huán)的初始

40、狀態(tài) 循環(huán)體循環(huán)體 循環(huán)的工作部分循環(huán)的工作部分及修改部分及修改部分 計(jì)數(shù)控制循環(huán)計(jì)數(shù)控制循環(huán)條件控制循環(huán)條件控制循環(huán)修改部分修改部分控制條件控制條件Y YN N第 4 章 循環(huán)程序結(jié)構(gòu)形式循環(huán)程序結(jié)構(gòu)形式DO-WHILE 結(jié)構(gòu)結(jié)構(gòu) DO-UNTIL 結(jié)構(gòu)結(jié)構(gòu)控制條件控制條件初始化初始化循環(huán)體循環(huán)體YN控制條件控制條件初始化初始化循環(huán)體循環(huán)體YN第 4 章: 設(shè)置循環(huán)的初始狀態(tài)設(shè)置循環(huán)的初始狀態(tài): 循環(huán)的工作部分及修改部分循環(huán)的工作部分及修改部分:計(jì)數(shù)控制(:計(jì)數(shù)控制(LOOP) 特征值控制特征值控制(LOOPZ/LOOPNZ/ 條件跳轉(zhuǎn)指令條件跳轉(zhuǎn)指令) 循環(huán)程序結(jié)構(gòu)說(shuō)明循環(huán)程序結(jié)構(gòu)說(shuō)明第

41、4 章例例4.5:把:把 BX BX 中的二進(jìn)制數(shù)以十六進(jìn)制的形式顯示在屏幕中的二進(jìn)制數(shù)以十六進(jìn)制的形式顯示在屏幕上上 如:如:1011 0010 1111 1010 B H BXBX1234第 4 章分析:分析:(1)程序結(jié)構(gòu)的確定程序結(jié)構(gòu)的確定 由題意由題意,顯然這可以用循環(huán)結(jié)構(gòu)來(lái)完成,每次顯,顯然這可以用循環(huán)結(jié)構(gòu)來(lái)完成,每次顯示一個(gè)十六進(jìn)制數(shù)位,因而循環(huán)次數(shù)是已知的,計(jì)數(shù)值示一個(gè)十六進(jìn)制數(shù)位,因而循環(huán)次數(shù)是已知的,計(jì)數(shù)值為為4。 (2)循環(huán)體的構(gòu)成(算法確定)循環(huán)體的構(gòu)成(算法確定) 循環(huán)體應(yīng)該包括:循環(huán)體應(yīng)該包括:。 需要了解相關(guān)知識(shí)需要了解相關(guān)知識(shí):字符和其字符和其ASCII碼之間的

42、關(guān)系?碼之間的關(guān)系? “0”“9” 30H39H, “A”Z” 41H5AH如何顯示一個(gè)字符?如何顯示一個(gè)字符?(a)將顯示字符的將顯示字符的ASCII碼放入碼放入DL寄存器;寄存器;(b)將將AH的內(nèi)的內(nèi)容置為容置為2(功能號(hào));(功能號(hào));(c)執(zhí)行執(zhí)行INT 21H(DOS 功能調(diào)功能調(diào)用)。用)。第 4 章開(kāi)開(kāi)始始初初始始化化循循環(huán)環(huán)計(jì)計(jì)數(shù)數(shù)值值B B X X 循循環(huán)環(huán)左左移移一一個(gè)個(gè)數(shù)數(shù)位位把把最最右右面面的的數(shù)數(shù)位位轉(zhuǎn)轉(zhuǎn)換換為為A A S S C C I I I I是是A A S S C C I I I IA A F F ?加加上上7 7顯顯示示一一個(gè)個(gè)字字符符循循環(huán)環(huán)計(jì)計(jì)數(shù)數(shù)值值

43、= = 0 0 ?結(jié)結(jié)束束Y YN NN NY Y(3)循環(huán)控制條件分析)循環(huán)控制條件分析因?yàn)檠h(huán)次數(shù)已知,可以使用因?yàn)檠h(huán)次數(shù)已知,可以使用實(shí)現(xiàn),但是必須注意:實(shí)現(xiàn),但是必須注意:。除了可以使用除了可以使用LOOPLOOP指令之外,還指令之外,還可以使用可以使用來(lái)實(shí)現(xiàn)。來(lái)實(shí)現(xiàn)。LOOP AGAIN DEC 計(jì)數(shù)器計(jì)數(shù)器 JNZ AGAIN第 4 章 mov cx, 4 mov cx, 4 ;初始化;初始化rotate: rotate: mov cl, 4 ; mov cl, 4 ; 把高四位移到低四位把高四位移到低四位 rol bx, clrol bx, cl mov al, bl mov

44、al, bl;找出;找出BXBX的低四位的低四位 and al, 0fhand al, 0fh add al, 30h add al, 30h ; 09 ASCII 30H39H; 09 ASCII 30H39H cmp al, 3ah cmp al, 3ah jl printit jl printit;al3ah;al3ah add al, 7h add al, 7h ; AF ASCII 41H46H; AF ASCII 41H46H printit: printit: mov dl, almov dl, al mov ah, 2 mov ah, 2 int 21h int 21h loo

45、p rotate loop rotate 方法方法1 (LOOP)注意注意這個(gè)這個(gè)地方地方這是這是干什干什么?么?顯示顯示AL的的內(nèi)容內(nèi)容第 4 章 mov mov , 4 , 4 ;初始化;初始化rotate: mov rotate: mov , 4, 4 rol bx, cl rol bx, cl mov al, bl mov al, bl and al, 0fh and al, 0fh add al, 30h add al, 30h ; 09 ASCII 30H39H; 09 ASCII 30H39H cmp al, 3ah cmp al, 3ah jl printit jl print

46、it add al, 7h add al, 7h ; AF ASCII 41H46H; AF ASCII 41H46Hprintit: printit: mov dl, almov dl, al mov ah, 2 mov ah, 2 int 21h int 21h 方法方法2 (條件跳轉(zhuǎn)指令條件跳轉(zhuǎn)指令).model small.model small.stack.stack.data.datasumsumdw ?dw ?.code.code.startup.startupxor ax,axxor ax,ax; ;被加數(shù)被加數(shù)AXAX清清0 0mov cx,mov cx,100100agai

47、n:again:add ax,cx add ax,cx ; ;從從100,99,.,2,1100,99,.,2,1倒序累加倒序累加loop againloop againmov sum,axmov sum,ax; ;將累加和送入指定單元將累加和送入指定單元.exit 0.exit 0endend例4.6 求和:1+2+100 計(jì)數(shù)控制循環(huán)計(jì)數(shù)控制循環(huán) 循環(huán)次數(shù)固定循環(huán)次數(shù)固定mov bx,offset stringmov bx,offset stringagain:again: mov al,bxmov al,bx ; ;取一個(gè)字符取一個(gè)字符or al,alor al,al; ;是否為結(jié)尾符是

48、否為結(jié)尾符0 0jz donejz done; ;是,退出循環(huán)是,退出循環(huán)cmp al,Acmp al,A; ;是否為大寫(xiě)是否為大寫(xiě)A AZ Zjbjb next nextcmp al,Zcmp al,Zjaja next nextor al,20hor al,20h; ;是,轉(zhuǎn)換為小寫(xiě)字母(使是,轉(zhuǎn)換為小寫(xiě)字母(使D D5 5=1=1)mov bx,almov bx,al ; ;仍保存在原位置仍保存在原位置next:next:inc bxinc bxjmp againjmp again; ;繼續(xù)循環(huán)繼續(xù)循環(huán)done:done:.exit 0.exit 0例4.7 把一串字符中的大寫(xiě)改為小寫(xiě)

49、條件控制循環(huán)條件控制循環(huán) 利用標(biāo)志退出利用標(biāo)志退出大小寫(xiě)字母僅大小寫(xiě)字母僅 D D5 5位位不同不同第 4 章冒泡法“冒泡法冒泡法”是一種排序算法,不是最優(yōu)的算是一種排序算法,不是最優(yōu)的算法,但它易于理解和實(shí)現(xiàn)法,但它易于理解和實(shí)現(xiàn)冒泡法從第一個(gè)元素開(kāi)始,依次對(duì)相鄰的兩冒泡法從第一個(gè)元素開(kāi)始,依次對(duì)相鄰的兩個(gè)元素進(jìn)行比較,使前一個(gè)元素不大于后一個(gè)元素進(jìn)行比較,使前一個(gè)元素不大于后一個(gè)元素;將所有元素比較完之后,最大的元個(gè)元素;將所有元素比較完之后,最大的元素排到了最后;然后,除掉最后一個(gè)元素之素排到了最后;然后,除掉最后一個(gè)元素之外的元素依上述方法再進(jìn)行比較,得到次大外的元素依上述方法再進(jìn)行比

50、較,得到次大的元素排在后面;如此重復(fù),直至完成就實(shí)的元素排在后面;如此重復(fù),直至完成就實(shí)現(xiàn)元素現(xiàn)元素從小到大從小到大的排序的排序這需要一個(gè)雙重循環(huán)程序結(jié)構(gòu)這需要一個(gè)雙重循環(huán)程序結(jié)構(gòu)圖示圖示冒泡法的排序過(guò)程序號(hào)序號(hào) 數(shù)數(shù)比 較 遍 數(shù)1234 1 32 2 85 3 16 4 15 5 8321615885161583285158163285815163285第 4 章movmov cxcx,count,count;CX;CX數(shù)組元素個(gè)數(shù)數(shù)組元素個(gè)數(shù)dec cxdec cx; ;元素個(gè)數(shù)減元素個(gè)數(shù)減1 1為外循環(huán)次數(shù)為外循環(huán)次數(shù)outlp:outlp:movmov dxdx,cx,cx;DX;D

51、X內(nèi)循環(huán)次數(shù)內(nèi)循環(huán)次數(shù)mov bx,offset arraymov bx,offset arrayinlp:inlp: mov al,bxmov al,bx; ;取前一個(gè)元素取前一個(gè)元素cmp al,bx+1cmp al,bx+1 ; ;與后一個(gè)元素比較與后一個(gè)元素比較jna nextjna next; ;前一個(gè)不大于后一個(gè)元素,則不進(jìn)行交換前一個(gè)不大于后一個(gè)元素,則不進(jìn)行交換xchg al,bx+1xchg al,bx+1; ;否則,進(jìn)行交換否則,進(jìn)行交換mov bx,almov bx,alnext:next: inc bxinc bx; ;下一對(duì)元素下一對(duì)元素dec dxdec dxjnz

52、 inlpjnz inlp; ;內(nèi)循環(huán)尾內(nèi)循環(huán)尾loop outlploop outlp; ;外循環(huán)尾外循環(huán)尾例4.8 計(jì)數(shù)控制雙重循環(huán)計(jì)數(shù)控制雙重循環(huán); ;現(xiàn)有一個(gè)以現(xiàn)有一個(gè)以$ $結(jié)尾的字符串,要求剔除其中的空格結(jié)尾的字符串,要求剔除其中的空格.data.datastringstringdb db Let us have a try !Let us have a try !, ,$ $.code.code.startup.startupmov di,offset stringmov di,offset stringoutlp:outlp:cmp byte ptr di,cmp byte pt

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論