为什么写不到内存中
assume cs:code,ds:datadata 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: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 好像用debug 调试时 那段内存还是写不上数据不过还是很感谢你的 用debug 调试时不是写不上,而是因为debug在执行一条语句后会自动显示当前所有寄存器状态,在屏幕显示空间不够时会向上滚动,而这个程序写入的显示缓冲区位置是第1行,自然就被覆盖掉了。
你可以在debug前先用cls命令清屏,进入debug后用g命令直接跳到程序最后(这个程序应该是g1e),保证屏幕内容没有向上滚动,这样会在第一行开始显示1234567
或者把位置改到中间(di初始值赋予160×12),调试到写入语句时注意观察第8行(第12行减去向上滚动4行)的开头 你换个安全可写的内存段放你的数字试试。 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]