汇编网首页登录博客注册
proctiv的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
文章收藏
友情链接

[2007-11-12 15:34] 检测点15.1

1、程序可以精简为
pushf
call dword ptr ds:[0]

2、
程序有两处设置int9中断例程的段地址和偏移地址,分别是在将int9中断例程设置为自己编写的中断例程和程序最后恢复原来的int9中断例程。为了防止在设置段地址和偏移地址指令间时发生键盘输入,产生错误,需要在设置前将IF标志位清0,设置完成后设为1就可以了。
程序改写如下:

assume cs:code

stack segment
    db 128 dup (0)
stack ends

data segment
    dw 0,0
data ends

code segment
start:
    mov ax,stack
    mov ss,ax
    mov sp,128

    mov ax,data
    mov ds,ax

    mov ax,0
    mov es,ax

    push es:[9*4]
    pop ds:[0]
    push es:[9*4+2]
    pop ds:[2]

    cli                        ;需要屏蔽掉键盘中断
    mov word ptr es:[9*4],offset int9
    mov es:[9*4+2],cs
    sti

    mov ax,0b800h
    mov es,ax
    mov ah,'a'
s:
    mov es:[160*12+40*2],ah
    call delay
    inc ah
    cmp ah,'z'
    jna s
    mov ax,0
    mov es,ax

    cli                 ;需要屏蔽掉键盘中断
    push ds:[0]
    pop es:[9*4]
    push ds:[2]
    pop es:[9*4+2]
    sti

    mov ax,4c00h
    int 21h

delay:
    push ax
    push dx
    mov dx,1000h
    mov ax,0
s1:
    sub ax,1
    sbb dx,0
    cmp ax,0
    jne s1
    cmp dx,0
    jne s1
    pop dx
    pop ax
    ret

int9:
    push ax
    push bx
    push es

    in al,60h

    pushf
    pushf
    pop bx
    and bh,11111100b
    push bx
    popf
    call dword ptr ds:[0]

    cmp al,1
    jne int9ret

    mov ax,0b800h
    mov es,ax
    inc byte ptr es:[160*12+40*2+1]

int9ret:
    pop es
    pop bx
    pop ax
    iret


code ends
end start
评论次数(1)  |  浏览次数(538)  |  类型(汇编作业) |  收藏此文  | 

[  qingqingziyin   发表于  2007-11-12 19:02  ]

不错

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码