王爽《汇编语言》实验9

很奇怪仍然有些小问题,在屏幕上只显示了一行字符,没有按我想的显示三行不同颜色的字符。。。

本来想问别人的,想想自己的事情自己办,又单步跟踪了下,终于发现,另一个循环没有把si置0

 

;在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串'My name is kevin!'

assume cs:code

data segment
	db 'My name is kevin!',0 ;以0结尾,方便遍历这个字符串
	;db 'My',0 ;查找bug时为了减少遍历,把这个字符串长度减少了
	db 01110001b,10000010b,00100100b
data ends

stack segment
	db 10h dup (0)
stack ends

code segment
	start:mov ax,data
	mov ds,ax
	mov bx,0

	;设置栈
	mov ax,stack
	mov ss,ax
	mov sp,10h

	;设置显示的行号
	mov dh,10
	mov di,0

	mov cx,3;有三种颜色需要显示
s0:
	push cx

	mov si,0
s:  mov ch,0
	mov cl,[bx+si]	;当找到0表示字符串结束了
	jcxz ok

	push bx	;因为把bx作为了临时的它用寄存器,先入栈

	;定义一个函数类似的。让字符及属性在ax中.(al:字符  ah:属性),让dx存放位置(dh存放行号,dl存放列数)
	mov ax,cx
	;mov ah,0CAh	;这里代表颜色
	mov ah,[bx].12h[di]
	push ax	;将参数1入栈

	mov dl,30
	add dx,si;虽然使用dx,其实只想数据加到dl中,应该是如所愿的吧
	push dx	;将参数2入栈


	;计算目标存储位置(偏移为:(行号-1)*A0+(列号-1)*2)

	pop dx
	mov al,dh
	dec al
	mov ah,0A0h
	mul ah
	mov bx,ax	;将结果先存到bx中

	mov al,dl
	mov ah,0
	dec al
	shl al,1

	add bx,ax

	mov ax,0B800h
	mov es,ax
	;pop dx	;这个好像没用
	pop ax	;这个是要复制过去的字
	mov word ptr es:[bx], ax	;将字复制过去
	pop bx

	inc si
	jmp short s

ok:	pop cx
	inc di
	inc dh
	loop s0

    mov ax,04c00h
	int 21h


code ends

end start


 

结果:

 

小备注:其实是有三行展示的,中间那行是闪烁的,在截图时它闪没了,所以看起来是两行。。。嘿嘿。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值