实验9遇到的小问题
assume cs:code ds:datadata segment
db 'welocme to masm!'
data ends
code segment
start: mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov bx,0
mov ax,0
mov cx,16 ;一共十六个字符,循环16次
s: mov al, ;把字符传入给al
mov es:,al ;把al的值传入给es
mov ah,2h ;设置黑底绿字
mov es:,ah;字体颜色传入到内存空间0B800H中的奇数位,也就是控制字符属性的位置
inc bx ;bx自增达成循环
loop s
mov ax,4c00H
int 21h
code ends
end start
代码如上,想请问一下为什么存在ds:的值赋值到al但并不会传输到es:里面?调试过好几次了并没有看到值传入到es想请教一下要怎么改,然后错那里了?卡了挺久了希望有大佬能指点一下谢谢! 本帖最后由 jackz007 于 2020-8-1 13:42 编辑
bx 不可以同时作 ds、es 段的偏移,因为,ds 段是纯字符信息,而 es 段是要同时包含字符及其颜色属性字节的,所以,二者偏移的步进速度是不可能一致的!
下面是 2 个修改版本,供楼主参考
【版本1】:
assume cs:code , ds:data ; 注意,这一句有错误
data segment
db 'welocme to masm!'
data ends
code segment
start: mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
xor si,si
mov di,1982 ;从第 12 行 31 列的位置开始显示信息
mov cx,16 ;一共十六个字符,循环16次
s: movsb
mov byte ptr es:,02h
inc di
loop s
mov ax,4c00h
int 21h
code ends
end start
【版本2】:
assume cs:code,ds:data
data segment para public 'data'
msg db 'welcome to masm !' , 00
data ends
stack segment stack
db 4096 dup(0)
stack ends
code segment para public 'code'
main proc far
mov ax,0600h ; 功能号
mov bx,0700h ; 字符属性 - 黑底白字
xor cx,cx ; 清屏区域左上角坐标(0,0)
mov dx,184fh ; 清屏区域右下角坐标(24,79)
int 10h ; 清屏
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov si,offset msg
mov di,1982 ; 字符显示的开始位置为 12 行 31列
s1: lodsb
or al,al ; 自动检测是否结束字符
jz s2 ; 如果是,就跳走
stosb ; 传递字符
mov al,02h ; 设定字符颜色
stosb ; 设定字符颜色
jmp s1
s2: xor ax,ax
int 16h ; 等待用户按下任意键
mov ax,4c00h
int 21h ; 终止程序
main endp
code ends
end main jackz007 发表于 2020-8-1 13:06
bx 不可以同时作 ds、es 段的偏移,因为,ds 段是纯字符信息,而 es 段是要同时包含字符及其颜色属性 ...
谢谢提醒!有了新思路知道要怎么写了,感谢感谢!
页:
[1]