鱼C论坛

 找回密码
 立即注册
查看: 2856|回复: 5

为什么写不到内存中

[复制链接]
发表于 2011-11-7 18:40:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
assume cs:code,ds:data
       
        data segment
        dw        1,2,3,4,5,6,7
        data ends
       
       
        code segment
start:       
                mov ax,data
                mov ds,ax
                mov bx,0
               
                mov ax,0b800H
                mov es,ax
                mov di,0
               
                mov cx,7
               
        s:
                mov ax,ds:[bx]
                mov es:[di],ax
                add di,2
                add bx,2
                loop s
               
                mov ax,4c00H
                int 21H
        code ends

        end start
               
谁能帮忙看看这段代码,哪里出了问题,为什么写不到内存中去呢 ?不胜感激!
               
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-7 18:52:02 | 显示全部楼层
本帖最后由 蛇足之王 于 2011-11-7 18:55 编辑

1.data段的数据定义有误,写入显示缓冲区的数据应该是要显示的字符所对应的ASCII码
2.要显示的一个字符占两个字节,其中高位是颜色信息,低位是ASCII码,如果要用mov es:[di],ax这样的语句,那么应该是ah存储颜色信息,al存储ASCII码,而不是用ax存储整个数据
改成下面这样应该没问题了
assume cs:code,ds:data
      
        data segment
        db        '1','2','3','4','5','6','7'                   ;这里改成定义字符型数据
        data ends
      
      
        code segment
start:      
                mov ax,data
                mov ds,ax
                mov bx,0
               
                mov ax,0b800H
                mov es,ax
                mov di,0
               
                mov cx,7
               
        s:
                mov al,ds:[bx]
                mov es:[di],al                              ;这里只传输低位的ASCII码信息,不改动高位的颜色信息
                add di,2
                inc bx
                loop s
               
                mov ax,4c00H
                int 21H
        code ends

        end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-7 21:39:02 | 显示全部楼层
好像用debug 调试时 那段内存还是写不上数据  不过还是很感谢你的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-8 15:15:57 | 显示全部楼层
用debug 调试时不是写不上,而是因为debug在执行一条语句后会自动显示当前所有寄存器状态,在屏幕显示空间不够时会向上滚动,而这个程序写入的显示缓冲区位置是第1行,自然就被覆盖掉了。
你可以在debug前先用cls命令清屏,进入debug后用g命令直接跳到程序最后(这个程序应该是g1e),保证屏幕内容没有向上滚动,这样会在第一行开始显示1234567
或者把位置改到中间(di初始值赋予160×12),调试到写入语句时注意观察第8行(第12行减去向上滚动4行)的开头
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-8 16:16:36 | 显示全部楼层
你换个安全可写的内存段放你的数字试试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-9 00:54:47 | 显示全部楼层

                               
登录/注册后可看大图

完全可以写入b800H显存段
assume cs:code,ds:data
        
        data segment
        db       '1234567'
        data ends
        
        
        code segment
start:        
                mov ax,data
                mov ds,ax
                mov bx,0
               
                mov ax,0b800H
                mov es,ax
               
                mov di,0
                mov cx,7
               
        s:
                mov al,[bx]
                mov ah,02  ;假如以绿色显示
                mov es:[di],ax
               
                inc bx
                add di,2
                loop s
               
                mov ax,4c00H
                int 21H
        code ends
        end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-19 10:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表