匯編語(yǔ)言-課程設(shè)計(jì)212頁(yè)_第1頁(yè)
匯編語(yǔ)言-課程設(shè)計(jì)212頁(yè)_第2頁(yè)
匯編語(yǔ)言-課程設(shè)計(jì)212頁(yè)_第3頁(yè)
匯編語(yǔ)言-課程設(shè)計(jì)212頁(yè)_第4頁(yè)
匯編語(yǔ)言-課程設(shè)計(jì)212頁(yè)_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、匯編語(yǔ)言課程實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱課程設(shè)計(jì)2實(shí)驗(yàn)環(huán)境硬件平臺(tái):Intel Core i5-3210M操作系統(tǒng):DOSBox 0.74 in Windows 8.1軟件工具:MASM, VFloopy, Microsoft Virtual PC 2007實(shí)驗(yàn)內(nèi)容編寫(xiě)一個(gè)可以自動(dòng)啟動(dòng)計(jì)算機(jī),不需要在現(xiàn)有操作系統(tǒng)環(huán)境中運(yùn)行的程序。該程序功能如下:(1) 列出功能選項(xiàng),讓用戶通過(guò)鍵盤(pán)進(jìn)行選擇,界面如下:1) reset pc;重新啟動(dòng)計(jì)算機(jī)2) start system;引導(dǎo)現(xiàn)有的操作系統(tǒng)3) clock;進(jìn)入時(shí)鐘程序4) set clock;設(shè)置時(shí)間(2) 用戶輸入“1”后重新啟動(dòng)計(jì)算機(jī)(提示:考慮fff

2、f:0單元)。(3) 用戶輸入“2”后引導(dǎo)現(xiàn)有的操作系統(tǒng)(提示:考慮硬盤(pán)C的0道0面1扇區(qū))。(4) 用戶輸入“3”后,執(zhí)行動(dòng)態(tài)顯示當(dāng)前日期、時(shí)間的程序。顯示格式如下:年/月/日 時(shí):分:秒進(jìn)入此項(xiàng)功能后,一直動(dòng)態(tài)顯示當(dāng)前的時(shí)間,在屏幕上將出現(xiàn)時(shí)間按秒變化的效果(提示:循環(huán)讀取CMOS)。實(shí)驗(yàn)步驟1. 系統(tǒng)啟動(dòng)初始化完成后最終調(diào)用19h,該中斷讀取軟盤(pán)的第一扇區(qū)或硬盤(pán)的第一扇區(qū)到0:7c00開(kāi)始的512個(gè)字節(jié)的內(nèi)存空間中,并將cs:ip指向0:7c00執(zhí)行。2. 第一個(gè)段為安裝程序,負(fù)責(zé)將第二個(gè)段寫(xiě)入第一扇區(qū),第三個(gè)段寫(xiě)入2-17扇區(qū)。3. 第二個(gè)段是主引導(dǎo)程序,存在于軟盤(pán)第一扇區(qū),由BIOS

3、的19h中斷讀取到0:7c00開(kāi)始的內(nèi)存單元中,并執(zhí)行0:7c00的第一行代碼。這一段的任務(wù)是將軟盤(pán)2-17扇區(qū)的數(shù)據(jù)讀入內(nèi)存,并執(zhí)行。(這里讀入到了2000:0開(kāi)始的內(nèi)存中)。4. 第三個(gè)段是系統(tǒng)程序,存放所有引導(dǎo)所需的程序和子程序。5. 程序的匯編代碼如下:assume cs:setupsg;安裝程序;將引導(dǎo)所需的程序?qū)懭氲杰洷P(pán)setupsg segmentassume cs:setupsgsetup:;主引導(dǎo)程序安裝到第一扇區(qū)mov ax,initsgmov es,axmov bx,0mov al,1mov ch,0mov cl,1mov dl,0mov dh,0 mov ah,3int

4、 13h ;子程序安裝到從第2扇區(qū)開(kāi)始的扇區(qū)mov ax,syssg mov es,axmov al,15mov cl,2 mov ah,3int 13h ;安裝結(jié)束,返回mov ax,4c00hint 21h setupsg ends;主引導(dǎo)程序;包含所有子程序的直接定址表,扇區(qū)加載程序,菜單initsg segmentassume cs:initsginit:call loadsys mov ax,2000hpush axmov ax,0push axretf loadsys:mov ax,2000h ;軟盤(pán)數(shù)據(jù)讀取到2000:0mov es,axmov bx,0 mov al,15 ;讀

