本帖最后由 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)
|