昨天晚上做的。
实验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呀~