鱼C论坛

 找回密码
 立即注册
查看: 3042|回复: 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

谢谢各位指导 学习!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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


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

  5.         call far ptr show_str
复制代码
实现过程:
  1. show_str:                ;字符串默认在ds寄存器中
  2.         push bx
  3.                 push ax
  4.                         push dx
  5.                                 push cx
  6.                                         push si
  7.                                                 push di
  8.                                                         push es
  9.                                                                 push si
  10.                                                                         push cx
  11.                                                                                 dec dh
  12.                                                                                 dec dl
  13.                                                                                 xor di, di
  14.                                                                                 xor cx, cx
  15.                                                                                 mov cl, dh
  16.                                                                                 mov ax, 0b800h
  17.                                                                                 jcxz cx0
  18.                                                                                 s:
  19.                                                                                         push cx
  20.                                                                                                 mov cx, ax
  21.                                                                                                 add cx, 0ah
  22.                                                                                                 mov ax, cx
  23.                                                                                         pop cx
  24.                                                                                 loop s
  25.                                                                                 
  26.                                                                                 cx0:
  27.                                                                                 mov es, ax
  28.                                                                                 
  29.                                                                                 push dx
  30.                                                                                         add dl, dl
  31.                                                                                         xor dh, dh
  32.                                                                                         mov di, dx
  33.                                                                                 pop dx
  34.                                                                         pop cx
  35.                                                                 pop si        
  36.                                                                 xor si, si
  37.                                                                 s1:
  38.                                                                         push cx
  39.                                                                                 push ax
  40.                                                                                         mov al, [bx+si]
  41.                                                                                         mov byte ptr es:[di], al
  42.                                                                                         inc di
  43.                                                                                         mov es:[di], cl
  44.                                                                                         inc si
  45.                                                                                         inc di
  46.                                                                                         xor cx, cx
  47.                                                                                         mov cl, [bx+si]
  48.                                                                                         jcxz s2                ;一旦执行会直接跳过pop cx导致栈错乱,所以在s2开始处就应pop cx
  49.                                                                                 pop ax
  50.                                                                         pop cx
  51.                                                                 jmp s1
  52.                                                                
  53.                                                                 s2:
  54.                                                                                 pop ax
  55.                                                                         pop cx
  56.                                                                
  57.                                                         pop es
  58.                                                 pop di
  59.                                         pop si
  60.                                 pop cx
  61.                         pop dx
  62.                 pop ax
  63.         pop bx
  64.         
  65.         retf
复制代码
代码递进有点多。复制到notepad++可以看清楚点、、
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 14:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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