. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
主题 : :  实验九花了我一天的时间,贴出来供讨论  [已解决] 回复[ 6次 ]   点击[ 529次 ]  
till
[帖 主] [ 发表时间:2010-07-18 12:39 ] 
荣誉值:3
信誉值:0
注册日期:2008-06-04 16:24
一、我的编程思想:仔细阅读实验九给的材料得知要在B8000--B8F9F中写入数据,数据包含两个属性:一个是字符颜色 二是写入的字符串内容。
A、字符的颜色如何配置:由设置属性字节配出如下:
a、绿色       00000010B  02H
b、绿底红字   00100100B  24H
c、白底蓝色   01110001B  71H

B、算出屏幕中间所放字符串(带颜色属性)的偏移地址 (段地址:B800H)
因为一屏显示25行,每行160个字节 那么中间三行就是:12行、13行、14行,又因为字符在每行的中间,则可得出每串字符的首偏移地址为:720H、7C0H、860H

知道了这么多那么编程就好办了,编程如下:
——————————————————————————————————————
assume cs:codesg
data segment 
db'welcome to masm!'       ;定义显示的字符串
data ends
stacksg segment 
dw 02h,24h,71h,0           ;定义颜色值,后面还将此做为栈使用 我这样做不知道会不会有问题?
stacksg ends
codesg segment 
start: mov ax,data
       mov ds,ax
       mov ax,0b800h
       mov es,ax
       mov bx,0
       mov ax,stacksg
       mov ss,ax
       mov sp,8h
       mov cx,3h
       mov bp,0
    s0:push cx                   ;保护外循环进栈
        mov cx,10h                ;设置内循环16次
        mov si,0
       mov di,0
    s: mov al,ds:[di]            ;取出字符放在al中
       mov ah,ss:[bp]            ;颜色值直接赋值到ah中
       mov es:[si+720h+bx],ax    ;将ax值存到08b00h:720h内存单元处,让字符在屏幕的第12行中间显示出来
        add si,2                  
       inc di
       loop s
       add bp,2
       add bx,0a0h               ;换到下一行
       pop cx                    
       loop s0
       mov ax,4c00h
       int 21h
       codesg ends
       end start
-----------------------------------------------------------
调试通过了 ,但中间提出的问题希望有人能帮我解解,那个段总感觉有点不对劲 呵呵
masmaster
[第2楼] [ 回复时间:2010-07-18 13:41 ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
为什么要把颜色值放在栈中呢?
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved