您的位置:首页 > 其它

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

2011-07-27 11:58 405 查看
昨天晚上做的。
实验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呀~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: