|
主题 : : 课程设计1颜色问题 [已解决] |
回复[ 4次 ]
点击[ 349次 ] | |
荣誉值:0
信誉值:2
注册日期:2012-03-25 13:34 |
今天编写了课程设计1的显示代码,在debug中运行是正确的,但是我设置的显示颜色是绿色,运行完后,只要不退出debug,所有的显示就都是绿色了,这是为什么?请高手帮忙,感激不尽。代码如下:
assume cs:codesg,ds:datasg,ss:stack
datasg segment
db 16 dup(0);用于存放显示用的字符串
db '1975','1976','1977','1978','1979'
db '1980','1981','1982','1983','1984','1985','1986','1987','1988','1989'
db '1990','1991','1992','1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
datasg ends
stack segment
dw 16 dup(0)
stack ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,32
mov dh,4;显示从第五行开始
mov si,0
mov bx,0
mov bp,0
mov cx,21;进行21此循环
s: push cx
mov cl,2;设置字体颜色为绿色
mov dl,0;从0列开始显示年份
mov ax,[bx+si+16];取19
mov [si],ax
mov ax,[bx+si+18];取75-95
mov [si+2],ax
mov al,0
mov [si+4],al;设置最后一个byte为0
call show_str;调用显示子程序
add dl,20;从第20列开始显示收入
push dx
mov ax,[bx+si+100];收入
mov dx,[bx+si+102];收入
call ldtoc;调用字符串转换子程序
pop dx
call show_str;转换成字符串后调用显示子程序
add dl,20;从第40列开始显示人数
push dx
mov dx,0
mov ax,ds:[bp+si+184];设置dx,ax
call ldtoc;设置好后调用字符串转换子程序
pop dx
call show_str;转换成字符串后调用显示子程序
add dl,20;从第60列开始显示平均数
push dx
mov ax,[bx+si+100]
mov dx,[bx+si+102];设置dx,ax
div word ptr ds:[bp+si+184];调用除法ax存放平均值
mov dx,0
call ldtoc;设置好后调用字符串转换子程序
pop dx
call show_str;转换成字符串后调用显示子程序
inc dh;取下一行
add bx,4;对于年份和收入,取下一个数据
add bp,2;对于人数取下一个数据
pop cx
loop s
mov ax,4c00h
int 21h
ldtoc: push cx
push dx
push si
push ax
mov cx,0
push cx;先入栈一个0作为结束标志
ldtoc1: mov cx,10;除数为10
call divdw;做不会溢出的除法运算
add cx,30h;cx存放余数,加30h为其对应ascii码
push cx;要显示的余数ascii码入栈
mov cx,dx
jcxz ldtoc2;判断高16位是否为0 ,为0转入ldtoc2
jmp short ldtoc1;不为0继续除以10
ldtoc2: mov cx,ax
jcxz ldtoc3;判断低16位是否为0,为0转入ldtoc3
mov cx,10
call divdw
add cx,30h
push cx;不为0继续除以10,余数的ascii码入栈,此时dx肯定一直为0
jmp short ldtoc2
ldtoc3: pop cx ;此时转换ascii码完毕,开始pop
mov [si],cl;由于余数肯定小于10,所以cl足够存放
inc si
jcxz ldtoc4;当pop出0时,说明弹出完毕,整个转换结束
jmp short ldtoc3
ldtoc4: pop ax
pop si
pop dx
pop cx
ret
divdw: push bx
push ax;低16位入栈
mov ax,dx
mov dx,0;先做高16位的除法运算
div cx;运算完毕后阿ax为商,dx为余数
mov bx,ax;bx存放高十六位div后的商
pop ax;弹出低16位到ax,此时dx为高16位div余数,
div cx;再进行除法运算,ax为商,dx为最终余数
mov cx,dx;cx存放余数
mov dx,bx;dx存放商的高16位,ax存放商的低16位,运算完毕
pop bx
ret
show_str:push es
push ax
push cx
push bx
push si
mov al,0ah
mul dh
add ax,0b800h
mov es,ax;此时es指向要显示的那一行首地址
mov bx,0
add bl,dl
add bl,dl;bl为2*dl,即要显示数据的偏移地址
mov al,cl;al存放颜色配置
mov ch,0
display:mov cl,[si];ds:si指向的byte数据移到cl
jcxz ok;判断cl不为0,为0就显示结束
mov es:[bx],cl;将要显示的数据存放到显存指定的位置
inc bx
mov es:[bx],al;将颜色标志存放到显存后一个byte
inc bx
inc si
jmp short display;循环
ok: pop si
pop bx
pop cx
pop ax
pop es
ret
codesg ends
end start | | |