鱼C论坛

 找回密码
 立即注册
查看: 2440|回复: 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】:
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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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:[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
想知道小甲鱼最近在做啥?请访问 -> 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-12-23 03:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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