. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  我的实验16,使用直接定址,不使用ORG  [待解决] 回复[ 9次 ]   点击[ 729次 ]  
bluefish
[帖 主]   [ 发表时间:2009-02-19 13:11 ]   [引用]   [回复]   [ top ] 
荣誉值: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
wsrf
[第1楼]   [ 回复时间:2009-03-02 20:21 ]   [引用]   [回复]   [ top ] 
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01
楼主的程序很清晰,支持一下。
wsrf
[第2楼]   [ 回复时间:2009-03-02 20:21 ]   [引用]   [回复]   [ top ] 
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01
mov word ptr es:[7ch*4], 0h 
mov word ptr es:[7ch*4+2], 20h 
个人感觉这两句是关键。
genius9797
[第3楼]   [ 回复时间:2009-10-04 15:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-09-02 13:42
安装位置0020:0000这样使得偏移地址不会出错对吗?
huibian2009
[第4楼]   [ 回复时间:2009-10-26 15:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-07-06 17:12
mov word ptr es:[7ch*4], 0h 
mov word ptr es:[7ch*4+2], 20h 

楼主能讲讲为什么要这么设置啊?我们不是把程序拷贝到了0:200处了吗?按我们以前学的0:20处应该存放的是中断向量表啊。
xiaoleebaba
[第5楼]   [ 回复时间:2009-10-26 16:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-20 20:08
错!是把程序copy到0020:0000处。这样少了很多换算的麻烦!
wangjin880
[第6楼]   [ 回复时间:2009-11-29 13:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-12 15:50
楼主的程序在调用是会不会发生错误,请问楼主是否测试过?
fyjava
[第7楼]   [ 回复时间:2009-11-29 14:13 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2008-12-24 23:48
;路过 学习
ldlihuanfa
[第8楼]   [ 回复时间:2010-03-12 10:43 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53
我明白了 ,就是0:200和0020:0表示的是同一个起始地址。。。
zhangyuhangk
[第9楼]   [ 回复时间:2010-04-15 11:05 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-04-03 11:10
漂亮!
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved