. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
主题 : :  我的实验16,使用直接定址,不使用ORG  [待解决] 回复[ 9次 ]   点击[ 731次 ]  
bluefish
[帖 主] [ 发表时间:2009-02-19 13:11 ] 
荣誉值:0
信誉值:0
注册日期:2008-12-26 11:18
我看到很多同学的代码,最终为了使代码通过,修改了call word ptr table[bx]这行代码。
个人认为,这句代码才是直接定址的精髓,如果把他改掉,那这个实验就失去了意义。
还有一些同学,使用了ORG,使代码看起来很清爽,但有使用高中的数学方法解小学数学题的嫌疑。

下面是我的代码:(后面的delay子程序是调试时使用的,可以删除)

;名称:    包含多个子功能子程序的中断例程 
;功能:    1.清屏   
;        2.设置前景色   
;        3.设置背景色    
;        4.向上滚动一行 
;参数:    ah传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行 
;         对于2、3号功能,用al传送颜色值,(al)∈{0,1,2,3,4,5,6,7} 

assume cs:code

stack segment
        db 128 dup (0)
stack ends

code segment
                
                ;屏幕设置程序(包括清屏、设置前景色、设置背景色、向上滚动一行四个子程序)
                ;用ah传送调用哪个子程序,用al传递颜色值(设置前景色、设置背景色时才使用)
        setscreen:
                jmp short set
                table dw sub1 , sub2, sub3, sub4
        set:
                push bx
                cmp ah, 3
                ja sret
                mov bl, ah
                mov bh, 0
                add bx, bx
                call word ptr table[bx]
        sret:
                pop bx
                iret
                
        ;清屏
        sub1:
                push bx
                push cx
                push es
                
                mov bx, 0b800h
                mov es, bx
                mov bx, 0
                mov cx, 2000
        s1:
                mov byte ptr es:[bx], ' '
                add bx, 2
                loop s1
                
                pop es
                pop cx
                pop bx
                ret
        
        ;设置前景色
        ;由al传递颜色值
        sub2:
                push bx
                push cx
                push es
                
                mov bx, 0b800h
                mov es, bx
                mov bx, 1
                mov cx, 2000
        s2:
                and byte ptr es:[bx], 11111000b
                or es:[bx], al
                add bx, 2
                loop s2
                
                pop es
                pop cx
                pop bx
                ret

        ;设置背景色
        ;由al传递颜色值
        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
        s3:
                and byte ptr es:[bx], 10001111b
                or es:[bx], al
                add bx, 2
                loop s3
                
                pop es
                pop cx
                pop bx
                ret

        ;向上滚一行
        sub4:
                push cx
                push di
                push si
                push ds
                push es
                
                mov si, 0b800h
                mov ds, si
                mov es, si
                mov si, 160                ;指定源地址
                mov di, 0                ;指定目的地址
                cld                
                mov cx, 24                ;要复制的行数
                
        s4:
                push cx
                mov cl, 160                ;每行的字节数
                rep movsb
                pop cx
                loop s4
                
                mov cx, 80                
                mov si, 0
        s42:
                mov byte ptr es:[160*24+si], ' '
                add si, 2
                loop s42
                
                pop es
                pop ds
                pop si
                pop di
                pop cx
                ret
        setscreenend:
                nop
                
        start:
                mov ax, stack
                mov ss, ax
                mov sp, 128
                
                ;复制新的中断向量处理程序到200h处
                mov ax, cs
                mov ds, ax
                mov si, offset setscreen        ;设置ds:si指向源地址
                
                mov ax, 0
                mov es, ax
                mov di, 200h                                ;设置es:di指向目的地址
                
                mov cx, offset setscreenend - offset setscreen        ;设置复制长度
                cld                                        ;设置复制方向
                rep movsb
                
                ;设置7ch中断向量表
                cli
                mov ax, 0
                mov es, ax
                mov word ptr es:[7ch*4], 0h
                mov word ptr es:[7ch*4+2], 20h
                sti
                
                mov ax, 4c00h
                int 21h
        
        ;延时子程序                
        delay:
                push ax
                push dx
                mov dx, 1000h
                mov ax, 0
                
        ds1:                
                sub ax, 1
                sbb dx, 0
                
                cmp ax, 0
                jne ds1
                cmp dx, 0
                jne ds1
                
                pop dx
                pop ax
                ret
                
code ends
end start
wangjin880
[第6楼] [ 回复时间:2009-11-29 13:51 ] 
荣誉值:0
信誉值:0
注册日期:2009-11-12 15:50
楼主的程序在调用是会不会发生错误,请问楼主是否测试过?
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved