|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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想请教一下要怎么改,然后错那里了?卡了挺久了希望有大佬能指点一下谢谢!
本帖最后由 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
复制代码
|
|