汇编语言 实验16 直接定址表

安装程序:

assume cs:codesg

codesg segment
start:
	   ;安装中断处理程序内容
	   mov ax,0
	   mov es,ax
	   mov di,200h
	   mov ax,cs
	   mov ds,ax
	   mov si,offset setscreen
	   mov cx,offset setscreenend- offset setscreen
           cld
	   rep movsb
       ;设置中断向量表
	   mov ax,0
	   mov es,ax
	   mov es:[01F0h],0200h
	   mov word ptr es:[01F2h],0
	   mov ax,4c00h
	   int 21h
	   ;中断处理程序

setscreen: jmp short set
     dw  sub1-setscreen+200h
     dw  sub2-setscreen+200h
     dw  sub3-setscreen+200h
     dw  sub4-setscreen+200h
   set:    push bx
        cmp ah,3        ;判断功能号是否大于3
        ja sret
        mov bl,ah
        mov bh,0
        add bx,bx       ;根据ah中的功能号计算对应子程序在地址表中的偏移
        call word ptr cs:[bx+202h]     ;调用对应的功能子程序
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      ;ds:si指向第 n+1 行
        mov di,0        ;es:di指向第 n 行
        cld
        mov cx,24       ;共复制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
codesg ends
end start

本题不需要使用有标号的直接定址表,因为在安装程序中用直接定址表所定义的子程序入口地址,这是个绝对地址,安装到另外的地址空间中,原来的入口地址便不再适用了,定址表开头的标号,代表的是原来安装程序中表的偏移地址,到新的地址空间后,这个标号就和原来的段地址、偏移地址都失去了关联。因此,直接在新程序中写一段地址表,然后直接call新的CS:偏移地址即可

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值