5、取的扇區(qū)數(shù)mov ch,0 ;0磁道m(xù)ov cl,2 ;2扇區(qū)mov dl,0 ;0號(hào)驅(qū)動(dòng)器mov dh,0 ;0面mov ah,2int 13hretinitsg ends;子程序;包含所有菜單需要調(diào)用的子過(guò)程syssg segmentassume cs:syssg;菜單顯示功能menu: jmp near ptr menushow menudata dw offset md0,offset md1,offset md2,offset md3,offset md4,offset md5 md0 db "- Welcome -",0 md1 db "1) rese

6、t pc",0 md2 db "2) start system",0 md3 db "3) clock",0 md4 db "4) set clock",0 md5 db "Copyright 2010 Haoran, Inc.All rights reserved.",0 systable dw sys_restart,sys_disksys,sys_showclock,sys_setclockmenushow: mov dh,5 mov dl,30 mov bp,0 mov ax,cs mov ds,

7、ax mov cx,5menushow_s: push cx mov si,menudatabp mov cl,02h call sys_showstr add bp,2 add dh,2 pop cx loop menushow_s mov si,offset md5 mov dh,23 mov dl,28 mov cl,02h call sys_showstr ;處理用戶輸入sys_input: mov ah,0 int 16h mov bx,0 mov bl,al mov al,30h sub bl,al ;ascii轉(zhuǎn)換為序列號(hào) sub bl,1 ;1-4轉(zhuǎn)換為0-3 cmp bx,0

8、 jb cycle cmp bx,3 ja cycle add bx,bx call word ptr systablebx ;調(diào)用菜單功能 cycle: jmp short sys_input ;重啟計(jì)算機(jī)sys_restart: mov ax,0ffffh push ax mov ax,0h push ax retf ;從硬盤(pán)引導(dǎo)sys_disksys: call cls mov ax,0h ;硬盤(pán)數(shù)據(jù)讀取到0:7c00 mov es,ax mov bx,7c00h mov al,1 ;讀取的扇區(qū)數(shù) mov ch,0 ;0磁道 mov cl,1 ;1扇區(qū) mov dl,80h ;c盤(pán) mo

9、v dh,0 ;0面 mov ah,2 int 13h mov ax,0h push ax mov ax,7c00h push ax retf;顯示時(shí)鐘sys_showclock: call cls jmp short clockreadclockdata: clockstr dw offset cl1,offset cl2,offset cl3 clockcolor db 02h cl1 db '00/00/00 00:00:00',0 cl2 db 'press ESC return menu!',0 cl3 db 'press F1 change

10、color!',0 cltable db 9,8,7,4,2,0clockread: mov si,0 ;si指向'yy/mm/dd hh:mm:ss'的首地址 mov di,0 ;di指向9,8,7,4,2,0的首地址 mov cx,6 ;循環(huán)次數(shù)clockread_s: push cx mov al,cltabledi ;從CMOS中讀出年份的BCD碼 out 70h,al in al,71h mov ah,al ;al中位讀出的數(shù)據(jù) mov cl,4 shr ah,cl ;ah中為年份的十位數(shù) and al,00001111b ;al中為年份的個(gè)位數(shù) add ah

11、,30h ;把數(shù)值轉(zhuǎn)換為對(duì)應(yīng)的ASCII碼 add al,30h ;同上 mov byte ptr cl1si,ah ;把讀出的時(shí)間寫(xiě)入 mov byte ptr cl1si+1,al add si,3 inc di pop cx loop clockread_sclockprint: mov dh,6 mov dl,30 mov bp,0 mov ax,cs mov ds,ax mov cx,3clockprint_s: push cx mov si,clockstrbp mov cl,clockcolor0 ;將顏色值賦值給cl call sys_showstr add bp,2 add

