千红 發表於 2021-11-4 16:10:11

汇编语言显示功能实现教程详解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>问题1</li><ul class="second_class_ul"><li>1 如何确定字符要显示的位置</li><ul class="third_class_ul"><li>确定3行字符在每一行的起始位置</li><li>确定3行字符在屏幕中的哪一行</li></ul><li>2&nbsp;如何确定字符要显示的颜色属性</li><ul class="third_class_ul"></ul></ul><li>&nbsp;问题2:</li><ul class="second_class_ul"><li>分析:</li><ul class="third_class_ul"></ul></ul></ul></div><p class="maodian"></p><h2>问题1</h2>
<p>在屏幕中间分别显示绿底,绿底红色,白底蓝色的字符串“Welcome to masm!”</p>
<p>分析:</p>
<p class="maodian"></p><h3>1 如何确定字符要显示的位置</h3>
<p>在80*25的彩色字符模式显示缓冲区在内存地址的B8000H~BFFFFH共32KB的空间中</p>
<p>在该模式下,显示器可以显示25行,80列</p>
<p>所以在一行中就有80个字符,共占据160个字节,每个字符低位字节存储字符的ASCII码,高位字节存储字符的颜色属性</p>
<p>偏移0000~009F对应的就是显示器上的第一行;</p>
<p>偏移0A00~13F0对应的就是显示器上的第二行;......依次类推</p>
<p class="maodian"></p><h4>确定3行字符在每一行的起始位置</h4>
<p>因为显示的在屏幕的中间,共需要32个字节,屏幕中一行共160个字节,所以开始字节为(160 - 32)/ 2 = 64</p>
<p class="maodian"></p><h4>确定3行字符在屏幕中的哪一行</h4>
<p>因为屏幕中一共25行,要显示3行字符串,一行有160个字符串,则第一行的开始位置是(25 - 3)/ 2 * 160 = 6E0H</p>
<p>第二行的开始位置是6E0H + 160 = 780H</p>
<p>第三行的开始位置是780H + 160 = 820H</p>
<p class="maodian"></p><h3>2&nbsp;如何确定字符要显示的颜色属性</h3>
<p>每个字符的颜色属性占据一个字节,每一位表示的不同的颜色属性,则共有256种颜色属性</p>
<p>属性字节的格式:</p>
<blockquote>
<p>7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (6&nbsp; 5&nbsp; 4) &nbsp;&nbsp; 3 &nbsp;&nbsp; (2&nbsp; 1&nbsp; 0)</p>
<p>BL &nbsp; (R G B)&nbsp; I &nbsp; (R G B)</p>
<p>闪烁 &nbsp;&nbsp; 背景 &nbsp;&nbsp; 高亮 &nbsp; &nbsp;&nbsp; 前景</p>
<p>绿底黑色:0 010 0 000B (20H)</p>
<p>绿底红色:0 010 0 100B (42H)</p>
<p>白底蓝色:0 111 0 001B (71H)</p>
</blockquote>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code,ds:data
data segment
        db 'Welcome to masm!'       
data ends

code segment
start:                        mov ax,data
                        mov ds,ax
                        mov bx,0                        ;ds:bx指向数据段起始位置

                        mov ax,0B800H       
                        mov es,ax                        ;设置显示内存空间的起始位置

                        mov si,64                        ;设置字符串在一行中的中间位置
                       
                        mov cx,16                        ;设置循环的次数为字符串的长度

s:                        mov al,ds:               
                       
                        mov ah,20H                        ;设置第一行的开始位置和颜色
                        mov es:,ax
                       
                        mov ah,42h                        ;设置第二行的开始位置和颜色
                        mov es:,ax
                       
                        mov ah,71h                        ;设置第三行的开始位置和颜色
                        mov es:,ax

                        inc bx                                 ;设置字符串的偏移
                        add si,2                        ;设置下一次循环的写入位置

                        loop s

                        mov ax,4c00h
                        int 21h

code ends
end start</pre>
</div>
<p class="maodian"></p><h2>&nbsp;问题2:</h2>
<p>设计一个子程序,使调用者决定显示的位置,内容和颜色</p>
<p class="maodian"></p><h3>分析:</h3>
<p>要实现的功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串</p>
<p>指定的参数:行号-dh(取值范围0~24),列号-dl(取值范围0~79),取值范围主要是根据显示器屏幕的大小</p>
<p>颜色-cl,ds:si指向字符串的首地址</p>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code,ds:data
data segment
        db 'Welcome to masm!',0
data ends
code segment
start:                        mov dh,8
                        mov dl,3
                        mov cl,2
                        mov ax,data
                        mov ds,ax
                        mov si,0                        ;ds:si指向数据段首地址
                        call show_str
                        mov ax,4c00h
                        int 21h
show_str:                mov ax,0B800H
                        mov es,ax                ;es指向显示内存空间的段地址
                        mov ax,160
                        dec dh
                        mul dh
                        mov dh,0
                        dec dl
                        add dl,dl
                        add ax,dx
                        mov di,ax                ;设置di指向字符串要显示的偏移地址
                        mov ah,cl
show:                        mov cx,ds:
                        jcxz ok                        ;设置在遇到字符0的时候退出
                        mov al,ds:
                        mov es:,ax
                        add di,2
                        inc si
                        loop show
ok:                        retf
code ends
end start</pre>
</div>
<p>以上就是汇编语言显示功能实现问题实例详解的详细内容,更多关于汇编语言显示功能的资料请关注琼殿技术社区其它相关文章!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>图文详解通俗易懂的汇编语言寄存器</li><li>汇编语言指令集学习条件转移指令详解</li><li>汇编语言之实现发出各种声音</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 汇编语言显示功能实现教程详解