本帖最后由 lanlanlanlanlan 于 2020-3-3 16:50 編輯
如題 一個匯編語言寫的計算機啟動引導程序
基于虛擬機 啟動BIOS 后顯示系統時間
單片機源程序如下:
- org 07c00h ; 告訴編譯器程序加載到7c00處
- mov ax, cs
- mov ds, ax
- mov es, ax
-
- mov ax, BootMessage ;調用固定顯示的字符串內容
-
- mov dx, 0
-
- mov cx, 15 ; 字符串長度長度 對應輸入的內容
- call DispStr ; 開始調用外部程序 調用顯示字符串例程
-
- call TimeDisp ; 系統時間顯示
-
- call Keyboard ; 接受 鍵盤指令程序
- jmp [ DISCUZ_CODE_1 ]nbsp; ; 用于主程序暫停
- ; 以上是基本的啟動引導程序
- DispStr: ;顯示字符子程序
- mov bp, ax ; ES:BP = 串地址 BP堆棧指針寄存器
- mov ax, 01301h ; AH = 13 代表寫字符串, AL = 01h 游標形態
- mov bx, 000ch
-
- int 10h ; 顯示服務
- ret ;子程序返回
-
- NumDis: ;數字顯示子程序
- mov bh, al ; AL 裝的為顯示內容第一步 都是放入堆棧指針 高八位
- AND AL, 0F0H ;與運算 清除低4位
-
- shr al, 4 ;右移位數 0補足 留下
-
- OR AL, 30H ;
-
- mov bl, 0fh
-
- int 10h ;
-
- mov al, bh
-
- AND AL, 0FH
-
- OR AL, 30H
-
- mov bl, 0fh
-
- int 10h
-
- ret
-
- TimeDisp:
- mov ah, 04h ;讀取實時時鐘日期
-
- int 1ah ;執行中斷 獲取日期
-
- mov ah, 0eh
-
- mov al, ch
-
- call NumDis ;顯示century
-
- mov al, cl ;cl 年
-
- call NumDis ; disp 顯示年
-
- mov al, 2fh ;2fh 代表/
-
- int 10h ; 顯示 "/" 分隔符
-
- mov al, dh ; dh 月份
-
- call NumDis ; 顯示月份
-
- mov al, 2fh
-
- int 10h ; 顯示 "/" 分隔符
-
- mov al, dl ;dl 天
-
- call NumDis ; disp 顯示天
-
- mov al, 20h ;空格
-
- int 10h ; 顯示空格
-
-
- ;開始顯示時間
- mov ah, 02h ;設定游標位置
-
- int 1ah ;時鐘服務
-
- mov ah, 0eh ;讀取實時鐘
-
- mov al, ch ; ch存儲時間
-
- call NumDis ;顯示al中的時間
-
- mov al, 3ah ;
-
- int 10h ; disp ":"
-
- mov al, cl ;cl存儲分
-
- call NumDis ; 顯示分
-
- ret ;時間顯示完畢 退出
-
- Namedisp:
- mov ax, MyName
-
- mov dx, 0100h
- mov cx, 6 ; 分對應我的名字長度
-
- call DispStr ;調用字符顯示
- ret
-
-
- Keyboard: ;鍵盤通信
- mov ah, 00h ;讀取字符
-
- int 16h ;鍵盤服中斷
-
- cmp al, 0Dh
-
- je Namedisp
-
- jmp Keyboard
- BootMessage: db "System Time is:" ; 開機后顯示的字符串內容
- MyName: db "xxx xx"
- times 510-($-$) db 0 ; 填充剩下的空間,使生成的二進制代碼恰好為512字節
- dw 0xaa55 ; 結束標志
復制代碼
所有資料51hei提供下載:
system_time.rar
(1.83 KB, 下載次數: 9)
2020-3-3 15:59 上傳
點擊文件名下載附件
|