12、dh,2 pop cx loop clockprint_s mov ah,1 ;調(diào)用16h中斷的1號(hào)功能(非阻塞) int 16h cmp al,1bh ;判斷是否為ESC je clockreturn ;若是ESC,回到菜單 cmp ah,3bh ;判斷是否為F1 je changecolor jmp short clockreadclockreturn: call cls mov ah,0 ;16h中斷的1號(hào)功能不會(huì)清除鍵盤(pán)緩沖區(qū),下次讀取還會(huì)讀出 int 16h ;調(diào)用0號(hào)功能清除一次 jmp near ptr menuchangecolor: inc clockcolor mov ah

13、,0 ;16h中斷的1號(hào)功能不會(huì)清除鍵盤(pán)緩沖區(qū),下次讀取還會(huì)讀出 int 16h ;調(diào)用0號(hào)功能清除一次 jmp near ptr clockread;設(shè)置時(shí)鐘sys_setclock: jmp short setclock setclockdata db 'Please input time like "yy/mm/dd hh:mm:ss"',0 setsuccess db 'Set clock successful! Press any key return.',0setclock: call cls mov dh,6 mov dl,20

14、 mov cl,02h mov ax,cs mov ds,ax mov si,offset setclockdata call sys_showstr call getstr call settime mov dh,10 mov dl,20 mov cl,02h mov ax,cs mov ds,ax mov si,offset setsuccess call sys_showstr mov ah,0 int 16h call cls jmp near ptr menu;ds:si指向時(shí)間字符串settime: jmp short seting settable db 9,8,7,4,2,0s

15、eting: mov bx,0 mov cx,6settime_s: mov dh,ds:si inc si mov dl,ds:si add si,2 mov al,30h sub dl,al sub dh,al shl dh,1 shl dh,1 shl dh,1 shl dh,1 or dl,dh mov al,settablebx out 70h,al mov al,dl out 71h,al inc bx loop settime_s ret ;子程序:接收字符串getstr: push axgetstrs: mov ah,0 int 16h cmp al,20h jb nochar

16、 mov ah,0 call charstack mov ah,2 mov dh,8 mov dl,25 call charstack jmp getstrsnochar: cmp ah,0eh je backspace cmp ah,1ch je enter jmp getstrsbackspace: mov ah,1 call charstack mov ah,2 call charstack jmp getstrsenter: mov al,0 mov ah,0 call charstack mov ah,2 call charstack pop ax ret ;子程序:字符串入棧,出棧

17、和顯示;參數(shù):(ah)=功能號(hào),0入棧,1出棧,2顯示; ds:si指向字符棧空間,對(duì)于0號(hào)功能,(al)表示入棧字符; 1號(hào)功能,(al)返回的字符,對(duì)于2號(hào)功能,(dh)(dl)字符串在屏幕顯示的行列位置charstack: jmp short charstart table dw charpush,charpop,charshow top dw 0charstart: push bx push dx push di push es cmp ah,2 ja sret mov bl,ah mov bh,0 add bx,bx jmp word ptr tablebxcharpush: mov

18、 bx,top mov sibx,al inc top jmp sretcharpop: cmp top,0 je sret dec top mov bx,top mov al,sibx jmp sretcharshow: mov bx,0b800h mov es,bx mov al,160 mov ah,0 mul dh mov di,ax add dl,dl mov dh,0 add di,dx mov bx,0charshows: cmp bx,top jne noempty mov byte ptr es:di,' ' mov byte ptr es:di+1,02h

19、jmp sretnoempty: mov al,sibx mov es:di,al mov byte ptr es:di+2,' ' mov byte ptr es:di+1,02h inc bx add di,2 jmp charshowssret: pop es pop di pop dx pop bx ret ;顯示0結(jié)尾的字符串;參數(shù):dh=行號(hào),dl=列號(hào),cl=顏色,ds:si指向字符串首地址sys_showstr: push ax push cx push dx push si push bp push es mov ax,0b800h mov es,ax mov al,80*2 ;80*2*行號(hào) mul dh mov dh,0 add dx,dx ;列號(hào)*2 add ax,dx mov bp,axshowstr_s: mov ch,ds:si cmp ch,0 je showstr_return mov es:bp,ch inc bp mov es:bp,cl inc bp inc si jmp short showstr_sshowstr_return

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論