![實(shí)驗(yàn)8匯編實(shí)驗(yàn)_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/10/b1338fea-abfa-4ac6-b028-34136c755ec0/b1338fea-abfa-4ac6-b028-34136c755ec01.gif)
![實(shí)驗(yàn)8匯編實(shí)驗(yàn)_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/10/b1338fea-abfa-4ac6-b028-34136c755ec0/b1338fea-abfa-4ac6-b028-34136c755ec02.gif)
![實(shí)驗(yàn)8匯編實(shí)驗(yàn)_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/10/b1338fea-abfa-4ac6-b028-34136c755ec0/b1338fea-abfa-4ac6-b028-34136c755ec03.gif)
![實(shí)驗(yàn)8匯編實(shí)驗(yàn)_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/10/b1338fea-abfa-4ac6-b028-34136c755ec0/b1338fea-abfa-4ac6-b028-34136c755ec04.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)八編寫子程序(4 學(xué)時(shí))在本次實(shí)驗(yàn)中,我們將編寫3 個(gè)子程序,通過(guò)它們來(lái)認(rèn)識(shí)幾個(gè)常見(jiàn)的問(wèn)題和掌握解決這些問(wèn)題的方法。同前面的所有實(shí)驗(yàn)一樣,這個(gè)實(shí)驗(yàn)室必須獨(dú)立完成的,在后面的課程中,將要用到這個(gè)實(shí)驗(yàn)中編寫的3 個(gè)子程序。1、顯示字符串顯示字符串是下現(xiàn)實(shí)工作中經(jīng)常要用到的功能,應(yīng)該編寫一個(gè)通用的字程序來(lái)實(shí)現(xiàn)這個(gè)功能。我們應(yīng)該提供靈活的調(diào)用接口,使調(diào)用者可以決定顯示的位置(行、列)、內(nèi)容和顏色。該子程序描述如下:名稱: show_str功能:在指定位置用指定顏色顯示一個(gè)用0 結(jié)束的字符串。參數(shù): (dh)=行號(hào)(取值范圍024),( dl) =列號(hào)(取值范圍0 79),(指向字符串的首地址。返回
2、:無(wú)應(yīng)用舉例:在屏幕的8 行 3 列,用綠色顯示data 段中的字符串。cl) =顏色,ds:siassume cs: codedata segmentdbWelcome 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ù)是屏幕上的行號(hào)和列號(hào),注意在子程序內(nèi)部要將它們轉(zhuǎn)化為顯存中的地址,首先要分析一下屏
3、幕上的行列位置和顯存地址的對(duì)應(yīng)關(guān)系;( 2)注意保存子程序中用到的相關(guān)寄存器;( 3)這個(gè)子程序的內(nèi)部處理和顯存的結(jié)構(gòu)密切相關(guān),但是向外提供了與顯存結(jié)構(gòu)無(wú)關(guān)的接口。通過(guò)調(diào)用這個(gè)子程序, 進(jìn)行字符串的顯示時(shí)可以不必了解顯存的結(jié)果, 為編程提供了方便。在實(shí)驗(yàn)中,注意體會(huì)這種設(shè)計(jì)思想。data segmentdb"Welcome to masm!"data endsstack segmentdb"Welcome to masm!"stack endscode segmentstart:mov dh, 8mov dl, 3mov cl, 2mov ax, dat
4、amov ds, axmov si, 0mov ax,0B800hmov es,axmov ax, stackmov ss, axmov sp,10hcall show_strmov ax, 4c00hint 21hshow_str:push dxpush cxmov al,160dec dhmul dhmov bx,axadd dx,siadd dl,dladd bl,dlmov cl,simov ch,0jcxz okmov es:bx,clpop cxmov es:bx+1,clinc sipop dxjmp short show_strok:pop cxpop dxretcode en
5、dsend start2、解決除法溢出的問(wèn)題前面講過(guò), div 指令可以做除法。當(dāng)進(jìn)行 8 位除法的時(shí)候,用 al 存儲(chǔ)商, ah 存儲(chǔ)余數(shù);進(jìn)行 16 位除法時(shí),用 ax 存儲(chǔ)商, dx 存儲(chǔ)余數(shù)??墒牵F(xiàn)在有一個(gè)問(wèn)題,如果結(jié)果的商大于 al 或 ax 所能存儲(chǔ)的最大值,那么將如何?比如,下面的程序段:mov bh, 1mov ax, 1000div bh進(jìn)行的是 8 位除法,商為1000 ,而 1000 在 al 中放不下。又比如,下面的程序段:mov ax, 1000Hmov dx, 1mov bx, 1div bx進(jìn)行的是 16 位除法,商為11000H,而 11000H 在 ax 中
6、放不下。我們?cè)谟?div 指令做除法的時(shí)候,和可能發(fā)生上面的情況:結(jié)果的商過(guò)大,超出了寄存器所能存儲(chǔ)的范圍。當(dāng)CPU 執(zhí)行 div 等除法指令時(shí),如果發(fā)生這樣的情況,將引發(fā)CPU 的一個(gè)內(nèi)部錯(cuò)誤,這個(gè)錯(cuò)誤被稱為:除法溢出 。我們可以通過(guò)特殊的程序來(lái)處理這個(gè)錯(cuò)誤,但在這里我們不討論這個(gè)錯(cuò)誤的處理,這是后面課程中要涉及的內(nèi)容。下面我們僅僅來(lái)看一下除法發(fā)生時(shí)的一些現(xiàn)象,如同8.1 所示。圖 8.1除法溢出時(shí)發(fā)生的現(xiàn)象圖中展示了在 Windows 2000 中使用 Debug 執(zhí)行相關(guān)程序段的結(jié)果,div令引發(fā)了 CPU的除法溢出,系統(tǒng)對(duì)其進(jìn)行了相關(guān)的處理。至此,我們已經(jīng)清楚了問(wèn)題所在; 用 div
7、指令做除法的時(shí)候可能產(chǎn)生除法溢出。由于有這樣的問(wèn)題,在進(jìn)行除法運(yùn)算時(shí)要注意除數(shù)和被除數(shù)的值,比如1000000/10 就不能用div指令來(lái)計(jì)算。那么怎么辦呢?我們用下面的子程序指divdw解決。該子程序的描述如下:名稱: divdw功能:進(jìn)行不會(huì)產(chǎn)生溢出的除法運(yùn)算,被除數(shù)為果為 dword 型。dword 型,除數(shù)為word 型,結(jié)參數(shù) : (ax)=dword 型數(shù)據(jù)的低 16 位;(dx)=dword 型數(shù)據(jù)的高 16 位; (cx)= 除數(shù)返回: (ax)= 商的低 16 位; (dx)= 商的高 16 位; (cx)= 余數(shù)應(yīng)用舉例:計(jì)算 1000000/10(F424H/0AH)mo
8、v ax, 4240Hmov dx, 000FHmov cx, 0AHcall divdw結(jié)果: (ax)=86A0H,(dx)=0001H, (cx)=0.提示 :給出一個(gè)公式:X: 被除數(shù),范圍: 0,FFFFFFFFN: 除數(shù),范圍 : 0,FFFFH: X 高 16 位,范圍 : 0,FFFFL: X 低 16 位,范圍 : 0,FFFFint():描述性運(yùn)算符,取商,比如int(38/10)=3rem(): 描述性運(yùn)算符,取余數(shù),比如 rem(38/10)=8 公式: X/N=int(H/N)*65536+rem(H/N)*65536+L/N這個(gè)公式將可能產(chǎn)生溢出的除法運(yùn)算:X/N,
9、轉(zhuǎn)變?yōu)槎鄠€(gè)不會(huì)產(chǎn)生溢出的除法運(yùn)算。公式中,等號(hào)右邊的所有除法運(yùn)算都可以用div 指令來(lái)做,肯定不會(huì)導(dǎo)致除法溢出。(關(guān)于這個(gè)公式的推導(dǎo), 有興趣的同學(xué)可參見(jiàn)王爽所著 匯編語(yǔ)言的附注 5.代碼:assume cs: codedata segmentdb "Welcome to masm!",0data endsstack segmentdb "Welcome to masm!"stack endscode segmentstart:mov ax, 4240Hmov dx, 000FHmov cx, 0AHcall divdwmov ax, 4c00hint
10、21hdivdw:push axmov ax,dxmov dx,0div cxmov bx,axpop axdiv cxmov cx,dxmov dx,bxretcode endsend start3、數(shù)值顯示編程實(shí)現(xiàn)將data 段中的數(shù)據(jù)以十進(jìn)制的形式顯示出來(lái)。data segmentdw 123, 12666, 1, 8, 3, 38data ends“ 12666”。由于顯卡遵循的是ASCII 編碼,為了讓我們能在顯示器上看到這串字符,它在機(jī)器中應(yīng)以ASCII碼的形式存儲(chǔ)為:31H, 32H, 36H, 36H, 36H(字符“ 0”“ 9”對(duì)應(yīng)的ASCII碼為30H 39H) .通過(guò)上
11、面的分析可以看到,在概念世界中,有一個(gè)抽象的數(shù)據(jù)12666,它表示了一個(gè)數(shù)值的大小。在現(xiàn)實(shí)世界中它可以有多種表示形式,可以在電子機(jī)器中以高低電平(二進(jìn)制)的形式存儲(chǔ),也可以在紙上、黑板上、屏幕上以人類的語(yǔ)言“12666”來(lái)書寫?,F(xiàn)在,我們面臨的問(wèn)題的就是,要將同一抽象的數(shù)據(jù)從一種表示形式轉(zhuǎn)化為另一種表示形式??梢?jiàn),要將數(shù)據(jù)用十進(jìn)制形式顯示到屏幕上,要進(jìn)行兩步工作:( 1)將用二進(jìn)制信息存儲(chǔ)的數(shù)據(jù)轉(zhuǎn)變?yōu)槭M(jìn)制形式的字符串;( 2)顯示十進(jìn)制形式的字符串。第二步我們?cè)诒敬螌?shí)驗(yàn)的第一個(gè)子程序中已經(jīng)實(shí)現(xiàn),在這里只要調(diào)用一下show_str 即可。我們來(lái)討論第一步,因?yàn)閷⒍M(jìn)制信息轉(zhuǎn)變?yōu)槭M(jìn)制形式的字符
12、串也是經(jīng)常要用到的功能,我們應(yīng)該為它編寫一個(gè)通用的子程序。該子程序的描述如下:名稱:dtoc功能:將 word 型數(shù)據(jù)轉(zhuǎn)變?yōu)楸硎臼M(jìn)制數(shù)的字符串,字符串以0 為結(jié)尾符。參數(shù):(ax)=word 型數(shù)據(jù), ds:si 指向字符串的首地址。返回:無(wú)應(yīng)用舉例:編程實(shí)現(xiàn)將數(shù)據(jù)12666 以十進(jìn)制形式在屏幕的8 行 3 列用綠色顯示出來(lái)。在顯示時(shí)我們調(diào)用本次實(shí)驗(yàn)中的第一個(gè)子程序show_str 。assume cs: codedata segmentdb 10 dup (0)data endscode segmentstart: mov ax, 12666mov bx, datamov ds, bxmo
13、v si, 0call dtocmov dh, 8mov dl, 3mov cl, 2call show_str:code endsend start提示:下面我們對(duì)這個(gè)問(wèn)題進(jìn)行一下簡(jiǎn)單的分析。(1)要得到字符串 “12666”,就是要得到一列表示該字符串的ASCII碼:31H, 32H, 36H, 36H,36H。十進(jìn)制數(shù)碼字符對(duì)應(yīng)的ASCII碼 =十進(jìn)制數(shù)碼值 +30H。要得到表示十進(jìn)制數(shù)的字符串,先求十進(jìn)制數(shù)每位的值。例:對(duì)于 12666,先求得每位的值: 1,2, 6,6, 6。再將這些數(shù)分別加上 30H,便得到了表示 12666 的 ASCII碼串 : 31H, 32H, 36H,
14、36H, 36H。(2)那么,怎樣得到每位的值呢?采用除基取余法:余數(shù)10| 12666610|1266610|126610|12210|110可見(jiàn),用基數(shù) 10 除 12666,共除5 次,記下每次的余數(shù),就得到了每位的值。(3)綜合上面的分析,可得到處理過(guò)程如下:用 12666 除以 10,循環(huán) 5 次,記下每次的余數(shù);將每次的余數(shù)分別加上30H,便得到了表示十進(jìn)制數(shù)的 ASCII碼串。如下:余數(shù) +30HASCII碼串字符串10| 12666636H610|1266636H610|126636H610|12232H210|1131H10(4)對(duì)( 3 )的質(zhì)疑。在已知數(shù)據(jù)是 12666
15、的情況下, 知道進(jìn)行 5 次循環(huán)。 可在實(shí)際問(wèn)題中, 數(shù)據(jù)的值是多少程序員并不知道,也就是說(shuō),程序員不能事先確定循環(huán)次數(shù)。那么,如何確定數(shù)據(jù)各位的值已經(jīng)全部求出來(lái)了呢?我們可以看出,只要是除到商為0,各位的值就已經(jīng)全部求出??梢允褂胘cxz 指令來(lái)實(shí)現(xiàn)相關(guān)的功能。代碼:assume cs: codedata segmentdb 10 dup (0)data endscode segmentstart: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,10mov dx,0div bxmov cx,axmov si,dxadd byte ptr si,
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 七年級(jí)數(shù)學(xué)上冊(cè)第30課時(shí)銷售問(wèn)題和儲(chǔ)蓄問(wèn)題聽(tīng)評(píng)課記錄新湘教版
- 湘教版數(shù)學(xué)八年級(jí)上冊(cè)《1.1 分式》聽(tīng)評(píng)課記錄
- 人教版歷史七年級(jí)下冊(cè)第1課《隋朝的統(tǒng)一與滅亡》聽(tīng)課評(píng)課記錄
- 2022年新課標(biāo)八年級(jí)上冊(cè)道德與法治《7.1 關(guān)愛(ài)他人 》聽(tīng)課評(píng)課記錄
- 生物技術(shù)創(chuàng)新合作開(kāi)發(fā)合同(2篇)
- 理財(cái)委托合同(2篇)
- 人教版數(shù)學(xué)八年級(jí)下冊(cè)20.1.1《平均數(shù)》聽(tīng)評(píng)課記錄3
- 語(yǔ)文聽(tīng)評(píng)課記錄九年級(jí)
- 人教版數(shù)學(xué)八年級(jí)上冊(cè)《11.2.2三角形的外角》聽(tīng)評(píng)課記錄1
- 數(shù)學(xué)七年級(jí)下學(xué)期《立方根》聽(tīng)評(píng)課記錄
- 安全安全技術(shù)交底模板
- 房屋建筑工程投標(biāo)方案(技術(shù)方案)
- 部編版一年級(jí)語(yǔ)文下冊(cè)語(yǔ)文園地五《單元拓展-字族文》教學(xué)設(shè)計(jì)
- 靜脈輸液法操作并發(fā)癥的預(yù)防及處理
- 牙外傷的遠(yuǎn)期并發(fā)癥監(jiān)測(cè)
- 2025年高考語(yǔ)文作文備考:議論文萬(wàn)能模板
- 重大事故隱患判定標(biāo)準(zhǔn)與相關(guān)事故案例培訓(xùn)課件(建筑)
- 《我的寒假生活》
- DZ/T 0430-2023 固體礦產(chǎn)資源儲(chǔ)量核實(shí)報(bào)告編寫規(guī)范(正式版)
- (高清版)WST 442-2024 臨床實(shí)驗(yàn)室生物安全指南
- 歷史時(shí)間軸全
評(píng)論
0/150
提交評(píng)論