【8086汇编】使用代码的直接定址表解决问题

1.问题

在这里插入图片描述

2.思路

在这里插入图片描述
在这里插入图片描述

3.代码

assume cs:codesg
codesg segment
main:mov ah,1				;传递功能序号
   	mov al,2				;传送颜色值
	call setscreen
	mov ax,4c00h
	int 21h

setscreen:
	jmp short set
	table dw sub1,sub2,sub3,sub4

    set:mov bx,0b800H
	mov es,bx				;附加寄存器保存显示器段地址
	dec ah				
	add ah,ah				;因为table表是dw,2个字节
    mov bl,ah
	mov bh,0
	call table[bx]			;调用table表中子程序的IP偏移地址


;功能4:向上滚动一行
sub4:push cx
   	push es
	push ds
	push si
	push di
	mov si,0b800H
	mov es,si
	mov di,0			;目标地址es:di,第一行开始
	mov ds,si	
	mov si,160			;源地址ds:si,第二行开始
	cld					;将方向标志DF clear零,也就是si、di递增
	mov cx,24			;显示器总共25行。循环24次,将所有行都向上移动一行。
	
 s4:push cx
	mov cx,80			;每行160个字节,每次串复制一个word(2个字节),需要循环80次
	rep movsw			;重复执行rep后的串处理指令,按word长度执行,知道cx递减到0。因为是word,每次循环si、di都会加2
	pop cx
	loop s4

	;最后一行清零
	mov cx,80
	mov si,0
 s5:mov byte ptr es:[160*24+si],' '
    add si,2
	loop s5

   	pop di
	pop si
	pop ds
	pop es
	pop cx
	ret


;功能2:设置前景色
sub2:push bx
	push cx
   	push es
	mov cx,2000						;循环次数
	mov bx,1
s2:and byte ptr es:[bx],11111000b	;显示器内存单元中高字节放显示的字符的属性(前景和背景RGB等)
    or es:[bx],al					;设置前景色RGB为2(0010),也就是绿色
	add bx,2
	loop s2
	pop es
	pop cx
	pop bx
   	ret

;功能1:清屏
sub1:push bx
	push cx
   	push es
	mov cx,2000					;循环次数
	mov bx,0
 s1:mov byte ptr es:[bx],' '	;显示器内存单元中低字节放显示的字符,高字节放显示的字符的属性(前景和背景RGB等)
	add bx,2
	loop s1
	pop es
	pop cx
	pop bx
   	ret


;功能3:设置背景色
sub3:push bx
	push cx
   	push es
	mov cl,4
	shl al,cl						;al逻辑左移4位
	mov cx,2000
	mov bx,1
 s3:and byte ptr es:[bx],10001111b	;显示器内存单元中高字节放显示的字符的属性(前景和背景RGB等)
    or es:[bx],al					;设置背景色RGB为2(0010),也就是绿色
	add bx,2
	loop s3
	pop es
	pop cx
	pop bx
   	ret

codesg ends
end main

4.运行程序

功能2:设置前景色为绿色

在这里插入图片描述
在这里插入图片描述

功能3:设置背景色为蓝色

在这里插入图片描述
在这里插入图片描述

5.直接定址表的优势

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值