試驗8匯編試驗_第1頁
試驗8匯編試驗_第2頁
試驗8匯編試驗_第3頁
試驗8匯編試驗_第4頁
試驗8匯編試驗_第5頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

1、實驗八 編寫子程序( 4 學(xué)時)在本次實驗中,我們將編寫 3 個子程序,通過它們來認識幾個常見的問題和掌握解決 這些問題的方法。同前面的所有實驗一樣,這個實驗室必須獨立完成的,在后面的課程中, 將要用到這個實驗中編寫的 3 個子程序。1、顯示字符串 顯示字符串是下現(xiàn)實工作中經(jīng)常要用到的功能,應(yīng)該編寫一個通用的字程序來實現(xiàn)這個 功能。我們應(yīng)該提供靈活的調(diào)用接口,使調(diào)用者可以決定顯示的位置(行、列)、內(nèi)容和顏 色。該子程序描述如下:名稱: show_str功能:在指定位置用指定顏色顯示一個用 0 結(jié)束的字符串。參數(shù):(dh)=行號(取值范圍 024),( dl)=列號(取值范圍 079),( cl

2、)=顏色,ds:si 指向字符串的首地址。返回:無應(yīng)用舉例:在屏幕的 8 行 3 列,用綠色顯示 data 段中的字符串。assume cs: codedata segmentdb Welcome to masm! ', 0data endscode segmentstart: mov dh, 8mov dl, 3mov cl, 2mov ax, datamov ds, axmov si, 0call show_strmov ax, 4c00hint 21hshow_str: :code endsend start 提示:( 1)子程序的入口參數(shù)是屏幕上的行號和列號,注意在子程序內(nèi)部要

3、將它們轉(zhuǎn)化為顯存中 的地址,首先要分析一下屏幕上的行列位置和顯存地址的對應(yīng)關(guān)系;( 2)注意保存子程序中用到的相關(guān)寄存器;( 3 )這個子程序的內(nèi)部處理和顯存的結(jié)構(gòu)密切相關(guān),但是向外提供了與顯存結(jié)構(gòu)無關(guān)的接 口。通過調(diào)用這個子程序, 進行字符串的顯示時可以不必了解顯存的結(jié)果, 為編程提供了方 便。在實驗中,注意體會這種設(shè)計思想。data segmentdb "Welcome to masm!"data endsstack segmentdb "Welcome to masm!" stack ends code segmentstart:mov dh, 8

4、 mov dl, 3 mov cl, 2 mov ax, data mov ds, ax mov si, 0 mov ax,0B800h mov es,ax mov ax, stack mov ss, ax mov sp,10h call show_str mov ax, 4c00h int 21h show_str:push dx push cx mov al,160 dec dh mul dh mov bx,ax add dx,si add dl,dl add bl,dl mov cl,si mov ch,0 jcxz ok mov es:bx,cl pop cx mov es:bx+1,

5、cl inc si pop dx jmp short show_str ok:pop cxpop dxret code ends end start2、解決除法溢出的問題前面講過, div 指令可以做除法。當進行 8 位除法的時候,用 al 存儲商, ah 存儲余數(shù); 進行16位除法時,用ax存儲商,dx存儲余數(shù)。可是,現(xiàn)在有一個問題,如果結(jié)果的商大 于 al 或 ax 所能存儲的最大值,那么將如何?比如,下面的程序段:mov bh, 1mov ax, 1000div bh進行的是8位除法,商為1000,而1000在al中放不下。又比如,下面的程序段:mov ax, 1000Hmov dx,

