鱼C论坛

 找回密码
 立即注册
查看: 1912|回复: 2

[已解决]实验9遇到的小问题

[复制链接]
发表于 2020-8-1 10:54:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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,[bx]                ;把字符传入给al
                mov es:[bx],al        ;把al的值传入给es
                mov ah,2h                ;设置黑底绿字
                mov es:[bx+2],ah;字体颜色传入到内存空间0B800H中的奇数位,也就是控制字符属性的位置
                inc bx                        ;bx自增达成循环
                loop s
               
                mov ax,4c00H
                int 21h
code ends
end start
               
               
代码如上,想请问一下为什么存在ds:[bx]的值赋值到al但并不会传输到es:[bx]里面?调试过好几次了并没有看到值传入到es想请教一下要怎么改,然后错那里了?卡了挺久了希望有大佬能指点一下谢谢!
最佳答案
2020-8-1 13:06:19
本帖最后由 jackz007 于 2020-8-1 13:42 编辑

     bx 不可以同时作 ds、es 段的偏移,因为,ds 段是纯字符信息,而 es 段是要同时包含字符及其颜色属性字节的,所以,二者偏移的步进速度是不可能一致的!
     下面是 2 个修改版本,供楼主参考
【版本1】:
  1. assume cs:code , ds:data                   ; 注意,这一句有错误

  2. data segment
  3.         db 'welocme to masm!'
  4. data ends

  5. code segment
  6. start:          mov ax,data
  7.                 mov ds,ax
  8.                 mov ax,0b800h
  9.                 mov es,ax
  10.                 xor si,si
  11.                 mov di,1982                ;从第 12 行 31 列的位置开始显示信息
  12.                 mov cx,16                  ;一共十六个字符,循环16次
  13. s:              movsb
  14.                 mov byte ptr es:[di],02h
  15.                 inc di
  16.                 loop s
  17.                 mov ax,4c00h
  18.                 int 21h
  19. code ends
  20. end start
复制代码

【版本2】:
  1. assume cs:code,ds:data

  2. data segment para public 'data'
  3. msg     db 'welcome to masm !' , 00
  4. data ends

  5. stack segment stack
  6.         db 4096 dup(0)
  7. stack ends

  8. code segment para public 'code'
  9. main proc far
  10.                 mov ax,0600h          ; 功能号
  11.                 mov bx,0700h          ; 字符属性 - 黑底白字
  12.                 xor cx,cx             ; 清屏区域左上角坐标(0,0)
  13.                 mov dx,184fh          ; 清屏区域右下角坐标(24,79)
  14.                 int 10h               ; 清屏

  15.                 mov ax,data
  16.                 mov ds,ax
  17.                 mov ax,0b800h
  18.                 mov es,ax
  19.                 mov si,offset msg
  20.                 mov di,1982           ; 字符显示的开始位置为 12 行 31列
  21. s1:             lodsb
  22.                 or al,al              ; 自动检测是否结束字符
  23.                 jz s2                 ; 如果是,就跳走
  24.                 stosb                 ; 传递字符
  25.                 mov al,02h            ; 设定字符颜色
  26.                 stosb                 ; 设定字符颜色
  27.                 jmp s1

  28. s2:             xor ax,ax
  29.                 int 16h               ; 等待用户按下任意键

  30.                 mov ax,4c00h
  31.                 int 21h               ; 终止程序
  32. main endp
  33. code ends
  34. end main
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-1 13:06:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-8-1 13:42 编辑

     bx 不可以同时作 ds、es 段的偏移,因为,ds 段是纯字符信息,而 es 段是要同时包含字符及其颜色属性字节的,所以,二者偏移的步进速度是不可能一致的!
     下面是 2 个修改版本,供楼主参考
【版本1】:
  1. assume cs:code , ds:data                   ; 注意,这一句有错误

  2. data segment
  3.         db 'welocme to masm!'
  4. data ends

  5. code segment
  6. start:          mov ax,data
  7.                 mov ds,ax
  8.                 mov ax,0b800h
  9.                 mov es,ax
  10.                 xor si,si
  11.                 mov di,1982                ;从第 12 行 31 列的位置开始显示信息
  12.                 mov cx,16                  ;一共十六个字符,循环16次
  13. s:              movsb
  14.                 mov byte ptr es:[di],02h
  15.                 inc di
  16.                 loop s
  17.                 mov ax,4c00h
  18.                 int 21h
  19. code ends
  20. end start
复制代码

【版本2】:
  1. assume cs:code,ds:data

  2. data segment para public 'data'
  3. msg     db 'welcome to masm !' , 00
  4. data ends

  5. stack segment stack
  6.         db 4096 dup(0)
  7. stack ends

  8. code segment para public 'code'
  9. main proc far
  10.                 mov ax,0600h          ; 功能号
  11.                 mov bx,0700h          ; 字符属性 - 黑底白字
  12.                 xor cx,cx             ; 清屏区域左上角坐标(0,0)
  13.                 mov dx,184fh          ; 清屏区域右下角坐标(24,79)
  14.                 int 10h               ; 清屏

  15.                 mov ax,data
  16.                 mov ds,ax
  17.                 mov ax,0b800h
  18.                 mov es,ax
  19.                 mov si,offset msg
  20.                 mov di,1982           ; 字符显示的开始位置为 12 行 31列
  21. s1:             lodsb
  22.                 or al,al              ; 自动检测是否结束字符
  23.                 jz s2                 ; 如果是,就跳走
  24.                 stosb                 ; 传递字符
  25.                 mov al,02h            ; 设定字符颜色
  26.                 stosb                 ; 设定字符颜色
  27.                 jmp s1

  28. s2:             xor ax,ax
  29.                 int 16h               ; 等待用户按下任意键

  30.                 mov ax,4c00h
  31.                 int 21h               ; 终止程序
  32. main endp
  33. code ends
  34. end main
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

谢谢提醒!有了新思路知道要怎么写了,感谢感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 21:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表