. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
主题 : :  完成试验16啦,测试通过  [待解决] 回复[ 15次 ]   点击[ 1466次 ]  
lloveasm
[帖 主] [ 发表时间:2008-09-16 09:00 ] 
荣誉值:18
信誉值:0
注册日期:2008-08-31 11:07
assume cs:code
stack segment
    db 128 dup(0)
stack ends
code segment
start:  mov ax, stack
        mov ss, ax
        mov sp, 128 

        mov ax, cs
        mov ds, ax
        mov si, offset setscreen
        mov ax, 0
        mov es, ax
        mov di, 200h
        mov cx, offset setscreenend - offset setscreen
        cld
        rep movsb

        mov ax, 0
        mov es, ax
        mov word ptr es:[7ch*4], 0h
        mov word ptr es:[7ch*4+2], 20h 

        mov ax, 4c00h
        int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;屏幕设置
setscreen:  jmp short set           ;安装后这条语句地址是0020:0000,下一条0020:0002
table:     dw offset sub1 - offset setscreen, offset sub2 - offset setscreen, offset sub3 - offset setscreen, offset sub4 - offset setscreen
set:        push bx
            cmp ah, 3
            ja sret
            mov bl, ah
            mov bh, 0
            add bx, bx                  ;bx是偏移地址
            call word ptr cs:2h[bx]     ;即0020:(0002+bx)
sret:       pop bx
            iret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;清屏
sub1:   push bx
        push cx
        push es
        mov bx, 0b800h
        mov es, bx
        mov bx, 0
        mov cx, 2000
sub1s:  mov byte ptr es:[bx], ' '
        add bx, 2
        loop sub1s
        pop es
        pop cx
        pop bx
        ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;设置前景色
sub2:   push bx
        push cx
        push es
        mov bx, 0b800h
        mov es, bx
        mov bx, 1
        mov cx, 2000
sub2s:  and byte ptr es:[bx], 11111000b
        or es:[bx], al
        add bx, 2
        loop sub2s
        pop es
        pop cx
        pop bx
        ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;设置背景色
sub3:   push bx
        push cx
        push es
        mov cl, 4
        shl al, cl
        mov bx, 0b800h
        mov es, bx
        mov bx, 1
        mov cx, 2000
sub3s:  and byte ptr es:[bx], 10001111b
        or es:[bx], al
        add bx, 2
        loop sub3s
        pop es
        pop cx
        pop bx
        ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;向上滚动一行
sub4:   push cx
        push si
        push di
        push es
        push ds

        mov si, 0b800h
        mov es, si
        mov ds, si
        mov si, 160
        mov di, 0
        cld
        mov cx, 24
sub4s:  push cx
        mov cx, 160
        rep movsb
        pop cx
        loop sub4s
        mov cx, 80
        mov si, 0
sub4s1: mov byte ptr [160*24+si], ' '
        add si, 2
        loop sub4s1
        pop ds
        pop es
        pop di
        pop si
        pop cx
        ret
setscreenend: nop
code ends
end start
programmer
[第3楼] [ 回复时间:2008-10-10 11:35 ] 
荣誉值:0
信誉值:2
注册日期:2008-09-10 20:50
mov word ptr es:[7ch*4], 0h 
mov word ptr es:[7ch*4+2], 20h  
中断例程入口地址为什么要这样写?
写成   mov word ptr es:[7ch*4], 200h
      mov word ptr es:[7ch*4+2], 0h 
      为什么不行?
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved