. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课程设计1颜色问题  [已解决] 回复[ 4次 ]   点击[ 349次 ]  
laersi
[帖 主]   [ 发表时间:2012-03-25 14:16 ]   [引用]   [回复]   [ top ] 
荣誉值: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
tomato
[第1楼]   [ 回复时间:2012-03-25 22:31 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
跟你的程序没关系。
tomato
[第2楼]   [ 回复时间:2012-03-25 22:32 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
这个问题在课本的16章中有相关内容。
laersi
[第3楼]   [ 回复时间:2012-03-25 22:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2012-03-25 13:34
哦,好的,那我先继续往下学了,谢谢
laersi
[第4楼]   [ 回复时间:2012-03-28 19:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2012-03-25 13:34
此贴由 贴主 于 [ 2012-03-28 19:23 ] 结贴。 结贴原因:问题已解决
得分情况: 2楼(tomato):6分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved