xinchaozhulang 发表于 2011-11-7 18:40:39

为什么写不到内存中

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:
                mov es:,ax
                add di,2
                add bx,2
                loop s
               
                mov ax,4c00H
                int 21H
        code ends

        end start
               
谁能帮忙看看这段代码,哪里出了问题,为什么写不到内存中去呢 ?不胜感激!
               

蛇足之王 发表于 2011-11-7 18:52:02

本帖最后由 蛇足之王 于 2011-11-7 18:55 编辑

1.data段的数据定义有误,写入显示缓冲区的数据应该是要显示的字符所对应的ASCII码
2.要显示的一个字符占两个字节,其中高位是颜色信息,低位是ASCII码,如果要用mov es:,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:
                mov es:,al                              ;这里只传输低位的ASCII码信息,不改动高位的颜色信息
                add di,2
                inc bx
                loop s
               
                mov ax,4c00H
                int 21H
      code ends

      end start

xinchaozhulang 发表于 2011-11-7 21:39:02

好像用debug 调试时 那段内存还是写不上数据不过还是很感谢你的

蛇足之王 发表于 2011-11-8 15:15:57

用debug 调试时不是写不上,而是因为debug在执行一条语句后会自动显示当前所有寄存器状态,在屏幕显示空间不够时会向上滚动,而这个程序写入的显示缓冲区位置是第1行,自然就被覆盖掉了。
你可以在debug前先用cls命令清屏,进入debug后用g命令直接跳到程序最后(这个程序应该是g1e),保证屏幕内容没有向上滚动,这样会在第一行开始显示1234567
或者把位置改到中间(di初始值赋予160×12),调试到写入语句时注意观察第8行(第12行减去向上滚动4行)的开头

yetibobo 发表于 2011-11-8 16:16:36

你换个安全可写的内存段放你的数字试试。

kane080824 发表于 2011-11-9 00:54:47

http://bbs.fishc.com/data/attachment/album/201111/09/004940ouo3r3lv9biu9jbb.jpg
完全可以写入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,
                mov ah,02;假如以绿色显示
                mov es:,ax
               
                inc bx
                add di,2
                loop s
               
                mov ax,4c00H
                int 21H
      code ends
      end start
页: [1]
查看完整版本: 为什么写不到内存中