. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  exam16  [已解决] 回复[ 5次 ]   点击[ 483次 ]  
jjch224
[帖 主]   [ 发表时间:2010-08-23 11:31 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
;p297
;实现一个子程序 setscreen,为显示输出提供以下功能:
;1 清屏; 2 设置前景色 3设置背景色 4 向上滚动一行
assume cs:code
code segment
start:
        mov ax,cs
        mov ds,ax
        mov si,offset int7ch
        
        mov ax,0
        mov es,ax
        mov di,200h
        
        mov cx,offset int7chend-int7ch
        cld
        rep movsb;拷贝程序到0:200处
        
        mov word ptr es:[7ch*4],200h;设置中断向量
        mov word ptr es:[7ch*4+2],0
        
        mov ax,0103h;测试结果
        int 7ch
        
        mov ax,4c00h
        int 21h

int7ch:        jmp short set
table dw sub1+200h-2dh,sub2+200h-2dh,sub3+200h-2dh,sub4+200h-2dh        ;2dh是(start:)-(jmp short set)
set:        push bx                                                                ;的长度,
        cmp ah,3
        ja sret
        mov bl,ah
        mov bh,0
        add bx,bx        
        add bx,202h;相对的偏移量
        sub bx,2fh;
        call word ptr table[bx];编译为call cs:[bx+2fh]
sret:        pop bx
        iret
;-------------sub_pro---------
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],'1'
        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 byte ptr 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 byte ptr 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 ds,si
        mov es,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 ds:[160*24+si],' '
        add si,2
        loop sub4s1
        
        pop ds
        pop es
        pop di
        pop si
        pop cx        
        ret
int7chend:nop
code ends
end start
jjch224
[第1楼]   [ 回复时间:2010-08-23 11:44 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
改进后的程序:
;p297
;实现一个子程序 setscreen,为显示输出提供以下功能:
;1 清屏; 2 设置前景色 3设置背景色 4 向上滚动一行
assume cs:code
code segment
start:
        mov ax,cs
        mov ds,ax
        mov si,offset int7ch
        
        mov ax,0
        mov es,ax
        mov di,200h
        
        mov cx,offset int7chend-int7ch
        cld
        rep movsb;拷贝程序到0:200处
        
        mov word ptr es:[7ch*4],200h;设置中断向量
        mov word ptr es:[7ch*4+2],0
        
        mov ax,0103h;测试结果
        int 7ch
        
        mov ax,4c00h
        int 21h

int7ch:        jmp short set
table dw sub1+200h-offset int7ch,sub2+200h-offset int7ch,sub3+200h-offset int7ch,sub4+200h-offset int7ch;2dh是(start:)-(jmp short set)
set:        push bx                                                                ;的长度,
        cmp ah,3
        ja sret
        mov bl,ah
        mov bh,0
        add bx,bx        
        add bx,202h;相对的偏移量
        sub bx,offset table;
        call word ptr table[bx];编译为call cs:[bx+2fh]
sret:        pop bx
        iret
;-------------sub_pro---------
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],'1'
        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 byte ptr 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 byte ptr 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 ds,si
        mov es,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 ds:[160*24+si],' '
        add si,2
        loop sub4s1
        
        pop ds
        pop es
        pop di
        pop si
        pop cx        
        ret
int7chend:nop
code ends
end start
jjch224
[第2楼]   [ 回复时间:2010-08-23 14:47 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
说明:
1.call word ptr table[bx];即call word ptr cs:0[table+bx],table在复制到0:200内存区的时候编译为偏移地址2fh,而不是0,所以,要在前面先做sub bx,offset table操作。
2.同理,假设在复制到0:200内存区的后子程标号为sub11,则sub11-200h=sub1-offset int7ch,即
sub11=200h+sub1-offset int7ch。
我的理解就是,编译后只有地址,没有标号。
jjch224
[第3楼]   [ 回复时间:2010-08-23 15:12 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
另外:sub bx,offset table; 这里的offset不能省略,否则就变成了cs:0[table],也就是cs:[2f],offset  table编译为2f。
jjch224
[第4楼]   [ 回复时间:2010-08-23 15:17 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
总结:数据标号作为偏移地址在定义的时候可以省略offset,在程序操作语句中不能省略。举例如下:
table dw a,b(假如table地址为2fh)
mov ax,table;此句相当于mov ax,[2f]
mov ax,offset table;此句相当于mov ax,2fh
jjch224
[第5楼]   [ 回复时间:2010-09-01 10:06 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
此贴由 贴主 于 [ 2010-09-01 10:06 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved