汇编也可以显示彩色字符?实验10 交作业了(欢迎大家一起探讨 找到更优代码)
assume cs:code,ds:data,ss:stackdata segment ;数据段
db 'Time:15:35 Date:2013/10/20hdy',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:,dl;获取列号
mov bx,160
mul bx
add ax,ss: ;获取偏移地址
mov word ptr ss:,ax
mov al,cl ;获取颜色
xor cx,cx
mov di,0
mov bx,0
xie_char: mov cl,ds:;获取字符
jcxz put_return
push bx
mov bx,ss:
mov byte ptr es:,cl ;写字符
mov byte ptr es:,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
谢谢各位指导 学习!!
本帖最后由 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,
mov byte ptr es:, al
inc di
mov es:, cl
inc si
inc di
xor cx, cx
mov cl,
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++可以看清楚点、、
页:
[1]