. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  第二版P280页的例子为什么不行呢  [待解决] 回复[ 3次 ]   点击[ 350次 ]  
rclijia
[帖 主]   [ 发表时间:2008-09-16 11:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-07-14 15:27
就是按“ESC”键改变字符颜色的那个程序,我在纯DOS下运行的,为什么不行啊?!
难道例子中有错误??
musicvs
[第1楼]   [ 回复时间:2008-09-16 16:54 ]   [引用]   [回复]   [ top ] 
荣誉值:56
信誉值:14
注册日期:2008-08-20 11:21
我在虚拟机上面试,也不行,不知道为什么~正想发帖问问呢~呵呵
不知道其他朋友是怎么运行的?
musicvs
[第2楼]   [ 回复时间:2008-09-16 18:30 ]   [引用]   [回复]   [ top ] 
荣誉值:56
信誉值:14
注册日期:2008-08-20 11:21
呵呵~原来我有个地方写错了~照抄都错~郁闷呢....
你试试看这个能不能运行,是在课件里找的:

;编程:在屏幕中间依次显示“a”~“z”,并可以让人看清。在显示的过程中,按下'Esc'键后,改变显示的颜色。

;完整功能代码:

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]                ;将原来的int 9中断例程的入口地址保存在ds:0、ds:2单元中

        mov word ptr es:[9*4],offset int9
        mov es:[9*4+2],cs        ;在中断向量表中设置新的int 9中断例程的入口地址

        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

        push ds:[0]
        pop es:[9*4]
        push ds:[2]
        pop es:[9*4+2]           ;将中断向量表中int 9中断例程的入口恢复为原来的地址

        mov ax,4c00h
        int 21h

delay:        push ax
        push dx
        mov dx,2000h
        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

;------以下为新的int 9中断例程--------------------

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]         ;对int指令进行模拟,调用原来的int 9中断例程

        cmp al,1
        jne int9ret

        mov ax,0b800h
        mov es,ax
        inc byte ptr es:[160*12+40*2+1]  ;属性增加1,改变颜色

int9ret:pop es
        pop bx
        pop ax
        iret

code ends
end start
rclijia
[第3楼]   [ 回复时间:2008-09-22 16:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-07-14 15:27
搞定了
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved