鱼C论坛

 找回密码
 立即注册
查看: 1487|回复: 7

[已解决]向显存写入字符串,第一个字符总会被覆盖

[复制链接]
发表于 2022-6-30 15:42:35 | 显示全部楼层 |阅读模式

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

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

x
我将字符串显示在中间,但是会被dos上显示的指令给挡住 ,就像这样:
success2.png
然后我想如果打印在黑色部分说不定就不会被覆盖了,但是第一个字符还是显示不出来 ,就像这样:
1.png
求高人指导
代码如下:
  1. assume cs: codesg, ds: data, ss: stack

  2. data segment
  3.     db 'welcome to masm!' ; 在显存显示的字符串(16个字符,需要占32个字节,一个字节存放asc码,一个字节存放字符属性)
  4.     db 02h, 24h, 71h ; 定义三种颜色属性(黑底绿字, 绿底红字, 白底蓝字)
  5. data ends

  6. stack segment
  7.     dw 80 dup(0) ; 定义8个字型数据用于存放寄存器的值
  8. stack ends

  9. codesg segment
  10. start:
  11.     mov ax, data
  12.     mov ds, ax
  13.     mov ax, stack
  14.     mov ss, ax
  15.     mov sp, 10h ; 设置栈顶,八个字型数据占16个字节,故偏移地址取10h
  16.     xor bx, bx ; bx清零, 用来索引属性
  17.     mov ax, 0b874h ; 计算字符串写入的段地址

  18.     mov cx, 3 ; 执行三次循环,打印三行语句
  19. s3:
  20.     push cx ; 为外循环保存相关寄存器的值
  21.     push ax ; 防止段地址的值在内循环中被改变
  22.     ; push bx

  23.     mov es, ax ; 此时es为显存的段地址

  24.     mov si, 0 ; si用于索引字符
  25.     mov di, 0 ; di用于定位字符存往的es段的偏移地址

  26.     mov cx, 10h
  27.     ; s1控制存放的字符,内循环为10h次,因为一行含10h个字节(注意!十六进制的10表示十进制的16)
  28. s1:
  29.     mov al, ds:[si]
  30.     mov es:[di], al
  31.     inc si
  32.     add di, 2
  33.     loop s1
  34.     ; 将字符存入偶数偏移地址

  35.     mov di, 1
  36.     ; pop bx
  37.     mov al, ds:10h[bx] ; 取出字符串属性赋给al
  38.     inc bx ; ds:[bx]指向下一行字符串的属性

  39.     mov cx, 10h
  40. s2:
  41.     mov es:[di], al
  42.     add di, 2
  43.     loop s2
  44.     ; 存入字符属性

  45.     pop ax
  46.     pop cx  
  47.     add ax, 0AH ; 将段地址修改到下一行
  48.     loop s3

  49.     mov ax, 4c00h
  50.     int 21h
  51. codesg ends
  52. end start
复制代码
最佳答案
2022-6-30 16:25:06
奇怪,代码应该没问题,我这边可以显示出来
你试试不用debug,直接运行看看能不能显示出来
试试再换一个空的位置看看能不能显示出来
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-30 16:25:06 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +3 鱼币

奇怪,代码应该没问题,我这边可以显示出来
你试试不用debug,直接运行看看能不能显示出来
试试再换一个空的位置看看能不能显示出来
1.png

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
6YKT6ZKm5LqI + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-6-30 19:17:13 | 显示全部楼层
人造人 发表于 2022-6-30 16:25
奇怪,代码应该没问题,我这边可以显示出来
你试试不用debug,直接运行看看能不能显示出来
试试再换一个 ...

偶我太蠢了,因为程序比较长,我也没有记最后一个循环结束的地址,所以我一直-t,每次都把第一个w打印出来以后才看到程序结束的地方,然后再用-g跳转,所以最后打印出来就没有第一个w
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-30 19:54:45 | 显示全部楼层

回帖奖励 +3 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-1 00:01:42 | 显示全部楼层

回帖奖励 +3 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-1 08:07:54 | 显示全部楼层

回帖奖励 +3 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-1 08:17:15 | 显示全部楼层

回帖奖励 +3 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-1 11:01:51 | 显示全部楼层

回帖奖励 +3 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-21 00:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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