首页 > 编程语言 > 详细

汇编语言之屏幕字符显示

时间:2014-03-14 23:13:13      阅读:726      评论:0      收藏:0      [点我收藏+]
在屏幕中间分别显示不同颜色的字符串“Jackill Love You”
在内存地址空间,B8000H~BFFFFH共32K空间,在此空间写入数据会显示在显示器上;在80*25彩色字符模式下,显示器可以显示25行,80个字符,一个字符占两个字节,低位为ASCII码,高位为字节存储字符的属性
 
00~01/9E~9F单元分别对应第一列和第80列;字符属性略-察看9.9;
 
例如在0行0列显示黑底绿色字符A,缓冲区里的内容应该为:
B800:0000 ->41(ASCII) 02(属性)
 
////////////////////////////////////////////////////////////////////
assume cs:code,ds:data,ss:stack
data segment
        db ‘Jackill Love You‘  ;定义要显示的字符串(共16字节)
        db 02h,24h,71h    ;定义三种颜色属性
data ends
stack segment
        dw 8 dup(0)
stack ends
code segment
start:

        mov ax,data
        mov ds,ax
        mov ax,stack
        mov ss,ax
        mov sp,10h
        mov bx,0
        mov di,0
        mov ax,0b872h    ;算出屏幕第12行中间的显存的段起始位置放入ax中
        mov cx,3         ;外循环为3次,因为要显示三个字符串
s3:     push cx        ;三个进栈操作为外循环s3保存相关寄存器的值
        push ax        ;以防止它们的值在内循环中被破坏
        push di
        mov es,ax      ;此时es为屏幕第12行中间的显存的段起始位置
        mov si,0
        mov di,0
        mov cx,10h     ;内循环为10h次,因为一个字符串中含10h个字节
s1:     mov al,ds:[bx+si]
        mov es:[bx+di],al
        inc si
        add di,2
        loop s1     ;此循环实现偶地址中存放字符     
        mov si,1    ;si的值设为1,从而为在显存奇地址中存放字符的颜色属性做准备
        pop di        ;将di的值恢复成进入内循环之前的时候的值
        mov al,ds:10h[bx+di]    ;取颜色属性[源OP寻址方式:相对基址变址]
        mov cx,10h     ;第二个内循环也为10h次
s2:     mov es:[bx+si],al
        add si,2
        loop s2       ;此循环实现奇地址中存放字符的颜色属性
        ;以下4句为下一趟外循环做准备
        inc di
        pop ax
        add ax,0ah   ;将显存的段起始地址设为当前行的下一行
                     ;[在段地址中加0ah,相当于在偏移地址中加了0a0h(=160d)]
        pop cx
        loop s3   
        mov ax,4c00h
        int 21h
code ends
end start

汇编语言之屏幕字符显示,布布扣,bubuko.com

汇编语言之屏幕字符显示

原文:http://blog.csdn.net/luguifang2011/article/details/21240845

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!