王爽 《汇编语言》 实验16 将含有直接定址表的程序,安装到中断上

时间:2021-10-05 19:27:01

昨天晚上做的。

实验16的内容是要求把16.4的程序,安装到0:200H中,

以便给 int 7cH调用。

 

做这个程序的时候,我没有照抄16.4,而是凭借着看过两三遍的印象,

用作者的思路把实验16完成的。

 

本来以为难点无非就是实现功能,把程序安装到0:200H上有啥难的?

结果我发现我错了。实现功能别说书上有例子,即使没有例子也并不困难。

难点就是直接定址表安装到0:200H处,会有许多偏移地址的问题。

 

比如当 table在自己所写的程序中,距离 CS的 OFFSET是 abH,

当它安装到 0:200H处,

由于偏移地址发生了变化,

调用表里面的 内容所代表的子程序,就不是 一个 TABLE[BX]这么简单了

 

 

今天活比较多,不多说了,趁打版本的时候上程序~

assume cs:code

code segment

start:mov ax,0;mov func to 0:200H
mov es,ax
mov di,200H
mov ax,cs
mov ds,ax
mov si,offset func
mov cx,offset funcend - offset func
cld
rep movsb

mov ax,0
mov es:[7cH*4+2],ax
mov ax,200H
mov es:[7cH*4],ax

mov ah,2
mov al,00000011B;0~7
;call func;for test
int 7cH

mov ax,4c00H
int 21H

;------------------------------------------------
;USING TABLE ,GOTO SUB FUNCTION
;ah:0,1,2,3 select sub function
;al:0~7 color
;------------------------------------------------
func:push bx
push ss
push dx
push es
jmp short sta

table dw func1-func+200H,func2-func+200H,func3-func+200H,func4-func+200H

sta:mov bl,ah
mov bh,0
add bx,bx

sub bx,offset func;to adjust offset table & 0:200H
add bx,200H
call table[bx]

pop es
pop dx
pop ss
pop bx
;ret
iret

;------------------------------------------------
;CLEAR SCREEN
;------------------------------------------------
func1:push ax
push es
push si
push cx

mov ax,0b800H
mov es,ax
mov si,0

mov cx,2000
func1s:mov byte ptr es:[si],' '
add si,2
loop func1s

pop cx
pop si
pop es
pop ax
ret

;------------------------------------------------
;CHANGE BACKCOLOR
;al:color
;------------------------------------------------
func2:push ax
push es
push si
push cx

push ax
mov ax,0b800H
mov es,ax
mov si,1
pop ax
mov cl,4
shl al,cl

mov cx,2000
func2s:and byte ptr es:[si],10001111B
or byte ptr es:[si],al
add si,2
loop func2s

pop cx
pop si
pop es
pop ax
ret

;------------------------------------------------
;CHANGE FORECOLOR
;al:color
;------------------------------------------------
func3:push ax
push es
push si
push cx

push ax
mov ax,0b800H
mov es,ax
mov si,1
pop ax

mov cx,2000
func3s:and byte ptr es:[si],11111000B
or byte ptr es:[si],al
add si,2
loop func3s

pop cx
pop si
pop es
pop ax
ret

;------------------------------------------------
;SCROLL UP ONE LINE
;------------------------------------------------
func4:push ax
push ds
push si
push es
push di
push cx

mov ax,0b800H
mov ds,ax
push ds
pop es
mov si,160; line 2-->line 1
mov di,0

mov cx,24
fn4s3:push cx
mov cx,80
func4s:mov al,ds:[si]
mov es:[di],al
add si,2
add di,2
loop func4s
pop cx
loop fn4s3

mov si,160*24
mov cx,80
func4s2:mov byte ptr es:[si],' '
add si,2
loop func4s2


pop cx
pop di
pop es
pop si
pop ds
pop ax
ret

funcend:nop

code ends

end start


 

重点是 直接定址表的偏移,确定CS:IP

 

最近一直辛苦小静静乐,谢谢温柔贤惠懂事漂亮可爱的傻帽小静静,给我提供了安稳的环境。

不过得批评一下小静静,晚上老布早睡觉!

不知道我这电脑啥时候好,电脑好了陪小静静WOW呀~