|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本人看完了小甲鱼的汇编视频教程,现在正在做课程设计2,可是碰到 一个问题,困扰了好几天:
就是课程设计2中的3号选项 clock子程序,有两个问题:
1.为啥我的程序运行的时间是静止的(在VMware中),不按秒变化?但是我将子程序单独提出来运行是可以按秒变化的
2、把子程序提出来,为什么键盘中断那个地方不能正确的保存原来int9中断的地址呢?(debug下0200处保存地址不是int9的地址)
下附代码:(附件是完整的程序,望大神赐教)
myos.rar
(1.86 KB, 下载次数: 3)
;子程序3 显示当前时间
;参数:无
;返回:无
sub3_time_save:
db '00/00/00 00:00:00',0
cmos_port db 9,8,7,4,2,0
sub3:
push cs
pop ds
mov si,offset sub3_int9_start
mov ax,0
mov es,ax
mov di,0204H
mov cx,offset sub3_int9_end - offset sub3_int9_start
cld
rep movsb
push es:[9*4]
pop es:[200H]
push es:[9*4+2]
pop es:[202H]
cli
mov ax,0204H
mov es:[9*4],ax
mov ax,0
mov es:[9*4+2],ax
sti
call clearScreen
sub3_dis_time_loop:
mov cx,6
mov si,0
mov di,offset sub3_time_save
sub_3_dis_port_loop:
mov al,cmos_port[si]
call sub_cmos
mov ds:[di],ax
inc si
add di,3
loop sub_3_dis_port_loop
mov si,offset sub3_time_save
mov ah,3
mov al,5
call printString
jmp sub3_dis_time_loop
;键盘中断
sub3_int9_start:
push ax
push bx
push cx
push es
in al,60H
;调用原中断,已经不能使用int来调用原来的中断了
pushf
call word ptr cs:[200H]
cmp al,3BH
je sub3_int9_choise1
cmp al,01H
je sub3_int9_choise2
jmp sub3_int9_ret
sub3_int9_choise1:
mov ax,0B800H
mov es,ax
mov bx,1
mov cx,2000
sub3_loop_s:
inc byte ptr es:[bx]
add bx,2
loop sub3_loop_s
sub3_int9_choise2:
;退回操作系统选单
;恢复原来的中断
cli
mov ax,0
mov ds,ax
mov es,ax
push ds:[200H]
pop es:[9*4]
push ds:[202H]
pop es:[9*4+2]
;mov word ptr es:[9*4],ds:[200H]
;mov word ptr es:[9*4+2],ds:[202H]
sti
pop es
pop cx
pop bx
pop ax
pop ax
mov bx,1000H
push bx
mov bx,0
push bx
push ax
iret
sub3_int9_ret:
pop es
pop cx
pop bx
pop ax
iret
sub3_int9_end:
nop
|
|