6、1mov bx, 1div bx進行的是16位除法,商為11000H,而11000H在ax中放不下。我們在用 div 指令做除法的時候,和可能發(fā)生上面的情況:結(jié)果的商過大,超出了寄存器所能存儲的范圍。當 CPU執(zhí)行div等除法指令時,如果發(fā)生這樣的情況,將引發(fā)CPU的一個內(nèi)部錯誤,這個錯誤被稱為: 除法溢出 。我們可以通過特殊的程序來處理這個錯誤, 但 在這里我們不討論這個錯誤的處理, 這是后面課程中要涉及的內(nèi)容。 下面我們僅僅來看一下 除法發(fā)生時的一些現(xiàn)象,如同 8.1 所示。圖 8.1 除法溢出時發(fā)生的現(xiàn)象圖中展示了在 Windows 2000 中使用 Debug 執(zhí)行相關(guān)程序段的結(jié)果,

7、div 指 令引發(fā)了 CPU勺除法溢出,系統(tǒng)對其進行了相關(guān)的處理。至此,我們已經(jīng)清楚了問題所在; 用 div 指令做除法的時候可能產(chǎn)生除法溢 出。由于有這樣的問題,在進行除法運算時要注意除數(shù)和被除數(shù)的值,比如 1000000/10 就不能用 div 指令來計算。那么怎么辦呢?我們用下面的子程序 divdw 解決。該子程序的描述如下:名稱: divdw功能:進行不會產(chǎn)生溢出的除法運算,被除數(shù)為 dword 型,除數(shù)為 word 型,結(jié) 果為 dword 型。參數(shù):(ax)=dword型數(shù)據(jù)的低16位;(dx)=dword型數(shù)據(jù)的高16位;(cx)=除數(shù)返回: (ax)= 商的低 16 位; (d

8、x)= 商的高 16 位; (cx)= 余數(shù)應(yīng)用舉例:計算 1000000/10(F424H/0AH)mov ax, 4240Hmov dx, 000FHmov cx, 0AHcall divdw結(jié)果:(ax)=86A0H,(dx)=0001H, (cx)=0.提示:給出一個公式:X: 被除數(shù),范圍: 0,FFFFFFFFN: 除數(shù),范圍 : 0,FFFFH: X 高 16位,范圍: 0,FFFFL: X 低 16位,范圍: 0,FFFFint(): 描述性運算符,取商,比如 int(38/10)=3rem(): 描述性運算符,取余數(shù),比如 rem(38/10)=8公式: X/N=int(H/

9、N)*65536+rem(H/N)*65536+L/N這個公式將可能產(chǎn)生溢出的除法運算: X/N,轉(zhuǎn)變?yōu)槎鄠€不會產(chǎn)生溢出的除 法運算。公式中,等號右邊的所有除法運算都可以用 div 指令來做, 肯定不會導(dǎo) 致除法溢出。(關(guān)于這個公式的推導(dǎo), 有興趣的同學(xué)可參見王爽所著 匯編語言 的附注 5.代碼:assume cs: codedata segmentdb "Welcome to masm!",0data endsstack segmentdb "Welcome to masm!"stack endscode segmentstart:mov ax, 42

10、40Hmov dx, 000FHmov cx, 0AHcall divdwmov ax, 4c00hint 21hdivdw:push axmov ax,dxmov dx,0div cxmov bx,axpop axdiv cxmov cx,dxmov dx,bxretcode endsend start3、數(shù)值顯示編程實現(xiàn)將 data 段中的數(shù)據(jù)以十進制的形式顯示出來。data segmentdw 123, 12666, 1, 8, 3, 38data ends“12666”。由于顯卡遵循的是 ASCII 編碼,為了讓我們能在顯示器上看到這串字符,它在機器中應(yīng)以 ASCII碼的形式存儲為:3

11、1H, 32H, 36H, 36H, 36H (字符“ 0”“ 9”對應(yīng)的 ASCII碼為 30H39H).通過上面的分析可以看到,在概念世界中,有一個抽象的數(shù)據(jù)12666,它表示了一個數(shù)值的大小。在現(xiàn)實世界中它可以有多種表示形式,可以在電子機器中以高低電平(二進制) 的形式存儲,也可以在紙上、黑板上、屏幕上以人類的語言“12666”來書寫?,F(xiàn)在,我們面臨的問題的就是,要將同一抽象的數(shù)據(jù)從一種表示形式轉(zhuǎn)化為另一種表示形式??梢?,要將數(shù)據(jù)用十進制形式顯示到屏幕上,要進行兩步工作:(1) 將用二進制信息存儲的數(shù)據(jù)轉(zhuǎn)變?yōu)槭M制形式的字符串;(2) 顯示十進制形式的字符串。 第二步我們在本次實驗的第一

