本帖最后由 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:[di],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
|