汇编学习-实验十六解析

本来按照书上的流程,自己走了一遍,想着是没有问题。可是死活出现不了预想的结果。

在网上查了一下,发现都有这个问题。原因在call word ptr table[bx]这里,对于解析理解的不是很好,只是在setscreen程序之前加上org 200h就可以了。

而org 200的作用是将该指令以后的内容,全部存放在00;[200]起始的位置上。有点纠结。。。

代码如下:

;install int 7ch to realize the test 16
assume cs:code

code segment
start:
	;传递int 7ch位置
	mov ax,0
	mov es,ax
	mov ax,0200h
	mov di,ax
	
	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 word ptr es:[7ch*4],0200h
	mov word ptr es:[7ch*4 +2],0
	
	mov ah,1
	mov al,1
	int 7ch
	
	mov ax,4c00h
	int 21h

	;设置屏幕
org 200h
setscreen:
	jmp short set
	table dw s1,s2,s3,s4
set:
	push bx
	cmp ah,3
	ja setret
	mov bh,0
	mov bl,ah
	add bx,bx
	call word ptr cs:table[bx]
	
	mov ax,4c00h
	int 21h
setret:
	pop bx
	iret		
	;清屏,将显存中所有字符设置为空格符
s1:
	push bx
	push es
	push cx
	
	mov bx,0b800h
	mov es,bx
	mov bx,0
	mov cx,2000
s1s:
	mov byte ptr es:[bx],' '
	add bx,2
	loop s1s

	pop cx
	pop es
	pop bx
	ret
	;设置前景色
s2:
	push bx
	push es
	push cx

	mov bx,0b800h
	mov es,bx
	mov bx,1
	mov cx,2000
	;前景色存放在0,1,2位置,由al决定
s2s:
	and byte ptr es:[bx],11111000b
	or byte ptr es:[bx],al
	add bx,2
	loop s2s
	
	pop cx
	pop es
	pop bx
	ret

	;设置背景色
s3:
	push bx
	push es
	push cx
	
	mov cl,4
	shl al,cl
	mov bx,0b800h
	mov es,bx
	mov bx,1
	mov cx,2000
	;前景色存放在0,1,2位置,由al决定
s3s:
	and byte ptr es:[bx],10001111b
	or byte ptr es:[bx],al
	add bx,2
	loop s3s
	
	pop cx
	pop es
	pop bx
	ret
	;向上滚动一行
s4:
	push bx
	push es
	push cx
	push di
	push si
	
	mov bx,0b800h
	mov es,bx
	mov ds,bx
	mov si,160	;指向第二行
	mov di,0
	mov cx,24	;屏幕共24行
	cld
s4s:
	push cx
	mov cx,160
	rep movsb
	pop cx
	loop s4s
	
	mov si,160*24
	mov cx,80
s4ss:
	mov byte ptr es:[si],' '
	add si,2
	loop s4ss
	
	pop si
	pop di
	pop cx
	pop es
	pop bx
	ret

setscreenend:nop

code ends
end start


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值