12、個子程序中已經(jīng)實現(xiàn),在這里只要調(diào)用一下 show_str 即可。 我們來討論第一步,因為將二進制信息轉(zhuǎn)變?yōu)槭M制形式的字符串也是經(jīng)常要用到的功能, 我們應(yīng)該為它編寫一個通用的子程序。該子程序的描述如下:名稱: dtoc功能: 將 word 型數(shù)據(jù)轉(zhuǎn)變?yōu)楸硎臼M制數(shù)的字符串,字符串以 0 為結(jié)尾符。參數(shù): (ax)=word 型數(shù)據(jù), ds:si 指向字符串的首地址。返回: 無應(yīng)用舉例: 編程實現(xiàn)將數(shù)據(jù) 12666 以十進制形式在屏幕的 8 行 3 列用綠色顯示出來。在顯 示時我們調(diào)用本次實驗中的第一個子程序 show_str 。assume cs: code data segmentdb 10

13、 dup (0)data ends code segment start: mov ax, 12666 mov bx, data mov ds, bx mov si, 0 call dtoc mov dh, 8 mov dl, 3 mov cl, 2 call show_str code endsend start提示: 下面我們對這個問題進行一下簡單的分析。(1)要得到字符串“ 12666” ,就是要得到一列表示該字符串的ASCII碼:31H, 32H, 36H, 36H,36H。十進制數(shù)碼字符對應(yīng)的 ASCI=十進制數(shù)碼值+30H。 要得到表示十進制數(shù)的字符串,先求十進制數(shù)每位的值。例:對

14、于12666,先求得每位的值:1,2,6,6,6。再將這些數(shù)分別加上 30H,便得 到了表示 12666 的 ASCII碼串:31H, 32H, 36H, 36H, 36H。(2)那么,怎樣得到每位的值呢?采用除基取余法: 余數(shù)10 | 1 2 6 6 6610 | 1 2 66610 | 1 2 6610 | 1 2210 | 110可見,用基數(shù)10除12666,共除5次,記下每次的余數(shù),就得到了每位的值。(3 )綜合上面的分析,可得到處理過程如下:用12666除以10,循環(huán)5次,記下每次的余數(shù);將每次的余數(shù)分別加上30H,便得到了衣小十進帀制數(shù)的ASCII碼中。如 下余數(shù) +30HASCI

15、I碼串字符串10 | 1 2 6 6 6636H6''10 | 1 2 66636H6''10 | 1 2 6636H'10 | 1 2232H2'10 | 1131H1''0(4)對(3 )的質(zhì)疑。在已知數(shù)據(jù)是12666的情況下,知道進行5次循環(huán)。可在實際問題中,數(shù)據(jù)的值是多少程序員并不知道,也就是說,程序員不能事先確定循環(huán)次數(shù)。那么,如何確定數(shù)據(jù)各位的值已經(jīng)全部求出來了呢?我們可以看出,只要是除到商為0,各位的值就已經(jīng)全部求出??梢允褂胘cxz指令來實現(xiàn)相關(guān)的功能。代碼:assume cs: codedata segme ntdb 10 dup (0)data endscode segme ntsta比mov ax, 12666mov bx, datamov ds, bxmov bx,0B800hmov es,bxmov si, 0call dtocmov dh, 8mov dl, 3mov cl, 2call show_strmov ax, 4c00hint 21hdtoc:mov bx,10 mov dx,0 div bx mov cx,ax mov si,dx add byte ptr si,30h inc si jcxz

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論