- [mywiil] 我没用书上的入栈出栈写,就是先看看不用书上的方法能做出来否? ============== 不错 09/19 09:24
- [njutyangxiao] 谢谢你的指导 09/18 17:00
- [younggay] 嗯,应该说理解的没问题。 09/18 15:41
- [njutyangxiao] 检测点16.1的题目是中是这样定义的: a dw 1,2,3,4,5,6,7,8 b dd 09/16 11:23
- [njutyangxiao] 嗯,谢谢指导 09/16 11:22
- [wsrf] assume伪指令指定了段中标号与相应段寄存器的联系。 09/16 09:46
- [wsrf] 没有问题,不过源代码中 a db 1,2,3,4,5,6,7,8 b dw 0 怎么 09/16 09:43
- [njutyangxiao] 谢谢,keep moving! 09/16 09:06
- [njutyangxiao] 谢谢你的指导 09/16 09:05
- [njutyangxiao] 谢谢你的指导 09/16 09:05
[2009-09-14 21:58] 实验15
题目:安装一个新的int9中断例程,功能:在dos下,按下‘A'键后,除非不再松开,如果松开,就显示满屏的'A';其他键照常处理。
源代码:
assume cs:codesg
stacksg segment
db 128 dup(0)
stacksg ends
codesg segment
start:
mov ax,stacksg
mov ss,ax
mov sp,128
;;;;;;;复制int9的中段程序到0000:0204h处
mov ax,0
mov es,ax
mov di,204h;设置es:[di]指向0000:0204h处
mov ax,cs
mov ds,ax
mov si,offset int9;设置ds:[si]指向行的int9中断程序的开始处
mov cx,offset int9end-offset int9;设置cx的循环次数
cld ;设置si、di递增
rep movsb;复制程序到0000:0204开始的地址处
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h];把原来的int9中断例程的入口地址保存到0000:[0200h]开始的两个字单元
cli;屏蔽掉键盘中断,免得引起错误
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0;设置int9的中断向量表项指向新的int9中断程序
sti
mov ax,4c00h
int 21h
;;;;;;;;;;;;;;;;;;新的int9中断程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
int9:
push ax
push bx
push cx
push es
mov ax,0
mov es,ax;设置es的值为0000h
in al,60h;读取所输入的键值
pushf
call dword ptr es:[200h];调用原来的int9中断例程
cmp al,9eh;判断按下的是否是a键
jne int9ret;不是则结束该中断例程
mov ax,0b800h
mov es,ax
mov bx,0;设置es:[bx]指向显存段地址
mov cx,2000
show:
mov byte ptr es:[bx],41h
mov byte ptr es:[bx+1],2h
add bx,2
loop show;显示满屏的A
int9ret:
pop es
pop cx
pop bx
pop ax
iret
int9end:nop
codesg ends
end start
源代码:
assume cs:codesg
stacksg segment
db 128 dup(0)
stacksg ends
codesg segment
start:
mov ax,stacksg
mov ss,ax
mov sp,128
;;;;;;;复制int9的中段程序到0000:0204h处
mov ax,0
mov es,ax
mov di,204h;设置es:[di]指向0000:0204h处
mov ax,cs
mov ds,ax
mov si,offset int9;设置ds:[si]指向行的int9中断程序的开始处
mov cx,offset int9end-offset int9;设置cx的循环次数
cld ;设置si、di递增
rep movsb;复制程序到0000:0204开始的地址处
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h];把原来的int9中断例程的入口地址保存到0000:[0200h]开始的两个字单元
cli;屏蔽掉键盘中断,免得引起错误
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0;设置int9的中断向量表项指向新的int9中断程序
sti
mov ax,4c00h
int 21h
;;;;;;;;;;;;;;;;;;新的int9中断程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
int9:
push ax
push bx
push cx
push es
mov ax,0
mov es,ax;设置es的值为0000h
in al,60h;读取所输入的键值
pushf
call dword ptr es:[200h];调用原来的int9中断例程
cmp al,9eh;判断按下的是否是a键
jne int9ret;不是则结束该中断例程
mov ax,0b800h
mov es,ax
mov bx,0;设置es:[bx]指向显存段地址
mov cx,2000
show:
mov byte ptr es:[bx],41h
mov byte ptr es:[bx+1],2h
add bx,2
loop show;显示满屏的A
int9ret:
pop es
pop cx
pop bx
pop ax
iret
int9end:nop
codesg ends
end start
评论次数(2) |
浏览次数(625) |
类型(汇编作业) |
收藏此文 |