. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验九花了我一天的时间,贴出来供讨论  [已解决] 回复[ 6次 ]   点击[ 527次 ]  
till
[帖 主]   [ 发表时间:2010-07-18 12:39 ]   [引用]   [回复]   [ top ] 
荣誉值: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
-----------------------------------------------------------
调试通过了 ,但中间提出的问题希望有人能帮我解解,那个段总感觉有点不对劲 呵呵
tinyparticle
[第1楼]   [ 回复时间:2010-07-18 13:01 ]   [引用]   [回复]   [ top ] 
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26
dw 02h,24h,71h,0           ;定义颜色值,后面还将此做为栈使用 我这样做不知道会不会有问题? 
=================================================================================
手上没有编译器调试,觉得有问题,楼主说调试通过了,可能是整体运行吧,单步执行的话应该是有问题的
栈设得很小,而且栈中数据又是要用的,单步执行会有中断数据进入,会造成数据覆盖
楼主自己单步调试下,看下栈中数据的变化就知道了
masmaster
[第2楼]   [ 回复时间:2010-07-18 13:41 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
为什么要把颜色值放在栈中呢?
jjch224
[第3楼]   [ 回复时间:2010-07-19 10:36 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
我想楼主的本意是用栈保存字符属性,作为一个空栈使用。在s0循环里面,cx的值始终存放在字单元ss:[6h]里面。
能否将栈设置大些,这样做单步调试就不会出问题了。1楼说的,单步调试中断数据进入栈不知是咋回事,还没学到中断哪章。我觉得可以这样,s0循环里面每次将字符属性依次入栈,在s循环做出栈,只要不弄错次序应该没有问题的。
till
[第4楼]   [ 回复时间:2010-07-19 11:33 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:0
注册日期:2008-06-04 16:24
为什么要把颜色值放在栈中呢?
------------------
回复: 定义了dw 02h,24h,71h,0   既解决三次颜色的循环 又可以保存CX的值 觉得这样很好啊

谢谢各位的回复 中断我还没学到
masmaster
[第5楼]   [ 回复时间:2010-07-19 13:09 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
哦~~原来如此~
till
[第6楼]   [ 回复时间:2010-07-23 17:11 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:0
注册日期:2008-06-04 16:24
此贴由 贴主 于 [ 2010-07-23 17:11 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved