




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1第八章第八章 微型計算機的程序設計微型計算機的程序設計w順序結構程序順序結構程序w分支結構程序分支結構程序w循環(huán)結構程序循環(huán)結構程序w子程序結構子程序結構2重點重點: :w程序設計方法程序設計方法w順序結構程序順序結構程序w分支結構程序分支結構程序w循環(huán)結構程序循環(huán)結構程序w子程序結構子程序結構38.1 8.1 程序設計步驟程序設計步驟w1.1.分析問題分析問題w2.2.建立數學模型建立數學模型w3.3.確定算法確定算法w4.4.繪制程序流程圖繪制程序流程圖w5.5.內存分配內存分配w6.6.編制程序編制程序w7.7.程序調試程序調試4wdata segmentw a1 db hellon!
2、,0dh,0ah,$wdata endswstack1 segment para stackw.wstack1 endswcode segmentw assume cs:code,ds:data, ss:stack1w start:mov ax,dataw mov ds,axw mov ah,4chw int 21hwcode endsw end start數據段數據段堆棧段堆棧段代碼段代碼段58-1 8-1 順序程序設計順序程序設計補充:二進制編碼的十進制數二進制編碼的十進制數 就是bcd碼(binary coded decimal)。壓縮bcd碼 是用4位二進制數表示一位十進制數。一個字節(jié)
3、表示兩位十進制數。如:1001 0110b 表示 96 d非壓縮bcd碼 是用一個字節(jié)表示一位十進制數。高4位總是0。如: 0000 1001b 表示 9d 兩種bcd碼的編碼對照表6兩種兩種bcdbcd碼的編碼對照表碼的編碼對照表十進制數 壓縮 bcd 碼 非壓縮 bcd 碼 0 0000 0000 0000 1 0001 0000 0001 2 0010 0000 0010 3 0011 0000 0011 9 1001 0000 1001 10 0001 0000 0000 0001 0000 0000 11 0001 0001 0000 0001 0000 0001 12 0001 0
4、010 0000 0001 0000 0010 71. bcd數加法調整指令daa和aaa(p196)wdaa-兩個壓縮bcd數相加調整指令:w(al&0fh)9或者af=1,則al加6;w(al&0f0h)90h或cf=1,則al加60h;w如:mov ax,3456hadd al,ah; al=8ahdaa ;al=90h8waaa-兩個非壓縮bcd數相加調整指令w若(al&0fh)9或af=1,則(al+6)&0fh送al,ah加1且cf置1;w否則:(al&0f0h)送al,ah不變且cf保持0不變;w如:mov ax,0806h add al,
5、ah ; al=0eh, ah=08h(沒變) mov ah,0 aaa ;屬于第1種情況,故al為(al+6)&0f=14h&0fh=04h; ah=01h9w【例【例8.1】的的程序段為:程序段為: stack segment stack stack dw 32 dup(0) stack stack ends data segment w1 dw 8931h w2 dw 5678h sum db3 dup(0) data ends codesegmentbegin proc farassume ss: stack, cs: code, ds:datapush dssub a
6、x, axpush ax10mov ax, datamov ds, axmov al, byte ptr w1 ;al=31h (+78h)add al, byte ptr w2 ;al=a9h, cf=0,af=0daa;bcd數加法調整指令數加法調整指令; al=09h, cf=1mov sum, almov al, byte ptr w1+1 ; al=89h (+56h)adc al, byte ptr w2+1 ;al=e0h,cf=0,af=1daa ; al=46h, cf=1mov sum+1, almov sum+2, 0 ;處理向萬位的進位處理向萬位的進位rcl sum+2
7、, 1 ;也可用指令;也可用指令adc sum+2, 0retbegin endpcode endsend begin11例8.2 非壓縮bcd數w1與w2(均為字變量)相加,將其和送到sum字節(jié)變量中。 data segment w1 dw 0809h ;即即89d w2 dw 0607h ;即即67d sum db3 dup(0) ;一個字節(jié)放一個字節(jié)放1位位bcd碼,用來放加完后的值碼,用來放加完后的值156 data ends12mov ax, w1 ;ax=0809h,w2為為0607hadd al, byte ptr w2 ;al=h, cf=0,af=1aaa; 屬于第一種情況,
8、故屬于第一種情況,故; al為(為(al+06h)&0fh=10h+06h )&0fh; =16h&0fh=06h=al; ;ah加加1且且cf置置cf=1,所以,所以ah=08h+1=09h,則,則ax=0906hmov sum, al ;(sum)=06hmov al,ah; al=09hadd al, byte ptr w2+1 ; al=09h+06h=0fh,屬于第,屬于第1種情況種情況mov ah, 0aaa ; al=05h, ah=01h;第一種情況處理:;第一種情況處理:al=(al+06h)&0fh, 因因0fh+06h=15h,故,故al=
9、05h,ah=ah+1=0+1=01h,所以,所以ax=0105hmov word ptr sum+1, ax;(;(sum+1)=05,(,(sum+2)=01此句也可表達為此句也可表達為mov sum, almov sum, al;見見p151p151132. bcd數減法調整指令das和daa(自看,p198)wdas-兩個壓縮bcd數相減調整指令:w(al&0fh)9,則al減6;w(al&0f0h)90h,則al減60h;w如:mov ax,5634hsub al,ah; al=deh, 有借位das ;al=78h,保持借位即134-56aas-兩個非壓縮bcd數相
10、減調整指令143. 非壓縮bcd數乘除法調整指令aam和aad(p199,自看)15順序程序設計舉例:例7.7 鏡子程序,p183-184 data segment obuf db 0dh, 0ah, $ ibuf db 0ffh, 0, 255 dup(0) data ends16mov dx , offset obuf ;mov dx , offset obuf ;顯示提示符顯示提示符“ ”并回車換行并回車換行mov ah , o9mov ah , o9int 21hint 21hmov dx , offset ibuf ;mov dx , offset ibuf ;輸入并顯示字符串輸入并
11、顯示字符串mov ah , 10mov ah , 10int 21hint 21hmov bl, ibuf+1mov bl, ibuf+1mov bh, 0mov bh, 0mov ibufbx+2, mov ibufbx+2, $ $mov dl, 0ah ; mov dl, 0ah ; 換行換行mov ah, 2mov ah, 2int 21hint 21hmov dx , offset ibuf+2 ; mov dx , offset ibuf+2 ; 再顯示輸入的字符串再顯示輸入的字符串mov ah, 9mov ah, 9int 21hint 21h178.2 分支程序設計w特點:利用
12、改變標志位的指令和轉移指令來實現。1.無條件轉移指令:jmp (見p207)2.條件轉移指令:jcond short-label(偏移地址送到ip)特點:滿足條件,則實現段內轉移;80386開始才可以轉移到代碼段的任何位置。1819202122232425268.3 循環(huán)程序設計27288.3.2 重復控制指令1.loop short-label2.loopz short-label 或或 loope short-label3.loopnz short-label 或或loopne short-label4.jcxz short-label5.jecxz short-label共同點:均受共同
13、點:均受cx或或exc的值控制,詳見的值控制,詳見p214-215298.3.3 單重循環(huán)設計舉例w例8.11 計算z=x+y,其中x和y是雙字變量w分析:雙字變量是4個字節(jié),則和可能占5個字節(jié)303132333435363738作業(yè)8.4 編寫求兩個4位非壓縮bcd數之和,將和送顯示器顯示的程序。(p261)w分析:分析:兩加數各要4個字節(jié)單元,可以為dd類型;考慮到進位,和要5個字節(jié)單元,另外,輸出到顯示器的結束符號$需要一個單元存放,故共需6個字節(jié)。因此,數據段定義為:data segment w1 dd 01020304hw2 dd 05060708hsum db 5 dup(0) d
14、b $data ends39代碼段中的核心語句mov cx, 4mov si, 0mov di, 4; 要在要在sum+4中放個位,中放個位,sum+0中放最高位的進位。中放最高位的進位。xor ax, ax; 清清cfa1: mov al, byte ptr w1si; adc al, byte ptr w2siaaamov sumdi, alinc sidec diloop a1mov sumdi, 0rcl sumdi; 以上是得到加的結果,放在以上是得到加的結果,放在sum中。下面是輸出到顯示器的程序語句中。下面是輸出到顯示器的程序語句mov dx, offset summov ah,
15、 09int 21h 40作業(yè)8.5 編寫求兩個4位壓縮bcd數之和,將和送顯示器顯示的程序。(p261)w分析:分析:兩個加數各要2個字節(jié)單元,可以為dw類型;考慮到進位,和要3個字節(jié)單元,另外,輸出到顯示器的結束符號$需要一個單元存放,故共需4個字節(jié)。因此,數據段定義為:data segment w1 dw 1234hw2 dw 5678hsum db 3 dup(0) db $data ends41代碼段中的核心語句mov cx, 2mov si, 0mov di, 2; 要在要在sum+2中放個位,中放個位,sum+0中放最高位的進位。中放最高位的進位。xor ax, ax; 清清cf
16、a1: mov al, byte ptr w1si; adc al, byte ptr w2sidaamov sumdi, alinc sidec diloop a1mov sumdi, 0rcl sumdi; 以上是得到加的結果,放在以上是得到加的結果,放在sum中。下面是輸出到顯示器的程序語句中。下面是輸出到顯示器的程序語句mov dx, offset summov ah, 09int 21h 42作業(yè)8.17 編寫求輸入算式加數1+加數2的和并送顯。(加數及其和均為4位(即指壓縮)bcd數,p262)w分析:要求先有屏幕顯示輸出加數1+加數2:,然后從鍵盤輸入兩個4個字節(jié)的bcd數,加完
17、后送顯。w用到的變量:w1和w2因為從鍵盤輸入,均不確定是幾位十進制,故需確定其最大位數不超過要用ww1 43例6.2w將內存(將內存(10050)單元的內容拆成兩段,每段)單元的內容拆成兩段,每段4位,并將它位,并將它們分別們分別 存入內存(存入內存(10051)和()和(10052)單元。即()單元。即(10050)單元中的低單元中的低4位放入(位放入(10051)單元中的低)單元中的低4位,位, 而而(10050)單元中的高)單元中的高4位放入(位放入(10052)單元中的低)單元中的低4位。位。44開始開始初始化初始化用間址方法取數到用間址方法取數到alal用用andand指令將該數指
18、令將該數“與與”ofhofh取得取得低低4 4位,存入內存(位,存入內存(1005110051)單元)單元再取出原始數到再取出原始數到alal邏輯右移得高邏輯右移得高4 4位,存入內存(位,存入內存(1005210052)單元)單元暫停暫停45程序段如下:wmov ax, 1000hwmov ds, ax ;給段寄存器ds賦值wmov si, 50hwmov al,si ;把物理地址為10000h+0050h=10050hw ; 中的存儲內容給alwand al, 0fh ;把al中的前4位清0,取得低4位值wmov si+1, al;把得到的低4位放到(10051h)單元wmov al, s
19、i ;再取出需拆字節(jié)放到al中wmov cl, 4wshr al, cl ;邏輯右移4次,前4位補0;wmov si+2, al ;放入(10052)單元and al, f0hmove si+2, al466-36-3、分枝結構程序、分枝結構程序兩分支結構47多分支結構 48例6.3 求ax累加器和bx寄存器中兩個無符號數之差的絕對值,結果放在內存(2800)單元中。w分析:不知ax與bx中數的大小,故需先判斷誰大,然后用大的減小的才可求得絕對值,w 其流程圖如圖6-549開始開始初始化,清初始化,清cfcfax-bx axax-bx axax ax 內存(內存(28002800和(和(280
20、1)2801)單元單元暫停暫停ax-bx0ax-bx0ax-bx axax-bx axbx bx 內存(內存(28002800和(和(2801)2801)單元單元否否是是50相應程序段如下 (p141)w clcw sub ax,bxw jc aa ;進位位為1,就轉移到aaw mov di, 2800hw mov di, axw hltwaa: sub bx, axw mov di, 2800hw mov di, bxw hlt51例6.4 從外設71號中取一個數m,判斷其值是否在10和20之間,即10m20.如果m20h,則送0ffh給外設73h;如果m10,則送00h給外設73h; 如果
21、10m1,并且放在內存(,并且放在內存(2001)單元中,而數據塊本)單元中,而數據塊本身是從(身是從(2002)單元開始存放的,最后,把找出的)單元開始存放的,最后,把找出的最大值放到(最大值放到(2000)單元中。假設這段數據塊中的)單元中。假設這段數據塊中的數都是無符號的數都是無符號的8位數。位數。w(1)分析題目:此題必定是個循環(huán)程序,而且在處理部分應包括判)分析題目:此題必定是個循環(huán)程序,而且在處理部分應包括判斷分支環(huán)節(jié)。斷分支環(huán)節(jié)。 (2)根據指令系統(tǒng),我們可以采用尋找最大值的計算方法。)根據指令系統(tǒng),我們可以采用尋找最大值的計算方法。74 首先,我們用首先,我們用00值放在值放在
22、al累加器中作為最大值;累加器中作為最大值;然后,用數據塊的第一個數和然后,用數據塊的第一個數和al中的數做比較,如果中的數做比較,如果比比00大,則用這個數取代大,則用這個數取代00,放入,放入al中;接著取出第中;接著取出第二個數與二個數與al中的數做比較,如果比它大,取而代之,中的數做比較,如果比它大,取而代之,否則不取代,如此往復,直至最后一個數。這樣,最否則不取代,如此往復,直至最后一個數。這樣,最后后al累加器中必定存放著最大的數。這就是尋找最大累加器中必定存放著最大的數。這就是尋找最大值的方法,而數據塊的總長度(數的個數)就是循環(huán)值的方法,而數據塊的總長度(數的個數)就是循環(huán)次數
23、。次數。 (3)繪制出此計算過程的程序流程如圖)繪制出此計算過程的程序流程如圖6-l5所示。所示。757677改為子程序時的程序段wmax: pushfw push axw push cxw push siwstart: mov si, 2001hw mov cl, siw inc siw mov al, 00w mov ch, 00hwlp: clcw cmp al, siw jc bbw jmp aawbb: mov al, siwaa: inc siw loop lpw mov 2000h, al w hltw pop siw pop cxw pop axw popfw retsub1
24、proc near/farsub1 proc near/farsub1 endpsub1 endp78791、調用程序和子程序在同一代碼段、調用程序和子程序在同一代碼段 子程序的類型應為子程序的類型應為near cod1 segment call sub1 . sub1 proc near . ret sub1 endp cod1 ends紅色部分為子程序紅色部分為子程序子程序調用方式介紹:子程序調用方式介紹:802、調用程序和子程序、調用程序和子程序不在同一代碼段不在同一代碼段子程序的類型應為子程序的類型應為far。子程序子程序sub1的類型是的類型是far,可段間調用可段間調用,也可段內調
25、用也可段內調用.code2 segment . sub1 proc near . ret sub1 endp . call sub1 .code2 endscode1 segment call far ptr sub1 . code1 ends81 code2 segment . sub1 proc near . sub1 endp . call sub1 ;段內調用段內調用 . code2 ends 子程序子程序sub1的類型是的類型是far,可段間調用可段間調用,也可也可段內調用段內調用.826.6 查表程序查表程序w要點:要點:w1)確定表格的起始地址(或稱基地址)給)確定表格的起始地址
26、(或稱基地址)給bxw2)確定要查找對象在表中的序號,(或稱索引值)給)確定要查找對象在表中的序號,(或稱索引值)給al。w3)要用到換碼指令)要用到換碼指令xlat,將累加器中的值變?yōu)閮却姹恚瑢⒗奂悠髦械闹底優(yōu)閮却姹砀裰械哪骋粋€值。格中的某一個值。w注:表格的起始地址為內存物理地址中的偏移地址注:表格的起始地址為內存物理地址中的偏移地址83例例6.9: 在在5.2節(jié)中表節(jié)中表5-2所列的十進制的所列的十進制的7段顯示碼段顯示碼實例,用程序來實現,假設這段數據存放在實例,用程序來實現,假設這段數據存放在2000h開始的內存中,取出開始的內存中,取出“5”所對應的所對應的7段碼。段碼。w程序段為
27、:wstart: mov bx, 2000hw mov al, 5w xlatw hlt84例例2 編一子程序利用編一子程序利用xlat指令把十六進制數轉換成指令把十六進制數轉換成ascii碼。假設碼。假設ascii碼存放在以碼存放在以dat1為首地址的數據區(qū)中,對為首地址的數據區(qū)中,對應的十六進制數放在以應的十六進制數放在以dat2為首地址的數據區(qū)中,轉換結為首地址的數據區(qū)中,轉換結果送以果送以dat3為首地址的數據區(qū)中。為首地址的數據區(qū)中。w分析:首地址即基址分析:首地址即基址dat1送給送給bx,ascii碼表總共有碼表總共有7fh(即(即128)個字符。所以索引值要從個字符。所以索引值
28、要從0變到變到128(存放在(存放在dat2為首地址的數據區(qū)為首地址的數據區(qū)中),需要用到循環(huán)將得到的值送到以中),需要用到循環(huán)將得到的值送到以dat3為首地址的數據區(qū)中。為首地址的數據區(qū)中。w查表核心程序語句為:查表核心程序語句為:w mov bx, 2000h(表的首地址)(表的首地址)w mov al, 5(表中對應的偏移量,即索引值)(表中對應的偏移量,即索引值)w xlatw此程序段的結果是將查到的結果送到累加器此程序段的結果是將查到的結果送到累加器ax中中85wsub1 proc nearwstart: lea si, dat2;或為mov si, dat2w lea di, da
29、t3; 或為 mov di, dat3w mov bx, dat1w mov cx, 16wlp1: mov al, si; 或為 lodsb ,即從ram ax/alw xlatw mov di, al; stosb, 即從ax/al ramw inc si ;若用了lodsb與stosb,則不用此兩句,w inc di ; 因為串操作時si和di作自動增量修改w loop lp1w w retwsub1 endpw pop alpop alp0p cxp0p cxpop dipop dipop sipop sipop bxpop bxpush bxpush bxpush sipush si
30、push dipush dipush cxpush cxpush alpush al861、 用串操作指令實現用串操作指令實現:先將先將100h個數從個數從2170h單元處搬到單元處搬到1000h1單元處單元處,然后從中檢索等于然后從中檢索等于al中字符的單元中字符的單元,并將此單元換成空格字符并將此單元換成空格字符.2、從、從60h個元素中尋找一個最大的值個元素中尋找一個最大的值,并放到并放到al中中. 假設這假設這60個元素防在個元素防在data1開始的單元中開始的單元中.3、在、在ds段有一個從段有一個從table開始的由開始的由160個字符組成的鏈表個字符組成的鏈表,設計一個程設計一個程序序,實現對此表進行搜索實現對此表進行搜索,找到第一個非零元素后找到第一個非零元素后,將此單元和下一個單將此單元和下一個單元清零元清零.87 題題1: 用串操作指令實現用串操作指令實現:先
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大學生與愛國的演講稿(4篇)
- 2025高考倒計時沖刺學生演講稿(4篇)
- 有關學生個人學習計劃(8篇)
- 大學開學典禮學生發(fā)言稿(8篇)
- Unit 1 Past and Present Welcome to the Unit英文版教學設計 2024-2025學年牛津譯林版八年級英語下冊
- 2025銀行客戶經理個人工作計劃(8篇)
- 閱讀我很重要心得體會(28篇)
- 高中畢業(yè)生自我鑒定200字范文(18篇)
- 人工智能視域下的教師數字素養(yǎng)提升策略
- 江蘇南京新中式山水展示區(qū)景觀方案
- 購房購房合同
- 《天潤乳業(yè)公司的存貨管理問題及完善對策8500字》
- 神經重癥氣管切開患者氣道功能康復與管理專家共識(2024)解讀
- 銀行攝影營銷方案
- 勞動課程設計烹飪教案
- GB/T 15688-2024動植物油脂不溶性雜質含量的測定
- 醫(yī)院圍手術期管理制度培訓課件
- 2024至2030年中國高氯酸鹽行業(yè)深度調研及發(fā)展預測報告
- 設備巡檢手冊
- 藥品零售業(yè)中可持續(xù)采購的最佳實踐
- 人教版(2015)五年級下學期信息技術第6課視頻知識一起學 教案
評論
0/150
提交評論