鱼C论坛

 找回密码
 立即注册
查看: 2702|回复: 1

[汇编作业] 汇编也可以显示彩色字符?实验10 交作业了(欢迎大家一起探讨 找到更优代码)

[复制链接]
发表于 2013-10-20 15:54:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
assume cs:code,ds:data,ss:stack

data segment        ;数据段
        db 'Time:15:35 Date:2013/10/20  hdy',0
data ends

stack segment        ;栈空间段
        db 100 dup (0)
stack ends

code segment        ;代码段
start:                           mov ax,stack
                                mov ss,ax
                                mov sp,100
                                mov ax,data
                                mov ds,ax
                               
                                mov si,0                ;偏移量0               
                                mov dh,12      ;打印到12行处
                                mov dl,0          ;最左边开始显示字符
                                mov cl,084h    ;颜色属性  黑底红字加闪烁
                                call putchars  ;打印到屏幕
                               
                                mov ax,4c00h
                                int 21h

        ;函数功能:在指定位置打印指定字符串
        ;参数:dh行号 dl列号 cl颜色 ds:si指向字符串的首地址
        putchars:                sub sp,20
                                mov bp,sp
                                push ax
                                push bx
                                push cx
                                push dx
                                push si
                                push di
                                push es
                                mov ax,0b800h        ;获取显存段地址
                                mov es,ax
                                xor ax,ax
                                mov al,dh                ;获取行号
                                sub al,1
                                add dl,dl
                                mov byte ptr ss:[bp+2],dl;获取列号
                                mov bx,160               
                                mul bx
                                add ax,ss:[bp+2]                ;获取偏移地址
                                mov word ptr ss:[bp],ax
                                                       
                                mov al,cl        ;获取颜色
                                xor cx,cx
                               
                                mov di,0
                                mov bx,0
        xie_char:        mov cl,ds:[si+bx];获取字符
                                jcxz put_return
                                push bx
                                mov bx,ss:[bp]
                                mov byte ptr es:[di+bx],cl        ;写字符
                                mov byte ptr es:[di+bx+1],al        ;写颜色
                                add di,2
                                pop bx
                                inc bx
                                jmp xie_char
                               
        put_return:        pop es          ;函数返回
                                pop di
                                pop si
                                pop dx
                                pop cx
                                pop bx
                                pop ax
                                add sp,20
                                ret               
code ends
end start

谢谢各位指导 学习!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-21 03:31:20 | 显示全部楼层
本帖最后由 chenhi 于 2013-10-21 03:34 编辑


调用方法:
        mov dh, 12        ;行号 1-25
        mov dl, 30        ;列号 1-80
        mov cl, 2        ;字体颜色 白色:7 蓝色:1 绿色:2 红色:4
        mov bx, 0        ;自定义字符串数据在data段中的开始位置,从零开始        

        call far ptr show_str
实现过程:
show_str:                ;字符串默认在ds寄存器中
        push bx
                push ax
                        push dx
                                push cx
                                        push si
                                                push di
                                                        push es
                                                                push si
                                                                        push cx
                                                                                dec dh
                                                                                dec dl
                                                                                xor di, di
                                                                                xor cx, cx
                                                                                mov cl, dh
                                                                                mov ax, 0b800h
                                                                                jcxz cx0
                                                                                s:
                                                                                        push cx
                                                                                                mov cx, ax
                                                                                                add cx, 0ah
                                                                                                mov ax, cx
                                                                                        pop cx
                                                                                loop s
                                                                                
                                                                                cx0:
                                                                                mov es, ax
                                                                                
                                                                                push dx
                                                                                        add dl, dl
                                                                                        xor dh, dh
                                                                                        mov di, dx
                                                                                pop dx
                                                                        pop cx
                                                                pop si        
                                                                xor si, si
                                                                s1:
                                                                        push cx
                                                                                push ax
                                                                                        mov al, [bx+si]
                                                                                        mov byte ptr es:[di], al
                                                                                        inc di
                                                                                        mov es:[di], cl
                                                                                        inc si
                                                                                        inc di
                                                                                        xor cx, cx
                                                                                        mov cl, [bx+si]
                                                                                        jcxz s2                ;一旦执行会直接跳过pop cx导致栈错乱,所以在s2开始处就应pop cx
                                                                                pop ax
                                                                        pop cx
                                                                jmp s1
                                                                
                                                                s2:
                                                                                pop ax
                                                                        pop cx
                                                                
                                                        pop es
                                                pop di
                                        pop si
                                pop cx
                        pop dx
                pop ax
        pop bx
        
        retf
代码递进有点多。复制到notepad++可以看清楚点、、
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 21:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表