汇编语言随笔(8)-实验9(显示字符串)、实验10(子程序:除法溢出,数值到字符串的转换)和课程设计1
實驗9
??????編程,在屏幕中間分別顯示綠色,綠底紅色,白底藍色的字符串‘welcome to masm!’。
??????80x25彩色字符模式下的顯示緩沖區(qū),每頁可以顯示25行,每行80個字符,其中每個字符占兩個字節(jié)的存儲空間,低位字節(jié)存儲字符的ASCII值,高位字節(jié)存儲字符的屬性。所以一行總共有160個字節(jié)。其中屬性字節(jié)的格式如下:
| 含義 | BL | R | G | B | I | R | G | B |
??????其中BL為閃爍,R為紅色,G為綠色,B為藍色,I為高亮,在高位的RGB表示背景顏色,低位的表示前景顏色。
??????以綠底紅色為例,它的顏色屬性為00100100B。顯示緩沖區(qū)的段地址為0b800h,默認在第0頁的屏幕中間的偏移地址為12x160+(40-16/2)x2。其中16為本程序中字符串的字節(jié)數(shù)。搞清楚了目的地址和顏色屬性之后,我們開始編寫程序:
實驗10
問題1 顯示字符串
??????編寫一個通用的子程序來讓調(diào)用者可以決定顯示的位置(行、列、內(nèi)容和顏色)
??????子程序描述如下:
????????????名稱:show_str
????????????功能:在指定的位置、用特定的顏色,顯示一個用0結(jié)束的字符串
????????????參數(shù):(dh)=行號(取值范圍為0-24),(dl)=列號(取值范圍為0-79),(cl)=顏色,ds:si指向字符串的首地址
????????????返回:無
??????在屏幕的8行3列,用綠色顯示data段中的字符串,完整的程序如下:
問題2 解決除法溢出
??????問題:除法溢出指的是商過大,超出了寄存器的存儲范圍。比如:16位的被除數(shù)和8位的除數(shù)在做除法的時候,用al存儲結(jié)果的商,ah存儲結(jié)果的余數(shù)。如果當(dāng)除數(shù)為1時,那么商也是一個16位數(shù)據(jù),這超過了al這個8位寄存器所能表示數(shù)據(jù)的范圍了。
??????子程序描述如下:
????????????名稱:divdw
????????????功能:進行不會溢出的除法運算,被除數(shù)為dword型,除數(shù)為word型,結(jié)果為dword型。
????????????參數(shù):(ax)=dword型數(shù)據(jù)的低16位,(dx)=dword型數(shù)據(jù)的高16位,(cx)=除數(shù)
????????????返回:(dx)=結(jié)果的高16位,(ax)=結(jié)果的低16位,(cx)=余數(shù)
??????提示:參考公式如下:
????????????X:被除數(shù),范圍:[0,FFFFFFFF]
????????????N:除數(shù),范圍:[0,FFFF]
????????????H:X高16位,范圍:[0,FFFF]
????????????L:X低16位,范圍:[0,FFFF]
????????????int():描述性運算符,取商,比如,int(38/10)=3
????????????rem():描述性運算符,取余數(shù),比如,rem(38/10)=8
????????????公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
????????????注意:乘以65536相當(dāng)于左移16位。
??????計算1000000/10(F4240H/0AH)完整程序如下:
問題3 數(shù)值(int)到字符串形式的轉(zhuǎn)換
??????問題:把數(shù)據(jù)用十進制的形式顯示到屏幕上,需進行兩步的操作:(1),將用二進制信息存儲的數(shù)據(jù)轉(zhuǎn)變?yōu)槭M制形式的字符串(2),顯示十進制形式的字符串(只需調(diào)用問題1的show_str即可)
??????子程序描述如下:
????????????名稱:dtoc
????????????功能:將word型數(shù)據(jù)轉(zhuǎn)變?yōu)槭M制數(shù)的字符串,字符串以0為結(jié)尾符。
????????????參數(shù):(ax)=word型數(shù)據(jù)、ds:si指向字符串的首地址
????????????返回:無
??????編程,將數(shù)據(jù)12666以十進制形式在屏幕的8行3列,用綠色顯示出來。在顯示時調(diào)用本次實驗中的第一個子程序show_str。
??????思路:想要得到十進制數(shù)12666的每一位數(shù)值,需將12666除以10,它的余數(shù)6為個位上的數(shù)值,它的商1266作為新的被除數(shù)再除以10,余數(shù)6為原數(shù)據(jù)十位上的數(shù)值,它的商再次除以10,以此類推,進行5次除以10操作就可以得到每一位的值了。
??????在已知數(shù)據(jù)為12666的情況下,循環(huán)次數(shù)為5,但對于數(shù)據(jù)未知的情況下,就需要判定每次得到的商是否為0了,當(dāng)除到商為0時,所有位上的值就被全部求出。在此采用jcxz指令來實現(xiàn)此功能。
??????除法功能在此采用32位除以16位的方式來實現(xiàn),因為這樣不會導(dǎo)致溢出。因為如果采用16位除以8位的方式的話,那么它的商也是用8位來保存的,而12666/10=1266,這已經(jīng)大于8位數(shù)據(jù)的最大值255了。
課程設(shè)計1
??????將實驗七中的公司21年的數(shù)據(jù)在屏幕上顯示出來,一共占據(jù)屏幕21行,每一行中顯示出每一年的數(shù)據(jù),依次為年份、收入、雇員數(shù)和平均收入。
??????思路:
????????????先計算出每一字段的行號和列號,可得,行號范圍為[2,22];每一行第一個字段起始地址為6,第二個字段起始地址為28,第三個字段起始地址為50,最后一個字段起始地址為72。這樣就可以將所有數(shù)據(jù)內(nèi)容顯示在屏幕中央。
????????????說明一點,前面已經(jīng)實現(xiàn)了的子程序在此將被直接調(diào)用。
????????????但還需要編寫一個將dword型數(shù)據(jù)轉(zhuǎn)換為字符串的子程序。說明如下:
??????????????????名稱:ddtoc(為了和word型數(shù)據(jù)轉(zhuǎn)換子程序dtoc區(qū)分開來)
??????????????????功能:將dword型數(shù)據(jù)轉(zhuǎn)變?yōu)楸硎臼M制數(shù)的字符串,字符串以0為結(jié)尾符
??????????????????參數(shù):(ax)=dword型數(shù)據(jù)的低16位,(dx)=dword型數(shù)據(jù)的高16位,ds:si指向字符串的首地址
??????????????????返回:無
??????????????????仍需要注意除法溢出的問題。
??????完整程序如下:
總結(jié)
以上是生活随笔為你收集整理的汇编语言随笔(8)-实验9(显示字符串)、实验10(子程序:除法溢出,数值到字符串的转换)和课程设计1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编语言随笔(7)-访问内存的寻址方式和
- 下一篇: 汇编语言随笔(9)-实验11(用条件转移