王爽《汇编语言》实验9

来源:互联网 发布:开机还原软件 编辑:程序博客网 时间:2024/05/06 17:11

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

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

 

;在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串'My name is kevin!'assume cs:codedata segmentdb 'My name is kevin!',0 ;以0结尾,方便遍历这个字符串;db 'My',0 ;查找bug时为了减少遍历,把这个字符串长度减少了db 01110001b,10000010b,00100100bdata endsstack segmentdb 10h dup (0)stack endscode segmentstart:mov ax,datamov ds,axmov bx,0;设置栈mov ax,stackmov ss,axmov sp,10h;设置显示的行号mov dh,10mov di,0mov cx,3;有三种颜色需要显示s0:push cxmov si,0s:  mov ch,0mov cl,[bx+si];当找到0表示字符串结束了jcxz okpush bx;因为把bx作为了临时的它用寄存器,先入栈;定义一个函数类似的。让字符及属性在ax中.(al:字符  ah:属性),让dx存放位置(dh存放行号,dl存放列数)mov ax,cx;mov ah,0CAh;这里代表颜色mov ah,[bx].12h[di]push ax;将参数1入栈mov dl,30add dx,si;虽然使用dx,其实只想数据加到dl中,应该是如所愿的吧push dx;将参数2入栈;计算目标存储位置(偏移为:(行号-1)*A0+(列号-1)*2)pop dxmov al,dhdec almov ah,0A0hmul ahmov bx,ax;将结果先存到bx中mov al,dlmov ah,0dec alshl al,1add bx,axmov ax,0B800hmov es,ax;pop dx;这个好像没用pop ax;这个是要复制过去的字mov word ptr es:[bx], ax;将字复制过去pop bxinc sijmp short sok:pop cxinc diinc dhloop s0    mov ax,04c00hint 21hcode endsend start


 

结果:

 

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

原创粉丝点击