汇编语言实验16完整代码及详细解析

汇编语言实验16完整代码及详细解析

建议先自己思考问题的答案,不懂则返回看书

主要考察点:子程序的入口地址怎么确定

实验16安装程序:

assume cs:code
code segment
start:
	mov ax,cs
	mov ds,ax
	mov si,offset setscreen
	mov ax,0
	mov es,ax
	mov di,200h
	cld 
	mov cx,offset setscreenends - offset setscreen
	rep movsb
	
	cli
	mov word ptr es:[7ch*4],200h
	mov word ptr es:[7ch*4+2],0
	sti

	mov ax,4c00h
	int 21h

setscreen:	jmp short set
       table	dw offset sub1 - offset setscreen + 200h
				dw offset sub2 - offset setscreen + 200h
				dw offset sub3 - offset setscreen + 200h
				dw offset sub4 - offset setscreen + 200h
		;setscreen在0:200处,通过上式的计算,可以得到子程序sub(i)入口的地址
set:	
	push bx
	
	cmp ah,3
	ja sret
	mov bl,ah
	mov bh,0
	add bx,bx
	call word ptr cs:[bx+202h]

sret:
	pop bx
	iret

sub1:					;1号子程序
	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:					;2号子程序
	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:					;3号子程序
	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
;	shl al,1
;	shl al,1
;	shl al,1
;	shl al,1
	or es:[bx],al
	add bx,2
	loop sub3s
	pop es
	pop cx
	pop bx
	ret

sub4:					;4号子程序
	push cx
	push si
	push di
	push es
	push ds

	mov si,0b800h
	mov es,si
	mov ds,si
	mov si,160
	mov di,0
	cld
	mov cx,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
setscreenends:
	nop

code ends
end start

实验16测试程序:

assume cs:code
code segment
start:	
	;测试

       	mov ah,1         ;test 2
       	mov al,2
       	int 7ch
        call delay

        mov ah,2         ;test 3
      	mov al,1
      	int 7ch
       	call delay

  
      	mov ah,3	        ;test 4
       	int 7ch
       	call delay 

		mov ah,0         	;test 1,该功能为清屏,所以最后测试该功能
       	int 7ch
        call delay

	mov ax,4c00h
	int 21h

delay:  	
        push cx
        mov cx,30h
    sp0:
       	push cx
        mov cx,0ffffh
     sp1:
       	loop sp1
       	pop cx
       	loop sp0
       	pop cx
       	ret

code ends
end start

此代码在DOSBox下的运行结果截图:(按功能测试顺序)
2号功能: 改变前景色
在这里插入图片描述
3号功能: 改变背景色
在这里插入图片描述

4号功能: 上卷一行
在这里插入图片描述
1号功能: 清屏
在这里插入图片描述
四个功能测试完毕,然后返回dos中。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值