版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),1)分析題意,確定算法。這一步是能否編制出高質(zhì)量程序的關(guān)鍵,因此不應(yīng)該一拿到題目就急于寫程序,而是應(yīng)該仔細(xì)地分析和理解題意,找出合理的算法及適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)。 2)根據(jù)算法畫出程序框圖。這一點(diǎn)對初學(xué)者特別重要,這樣做可以減少出錯的可能性。畫框圖時(shí)可以從粗到細(xì)把算法逐步地具體化。 3)根據(jù)框圖編寫程序。 4)上機(jī)調(diào)試程序。任何程序必須經(jīng)過調(diào)試才能檢查出你的設(shè)計(jì)思想是否正確以及你的程序是否符合你的設(shè)汁思想。在調(diào)試程序的過程中應(yīng)該善于利用機(jī)器提供的調(diào)試工具(如DEBUG)來進(jìn)行工作,你會發(fā)現(xiàn)它會給你提供很大的幫助,編制一個(gè)匯編語言程序的步驟,2,分析問題,程序
2、設(shè)計(jì)的解題基本步驟如下,順序、分支、循環(huán)程序和子程序的設(shè)計(jì)是匯編語言程序設(shè)計(jì)的基本內(nèi)容,在此基礎(chǔ)上還要掌握匯編語言程序設(shè)計(jì)的基本方法和技巧 ,包括遞歸子程序設(shè)計(jì)、COM和EXE格式程序的結(jié)構(gòu)和特點(diǎn)、多模塊程序設(shè)計(jì)方法等,一、匯編語言程序設(shè)計(jì)的基本方法,概述,3,概述,二、程序的基本結(jié)構(gòu) 1、順序結(jié)構(gòu)程序 2、分支結(jié)構(gòu)程序 3、循環(huán)(重復(fù))結(jié)構(gòu)程序 順序結(jié)構(gòu) 分支結(jié)構(gòu) 循環(huán)(重復(fù))結(jié)構(gòu),4,第一節(jié) 順序結(jié)構(gòu)程序設(shè)計(jì),順序結(jié)構(gòu)程序完全按指令書寫的前后順序執(zhí)行每一條指令,是最基本、最常見的程序結(jié)構(gòu) 特點(diǎn) 順序性、結(jié)構(gòu)簡單,只適應(yīng)于簡單問題的處理,例1 計(jì)算,例2 移位,5,第二節(jié):循環(huán)結(jié)構(gòu),6,第一
3、章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),7,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),8,循環(huán)程序設(shè)計(jì),根據(jù)條件重復(fù)執(zhí)行一段指令就構(gòu)成了循環(huán)程序結(jié)構(gòu),MOV AX,0 ;累加求和寄存器清0 MOV BX,OFFSET ARRAY ;數(shù)組始址送BX中 MOV CX,50 ;循環(huán)控制計(jì)數(shù)初始化 AGAIN : ADD AX,BX ADD BX,2 ;數(shù)組地址增2,BX指向下一個(gè)元素 DEC CX ;循環(huán)控制計(jì)數(shù)減1 JNZ AGAIN ;計(jì)數(shù)不為0時(shí)繼續(xù)循環(huán) MOV S,AX ;計(jì)數(shù)為0時(shí)循環(huán)結(jié)束,和存于S中,保證循環(huán)正常執(zhí)行和結(jié)束的條件: 正確地初始化循環(huán)控制計(jì)數(shù)和初始條件 正確地檢測循環(huán)條件 必須保證能
4、達(dá)到循環(huán)結(jié)束條件 (例如在循環(huán)體內(nèi)有修改循環(huán)控制值的指令,9,指令系統(tǒng)提供了專門用于循環(huán)結(jié)構(gòu)的循環(huán)控制指令,更加簡便的地實(shí)現(xiàn)循環(huán)結(jié)構(gòu),循環(huán)控制指令,循環(huán)控制指令的轉(zhuǎn)移范圍為:-128+127字節(jié),LOOP AGAIN,段內(nèi)短轉(zhuǎn)移,CX) 0 且 ZF =1 ,CX) 0 且 ZF=0 ,在前面的求和例子中,可用一條循環(huán)指令代替兩條指令,10,MOV CX,80 MOV SI,-1 MOV AL,$ AGAIN: INC SI CMP AL,STRSSI LOOPNE AGAIN MOV LEN,SI,循環(huán)程序設(shè)計(jì)方法,控制循環(huán)的方法可分為兩類,計(jì)數(shù)循環(huán)用于循環(huán)次數(shù)已知的情況,條件循環(huán)用于循環(huán)次
5、數(shù)不確定的情況,設(shè): STRS DB string,11,例:將字變量num中的數(shù)按16位二進(jìn)制數(shù)位分離開,逐位轉(zhuǎn)換為ASCII碼,并從最高有效位開始依次逐位存入以binbuf為起始地址的16個(gè)字節(jié)單元中,設(shè):(num)= 4230H,要求將 4230H= 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 B 逐位分離開 并轉(zhuǎn)換為: 30 31 30 30 30 30 31 30 30 30 31 31 30 30 30 30,先將(num)-(DX),再討論如何分離開各二進(jìn)制位并轉(zhuǎn)換為ASCII碼,分析如下,根據(jù)上述分析,將(DX)中的二進(jìn)制數(shù)依次循環(huán)左移1位,可以使得各個(gè)數(shù)位
6、的分離(AND)和ASCII碼轉(zhuǎn)換(ADD)操作完全相同,便于組織循環(huán),并且循環(huán)次數(shù)已知(16次,例: 將十進(jìn)制數(shù)(number)轉(zhuǎn)換為八進(jìn)制數(shù),方法:(number)/8 保留余數(shù),除法操作循環(huán)次數(shù)事先未知,僅當(dāng)商為0時(shí),循環(huán)結(jié)束。此例為條件循環(huán),此例為計(jì)數(shù)循環(huán),next,12,DX)= 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0,1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 (ROL DX,1,0 0 0 0 0 0 0 1 (AND ?,1,0 0 0 0 0 0 0 0,0 0 1 1 0 0 0 0 (ADD ?,30H,0 0 1 1 0 0
7、0 0,30,0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 (ROL DX,1,0 0 0 0 0 0 0 1 (AND,0 0 0 0 0 0 0 1,0 0 1 1 0 0 0 0 (ADD,0 0 1 1 0 0 0 1,31,0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 (ROL DX,1,0 0 0 0 0 0 0 1 (AND,0 0 0 0 0 0 0 0,0 0 1 1 0 0 0 0 (ADD,0 0 1 1 0 0 0 0,30 31 30 30 30 30 31 30 30 30 31 31 30 30 30,1,2,16,binbuf
8、,返回,30,13,例 統(tǒng)計(jì)AX中的二進(jìn)制數(shù)含“1”的總個(gè)數(shù),程序段如下: MOVCX,0 AGAIN: ANDAX,AX;(AX)=0? JZQUIT;是,退出循環(huán) SALAX,1 ;否,(AX)的最高位移入CF位 JNCNEXT;CF1時(shí),轉(zhuǎn)向NEXT再次循環(huán) INCCX ;CF=1,計(jì)數(shù)器(CX)(CX) +1 NEXT: JMPAGAIN;再次循環(huán) QUIT,上述程序?yàn)楫?dāng)型循環(huán)程序結(jié)構(gòu):先判斷條件,后執(zhí)行循環(huán),課堂練習(xí): 采用循環(huán)結(jié)構(gòu)完成自然數(shù)1到100的求和運(yùn)算,next,當(dāng)型循環(huán)與直到型循環(huán),14,存儲模型與簡化段定義偽指令,較新版本的匯編程序(MASM5.0與MASM6.0)除支
9、持完整段定義偽指令外,還提供了一種新的簡單易用的存儲模型和簡化的段定義偽指令,1 存儲模型偽指令存儲模型的作用是什么呢?存儲模型決定一個(gè)程序的規(guī)模,也確定進(jìn)行子程序調(diào)用、指令轉(zhuǎn)移和數(shù)據(jù)訪問的缺省屬性(NEAR或FAR)。當(dāng)使用簡化段定義的源程序格式時(shí),在段定義語句之前必須有存儲模型 .MODEL語句,說明在存儲器中應(yīng)如何安放各個(gè)段。 MODEL偽指令的常用格式如下: MODEL 存儲模型,15,在DOS下用匯編語言編程時(shí),可根據(jù)程序的不同特點(diǎn)選擇前6種模型,一般可以選用SMALL模型。另外,TINY模型將產(chǎn)生COM程序,其他模型產(chǎn)生EXE程序。FLAT模型只能運(yùn)行在32位x86 CPU上,DO
10、S下不允許使用這種模型。當(dāng)與高級語言混合編程時(shí),兩者的存儲模型應(yīng)當(dāng)一致,16,2 簡化的段偽指令,簡化的段定義語句書寫簡短,語句.CODE、.DATA和.STACK分別表示代碼數(shù)據(jù)段和堆棧段的開始,一個(gè)段的開始自動結(jié)束前面一個(gè)段。采用簡化段指令之前必須有存儲模型語句.MODEL,17,18,3與簡化段定義有關(guān)的預(yù)定義符號,匯編程序給出了與簡化段定義有關(guān)的一組預(yù)定義符號,它們可在程序中出現(xiàn),并由匯編程序識別使用。有關(guān)的預(yù)定義符號如下:(1)code 由.CODE 偽指令定義的段名或段組名。(2)data 由.DATA 偽指令定義的段名,或由 .DATA 、.DATA?、.CONST和 .STAC
11、K所定義的段組名。(3)stack 堆棧段的段名或段組名,在完整的段定義情況下,在程序的一開始,需要用段名裝入數(shù)據(jù)段寄存器,例mov ax,data_seg1mov ds,ax若用簡化段定義,則數(shù)據(jù)段只用.data來定義,而并未給出段名,此時(shí)可用mov ax,data mov ds,ax這里預(yù)定義符號data就給出了數(shù)據(jù)段的段名,19,返回,參考答案2: .model small .code mov ax, data mov ds, ax xor ax, ax mov cx, 100 again: add ax, cx loop again mov ax, 4c00h int 21h end,
12、參考答案1: .model small .data num dw 1 .code mov ax, data mov ds, ax mov ax, 0 mov cx, 100 again: add ax, num inc num loop again mov ax, 4c00h int 21h end,下述例子可用5.X 或6.X 版匯編程序匯編,思考題:顯示下面數(shù)組中的數(shù)據(jù): ARRAY DB 1,3,7,8,5,4,6,8,20,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),循環(huán)程序設(shè)計(jì)方法,例 試編制一個(gè)程序把BX寄存器內(nèi)的二進(jìn)制數(shù)用十六進(jìn)制數(shù)的形式在屏幕上顯示出來,code_seg segmen
13、t main proc far assume cs:code_seg start: mov bx , 8222h mov ch , 4 ;四位循環(huán)一次,共進(jìn)行4次循環(huán)即可以 rotate: mov cl , 4 ;循環(huán)高4位到低4位 rol bx , cl;對BX進(jìn)行循環(huán)操作 mov al , bl,思路: 四位二進(jìn)制對應(yīng)一位十六進(jìn)制。 循環(huán)4次 每次循環(huán)4位 高位先顯示:rol 判斷結(jié)果和10比較,21,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),and al , 0fh;取出要轉(zhuǎn)換的4位二進(jìn)制數(shù),存入al寄存器中 cmp al , 10;判斷是否為十進(jìn)制數(shù)制的字符 jae changetoa_f
14、 ;如果大于10,跳轉(zhuǎn)到changetoa_f進(jìn)行十六進(jìn)制的轉(zhuǎn)換 add al , 30h ;0-9的十六進(jìn)制轉(zhuǎn)換 jmp disp changetoa_f: add al , 37h ;a-f的十六進(jìn)制轉(zhuǎn)換 disp: mov dl , al ;在屏幕上顯示結(jié)果 mov ah , 02 int 21h dec ch ;利用dec 和jnz來實(shí)現(xiàn)循環(huán)操作,代替loop的功能 jnz rotate,22,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),mov ax , 4c00h int 21h main endp code_seg ends end start ;程序結(jié)束,例 在ADDR單元中存放著數(shù)Y
15、的地址,試編制一程序把Y中1的個(gè)數(shù)存入COUNT單元中,算法:要測出Y中1的個(gè)數(shù)就應(yīng)逐位測試,一個(gè)比較簡單的辦法是可根據(jù)最高有效位是否為1來記數(shù),然后用移位的方法把各位數(shù)逐次移到最高位去。循環(huán)的結(jié)束可以用計(jì)數(shù)值為16來控制,但更好的辦法是結(jié)合上述方法可以用測試數(shù)是否為0來作為結(jié)束條件,這樣可以在很多情況下縮短程序的執(zhí)行時(shí)間。此外考慮到Y(jié)本身為0的可能性,應(yīng)該采用WHILEDO的結(jié)構(gòu)形式,23,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),程序框圖,24,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),程序,25,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),int 21h main endp code_seg ends
16、 end start,例 在附加段中有一個(gè)首地址為LIST和未經(jīng)排序的字?jǐn)?shù)組,在數(shù)組的第一個(gè)字中存放著該數(shù)組的長度,數(shù)組的首地址已存放在DI寄存器中。AX寄存器中存放著一個(gè)數(shù)。要求編制一程序:在數(shù)組中查找該數(shù),如果找到此數(shù)則把它從數(shù)組中刪除,算法: 這一程序應(yīng)該首先查找數(shù)組中是否有(AX),如果沒有則不對數(shù)組作任何處理就結(jié)束程序。如果找到這一元素則應(yīng)把數(shù)組中位于其前(指地址比該元素高)的元素后移一個(gè)字(即向低地址方向移動),并修改數(shù)組長度值。如果找到的元素正好位于數(shù)組末尾,則不必移動任何元素,只要修改數(shù)組長度值就可以。這里第一部分的查找元素可以使用串處理指令,第二部分的刪除元素則可使用循環(huán)結(jié)構(gòu)
17、,由于查找結(jié)束時(shí)就可以知道該元素的位置,因此可以作為循環(huán)次數(shù)已知的情況來設(shè)計(jì),26,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),流程圖,27,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),程序,data_seg segment LIST dw 10,0,11,22,33,44,55,66,77,88,99 data_seg ends code_seg segment assume cs:code_seg , es:data_seg main proc far start: mov ax , data_seg;代碼段地址空間分配 mov es , ax cld;設(shè)置DF=0,地址自動遞增操作 mov ax ,
18、33 ;設(shè)置AX寄存器的數(shù)值 lea di , LIST,28,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),push di;將LIST的首地址壓棧,為將來改變數(shù)組元素個(gè)數(shù),就可以彈出該 ;地址 mov cx , es:di;數(shù)組個(gè)數(shù)放入CX中 add di , 2 repnz scasw;將AX與ES:DI中的元素進(jìn)行比較,若相等則跳轉(zhuǎn)到DELETE ;結(jié)束否則 je delete pop di jmp short exit delete: jcxz del_last;判斷要刪除的元素是否為最后的數(shù)組元素,是就跳轉(zhuǎn)到 ;DEL_LAST執(zhí)行 del_next,29,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)
19、計(jì),mov bx , es:di;數(shù)組元素向前移動 mov es:di-2 , bx add di , 2 loop del_next del_last: pop di dec word ptr es:di;改變數(shù)組元素的大小 exit: mov ax , 4c00h int 21h main endp code_seg ends end start,30,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),例 試編制一程序;從鍵盤輸入一行字符,要求第一個(gè)鍵入的字符必須是空格符,如不是則退出程序;如是則開始接收留入的字符并順序存放在首地址為BUFFER的緩沖區(qū)中(空格符不存人),直到接收到第二個(gè)空格符時(shí)退出
20、程序,算法:這一程序要求接收的字符從空格符開始又以空格符結(jié)束,因此程序中必須區(qū)分所接收的字符是否是第一個(gè)字符,為此設(shè)立作為標(biāo)志的存儲單元FLAG,一開始將其置為0,接收第一個(gè)字符后可將其置1,31,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),data_seg segment buffer db 100 dup(?) flag db ? data_seg ends code_seg segment assume cs:code_seg , ds:data_seg main proc far start: mov ax ,data_seg mov ds ,ax lea bx ,buffer mov fl
21、ag ,0 ;FLAG初始化為0,準(zhǔn)備接收第一個(gè)字符 next: mov ah ,01,32,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),int 21h ;從鍵盤輸入一個(gè)字符,存放在AL寄存器中 test flag ,01h;判斷是否為第一個(gè)字符 jnz follow;不是第一個(gè)字符跳轉(zhuǎn)到FOLLOW cmp al,20h;是第一個(gè)字符,判斷該字符是否為空格 jnz exit mov flag ,1 jmp next follow: cmp al ,20h;判斷是否為空格 jz exit;是空格就退出 mov bx,al;不是就將該字符的ASC碼存入緩沖區(qū)內(nèi) inc bx jmp next,33,第
22、一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),exit: mov ax , 4c00h int 21h main endp code_seg ends end start,34,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),3)多重循環(huán),35,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),例 有一個(gè)首地址為A的N字?jǐn)?shù)組,請編制程序使該數(shù)組中的數(shù)按照從大到小的次序排序,算法 : 我們采用起泡排序算法從第一個(gè)數(shù)開始依次對相鄰兩個(gè)數(shù)進(jìn)行比較,如次序?qū)t不做任何操作;如次序不對則使這兩個(gè)數(shù)交換位置。下表表示了這種算法的例子,可以看出在做了第一遍的(N一1)次比較后,最小的數(shù)已經(jīng)放到了最后,所以第二遍比較只需要考慮(N-1)個(gè)數(shù)
23、,即只需要比較(N一2)次,第三遍則只需要做(N一3)次比較總共最多(N1)遍比較就可以完成排序,36,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),loop1:mov dx , cx mov bx , 0 loop2:mov ax ,abx cmp ax ,abx+2 jge continue xchg ax ,abx+2 mov abx,ax continue: add bx ,2 loop loop2 mov cx ,dx loop loop1 mov cx ,num,37,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),38,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),第二節(jié) 分支結(jié)構(gòu)程序設(shè)計(jì),39,第一章
24、基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),2)分支程序設(shè)計(jì)方法,例 在附加段中,有一個(gè)按從小到大順序排列的無符號數(shù)的數(shù)組,其首地址存放在Dl寄存器中,數(shù)組中的第一個(gè)單元存放著數(shù)組長度。在AX中有一個(gè)無符號數(shù),要求在數(shù)組中查找(AX),如找到則使CF0,并在SI中給出該元素在數(shù)組中的偏移地址,如末找到則使CF1,算法: 我們已經(jīng)遇到過多個(gè)表格查找的例子,都是使用順序查找的方法,本例是一個(gè)已經(jīng)排序的數(shù)組,可以采用折半查找法以提高查找效率。折半查找法先取有序數(shù)組的中間元素與查找值進(jìn)行比較,如相等則查找成功,如查找值大于中間元素,則再取高半部的中間元意與查找值相比較;如查找值小于中間元素,則再取低半部的中間元素與
25、查找值相比較,如此重復(fù)直到查找成功或最終未找到該效(查找不成功)為止。折半查找法的效率高于順序查找法,40,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),流程圖,41,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),程序,本模塊功能是用寄存器AX的內(nèi)容對字?jǐn)?shù)組(從小到大順序排列)進(jìn)行折半查找 ;其中查找的數(shù)組首地址位于寄存器DI內(nèi) ;數(shù)組的第一個(gè)元素為數(shù)組的長度,其余的為數(shù)組的具體內(nèi)容,dseg segment start_addr dw ?; 保存數(shù)組首地址用的變量 dseg ends cseg segment assume cs:cseg , ds:dseg b_search proc near push
26、ds push ax mov ax ,dseg mov ds ,ax,42,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),第一步 ;首先判斷AX寄存器的數(shù)是否在該數(shù)組的范圍內(nèi). ;即要判斷是否小于數(shù)組元素的最小數(shù)或大于數(shù)組元素的最大數(shù),cmp ax ,es : di+2;和最小數(shù)據(jù)進(jìn)行比較 ja chk_last;若大于最小數(shù),跳轉(zhuǎn)到CHK_LAST,同時(shí) CF 為 0 lea si ,es : di+2;先把最小元素的地址存入SI寄存器中 je exit_b;在判斷是否和最小元素相等,如果相等結(jié)束 stc;否則小于最小元素,設(shè)置CF為1 jmp exit_b; 程序結(jié)束 chk_last: mov
27、si,ES : di;si存放數(shù)組元素個(gè)數(shù) shl si,1;也就是2。其結(jié)果就是數(shù)組占用的字節(jié)數(shù)量 add si,di;SI為數(shù)組下標(biāo)最大的元素的地址,43,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),cmp ax,es:si;和最大數(shù)進(jìn)行比較,同時(shí)CF為1 jb search;若小于最大數(shù),就進(jìn)入折半查找 je exit_b;/否則等于最大值則退出結(jié)束,表明AX的數(shù)據(jù)與最大數(shù)組數(shù)據(jù)相同. stc;置CF為1 jmp exit_b ;第一步結(jié)束,第二步 ;折半查找功能 search: mov start_addr,di;保存寄存器DI的字?jǐn)?shù)組的首地址 mov si,di;讀取數(shù)組長度,44,第一章
28、 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),even_idx: test si,1;判斷是否為奇數(shù).注意數(shù)組長度的地址指定數(shù)組中間的元素(因?yàn)閿?shù)組是字?jǐn)?shù)組) jz add_idx inc si;奇數(shù)就要加1,以便能取到完整的數(shù)據(jù) add_idx: add di,si;數(shù)組首地址加上中間數(shù)組的偏移量,得到中間數(shù)組的有效地址 compare: cmp ax,es : di;和寄存器數(shù)據(jù)進(jìn)行比較 je all_done;相等,就結(jié)束操作,同時(shí)CF為0 ja highter;大就查找高段數(shù)組 cmp si,2 jne idx_ok,45,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),no_match: stc je al
29、l_done ;寄存器si和2進(jìn)行比較的結(jié)果,程序退出的標(biāo)志 idx_ok: shr si,1 test si,1 jz sub_idx inc si sub_idx: sub di,si jmp short compare,46,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),higher: cmp si,2; je no_match shr si,1;數(shù)據(jù)元素除以2,減半 jmp short even_idx all_done mov si,di mov di,start_addr exit_b: ret b_search endp cseg ends end b_search,47,第一章 基礎(chǔ)知
30、識,循環(huán)與分支程序設(shè)計(jì),3)跳躍表法,48,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),例:根據(jù)bx的數(shù)據(jù)進(jìn)行跳轉(zhuǎn),從低位到高位分別判斷bx寄存器的位數(shù)是否為1,為1跳轉(zhuǎn),否則繼續(xù)判斷,直到bx寄存器為0,程序,b_a segment b_t dw r1 dw r2 dw r3 dw r4 dw r5 dw r6 dw r7 dw r8 b_a ends,code segment assume cs:code , ds : b_a main proc far start: push ds xor ax,ax push ax mov ax , b_a mov ds , ax,49,第一章 基礎(chǔ)知識,循
31、環(huán)與分支程序設(shè)計(jì),lea si , b_t;將表地址存入si寄存器 l: cmp bx , 0;判斷bx是否為零 jz exit shr bx , 1;將bx寄存器的最低位傳入CF中 jnb not_yet;若CF為0,跳轉(zhuǎn)不執(zhí)行任何操作 jmp word ptrsi not_yet: add si, type b_t jmp l r1: mov dx,0 jmp short exit r2: mov dx,1,jmp short exit r3: mov dx,2 jmp short exit r4: mov dx,3 jmp short exit r5: mov dx,4 jmp shor
32、t exit r6: mov dx,5 jmp short exit r7: mov dx,6 jmp short exit r8: mov dx,7 exit: ret main endp code ends end start,50,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),第三節(jié) 子程序結(jié)構(gòu),51,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),52,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),上述程序也可以采用如下方式,53,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),54,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),55,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),1)子程序使用過程中注意的問題,CALL使返回地址入棧,
33、所以RET時(shí)應(yīng)該使返回地址出棧,如果子程序中不能正確使用堆棧而造成執(zhí)行RET前SP并未指向進(jìn)入子程序時(shí)的返回地址,則必然會導(dǎo)致運(yùn)行出錯,因此于程序中對堆棧的使用應(yīng)該特別小心,以免發(fā)生錯誤,CALL指令和RET指令就完成了調(diào)用和返回的功能。為了保證其正確性,除PROC的屬性要正確選取外,還應(yīng)該注意子程序運(yùn)行期間的堆棧狀態(tài),56,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),調(diào)用程序(又稱主程序)和子程序經(jīng)常是分別編制的,所以它們所使用的寄存器往往會發(fā)生沖突,如果主程序在調(diào)用子程序以前的某個(gè)寄存器內(nèi)容在從子程序返回后還有用而子程序又恰好使用了同一個(gè)寄存器,造成破壞了該寄存器的原有內(nèi)容,那就會造成程序運(yùn)行錯
34、誤,這是不能允許的,57,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),為避免這種錯誤的產(chǎn)生在一進(jìn)入子程序后就應(yīng)該把子程序所需要使用的寄存器內(nèi)容保存在堆棧中,而在退出子程序前把寄存器的內(nèi)容恢復(fù)原狀,58,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),2)主程序與子程序參數(shù)傳遞,含義:將dl中的字符在屏幕上顯示出來,59,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),60,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),61,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),binihex proc near mov ch,4 rotate: mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30
35、h cmp al,3ah jl print add al,7h print: mov dl,al mov ah,2 int 21h dec ch jnz rotate ret binihex endp,crif proc near mov dl,0dh;換行 mov ah,2 int 21h mov dl,0ah; mov ah,2 int 21h ret crif endp decihex ends end main,62,遠(yuǎn)程調(diào)用,codeb segment assume cs:codeb btodecdisp proc far push ax push bx push cx push d
36、x mov cx,0 ; mov bx,1234h; rotate1: mov ax,bx cwd mov bx,10 div bx add dl,30h push dx inc cx mov bx,ax; mov ax,bx test ax,0ffffh,jnz rotate1 repeat1: pop dx mov ah,2 int 21h loop repeat1 pop dx pop cx pop bx pop ax ret btodecdisp endp btohexdisp proc far push ax push bx push cx push dx mov ch,4 mov
37、cl,4,rotate2: rol bx,cl mov al,bl and al,0fh cmp al,10 jc decimal2 add al,37h jmp dispp2 decimal2: add al,30h dispp2: mov dl,al mov ah,2 int 21h dec ch jnz rotate2 pop dx pop cx pop bx pop ax ret btohexdisp endp,63,btoo proc far push ax push bx push cx push dx mov cl , 1 mov ax , bx loopto: mov bx ,
38、 ax rol bx , cl cmp cl , 1 jz too and bx , 0007h jmp tooo too: and bx, 0001h tooo: xchg bl , dl add dl , 30h xchg ax ,bx mov ah , 2 int 21h,xchg ax , bx shl ax , cl jz exit3 mov cl , 3 jmp loopto exit3: pop dx pop cx pop bx pop ax ret btoo endp codeb ends,code segment assume cs:code main proc far mo
39、v bx,5678H call btodecdisp call btohexdisp call btoo mov ah,4ch int 21h main endp code ends end main,64,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),65,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),66,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),67,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),例 從鍵盤輸入十進(jìn)制數(shù)據(jù),以十六進(jìn)制顯示在屏幕上,文件asm_0.asm,public xyz public crlf data segment public xyz dw 9 data ends decihex segm
40、ent public assume cs:decihex crlf proc near mov dl,0dh mov ah,2,int 21h mov dl,0ah mov ah,2 int 21h ret crlf endp decihex ends end,68,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),文件2:asm_1.asm,extrn crlf:near extrn xyz:word decihex segment public assume cs:decihex start: mov ax,seg xyz mov ds , ax mov ax , xyz call decibin c
41、all crlf call binihex call crlf mov ax , 4c00h int 21h,decibin proc near mov bx,0 newchar: mov ah,1 int 21h sub al,30h jl exit cmp al,9d jg exit cbw xchg ax,bx mov cx,10d mul cx xchg ax,bx add bx,ax jmp newchar exit: ret decibin endp,binihex proc near mov ch,4 rotate: mov cl,4 rol bx,cl mov al,bl an
42、d al,0fh add al,30h cmp al,3ah jl print add al,7h print: mov dl,al mov ah,2 int 21h dec ch jnz rotate ret binihex endp,decihex ends end start,69,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),運(yùn)行: masm asm_0.asm 形成asm_0.obj masm asm_1.asm 形成asm_1.obj link asm_0.obj asm_1.obj 形成asm_0.exe執(zhí)行文件 link asm_1.obj asm_0.obj 形成asm_1.exe執(zhí)
43、行文件,70,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),71,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),72,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),code_seg segment org 100 table dw 3 dup(?) ary1 dw 10,20,30,40,50 count1 dw 5 sum1 dw ? ary2 dw 10,20,30,40,50 count2 dw 5 sum2 dw ? assume cs:code_seg , ds:code_seg , ss:code_seg main proc far start: mov ax, code_seg mov ds,ax mo
44、v ss,ax mov table ,offset ary1 mov table+2 , offset count1 mov table+4 , offset sum1,call near ptr proadd mov si , table+4 mov bx , si call disp mov table ,offset ary2 mov table+2 , offset count2 mov table+4 , offset sum2 call proadd mov si , table+4 mov bx , si call disp mov ax,4c00h int 21h main e
45、ndp,73,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),以十進(jìn)制顯示BX寄存器中 的數(shù)據(jù) disp proc near push ax push dx push cx mov cx ,0 disp_next: mov ax,bx cwd mov bx , 10 div bx add dl,30h push dx inc cl mov bx,ax cmp ax , 0000h jz exit,jmp disp_next exit: mov ah,02h print: pop dx int 21h dec cl jnz print pop cx pop dx pop ax ret disp endp
46、;顯示模塊結(jié)束 proadd proc near push si push di push cx,push ax mov si , table mov di , table+2 mov cx ,di mov di , table+4 xor ax,ax next: add ax,si add si ,2 loop next mov di ,ax pop ax pop cx pop di pop si ret proadd endp code_seg ends end start,74,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),75,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),76,第一章 基礎(chǔ)知識,循環(huán)
47、與分支程序設(shè)計(jì),77,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),78,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),79,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),堆棧段最滿時(shí)的狀態(tài),80,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),81,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),82,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),可以由一連串常數(shù)表達(dá)式組成,每個(gè)字段用一個(gè)表達(dá)式,相互之間用逗號隔開,如果使用STRUC定義中的值則可不寫任何值(缺省)。預(yù)賦值說明也可以使用DUP操作符,83,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),84,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),85,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),86,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),87,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),88,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),89,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),90,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),91,第一章 基礎(chǔ)知識,循環(huán)與分支程序設(shè)計(jì),程序,data_seg segment n_v dw 6 result dw ? data_seg ends stack_seg
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 75個(gè)櫻桃番茄雜交組合的綜合評價(jià)
- 2025年中職眼鏡驗(yàn)光(眼鏡驗(yàn)光實(shí)操)試題及答案
- 高職第三學(xué)年(商務(wù)管理)企業(yè)運(yùn)營管理2026年綜合測試題及答案
- 2025年高職工程造價(jià)(工程結(jié)算編制)試題及答案
- 2025年大學(xué)畜牧業(yè)機(jī)械安裝(畜牧業(yè)機(jī)械安裝)試題及答案
- 2025-2026年高二化學(xué)(有機(jī)合成)上學(xué)期期末檢測卷
- 2025年大學(xué)第二學(xué)年(口腔醫(yī)學(xué))口腔頜面影像學(xué)綜合測試試題及答案
- 2026年醫(yī)學(xué)檢驗(yàn)(醫(yī)學(xué)檢驗(yàn))綜合測試題及答案
- 大學(xué)(文化產(chǎn)業(yè)管理)文化項(xiàng)目策劃2026年綜合測試題
- 2026年稅務(wù)(企業(yè)所得稅)考題及答案
- 營養(yǎng)不良診療規(guī)范2023版
- 生活中的工業(yè)設(shè)計(jì)智慧樹知到期末考試答案章節(jié)答案2024年南開大學(xué)
- 變質(zhì)巖帶金屬礦勘查技術(shù)
- 2024屆高考專題復(fù)習(xí):引號、省略號、破折號的作用和運(yùn)用
- 學(xué)生實(shí)習(xí)家長知情同意書(完美版)
- 國家發(fā)展和改革委員會宏觀經(jīng)濟(jì)研究院招聘筆試真題2023
- DB11/T 917-2012-安全防范工程企業(yè)質(zhì)量管理要求
- MOOC 光影律動校園健身操舞-西南交通大學(xué) 中國大學(xué)慕課答案
- 英語雅思詞匯表
- 巡邏防控方案 派出所
- 重型顱腦損傷患者的臨床觀察與護(hù)理
評論
0/150
提交評論