yanghongchen666 发表于 2020-8-1 10:54:22

实验9遇到的小问题

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
                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:06:19

本帖最后由 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

yanghongchen666 发表于 2020-8-1 23:19:51

jackz007 发表于 2020-8-1 13:06
bx 不可以同时作 ds、es 段的偏移,因为,ds 段是纯字符信息,而 es 段是要同时包含字符及其颜色属性 ...

谢谢提醒!有了新思路知道要怎么写了,感谢感谢!
页: [1]
查看完整版本: 实验9遇到的小问题