📄 delay.asm
字号:
;/*---------------------------*/
;数据段定义
data segment ;数据定义段
assume ds:data ;建立数据段寄存器寻址
msg_1 db 'I love you ''ASM'' from the bottom of my heart! $',0dh,0ah ;定义字节
msg_2 db 0dh,0ah,'In this OS. I''l use lookup table to display number''s square$'
msg_3 db 0dh,0ah,' $'
table db 1,2,3,4,5,6,7,8,9 ;数据加1
data ends ;数据定义段结束
;/*---------------------------*/
;/*---------------------------*/
;代码段定义
code segment ;代码定义段
assume cs:code ;建立代码段寄存器寻址
;/*---------------------------*/
;/*---------------------------*/
;字符显示
show macro str ;宏定义,输入参数:字符串str
lea dx,str ;装入str的有效地址
mov ah,09h ;调用中断21,09h显示字符串
int 21h
endm ;宏定义结束
;/*---------------------------*/
;/*---------------------------*/
;主函数
main proc far ;主函数过程定义
mov ax,data ;取数据段地址
mov ds,ax ;装载数据段寄存器ds,使之指向当前数据段
call set_video ;设置显示模式
show msg_1 ;调用宏,显示字符串
show msg_2
show msg_3
;/*---------------------------*/
;/*---------------------------*/
;按键扫描
key_scan:
mov ah, 0 ;利用bios的16号中断,扫描键盘按键
int 16h ;AL中返回按键的ASCII码,AH中返回按键的扫描码
cmp al, 0dh ;判断是否为Enter键
jz exit ;是回车键就退出
cmp al, 1bh ;判断是否为Esc键
jz exit ;是退出键就退出
and ax,000fh ;取低四位
mov bx,ax
mov al,table[bx] ;取得对应数组下标值的值
mov ah,02h ;21号中断,02h输出字符
add al,48 ;转换为字符的ASCII码
mov dl,al ;dl要显示的字符
int 21h
show msg_3
call beep
jmp key_scan ;否则继续扫描
;/*---------------------------*/
;/*---------------------------*/
;退出
exit:
mov ah,4ch ;调用中断21,4ch退出系统
int 21h
;/*---------------------------*/
;/*---------------------------*/
main endp ;主函数过程结束
;/*---------------------------*/
;/*---------------------------*/
;固定频率响
beep proc near
mov ax,1200
out 42h,al ;输出频率值,低8位
mov al,ah
out 42h,al ;输出频率值,高8位
in al,61h ;开启定时器
or al,03h
out 61h,al
mov ah,00h ;取时钟计数值
int 1ah
mov al,9 ;9.1次为0.5秒
cbw ;al值转为16位ax
add ax,dx ;加上当前时钟计数值,得到计数终值
mov bx,ax ;计数终值置入bx
delay: mov ah,00h
int 1ah ;取时钟计数值
cmp bx,dx ;到终值吗?
jnz delay ;未到,继续延时
in al,61h ;关闭定时器
and al,0fch
out 61h,al
ret
beep endp
;/*---------------------------*/
;/*---------------------------*/
;设置彩色显示模式
set_video proc near
mov ah,00 ;320*200彩色屏幕
mov al,04
int 10h
mov ah,0bh ;背景色
mov bh,00
mov bl,1
int 10h
ret
set_video endp
;/*---------------------------*/
;/*---------------------------*/
code ends ;代码段结束
end main ;主程序结束
;/*---------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -