6YKT6ZKm5LqI 发表于 2022-6-30 15:42:35

向显存写入字符串,第一个字符总会被覆盖

我将字符串显示在中间,但是会被dos上显示的指令给挡住{:10_269:} ,就像这样:

然后我想如果打印在黑色部分说不定就不会被覆盖了,但是第一个字符还是显示不出来{:10_269:} ,就像这样:

求高人指导{:10_250:}
代码如下:
assume cs: codesg, ds: data, ss: stack

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

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

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

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

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

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

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

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

    mov cx, 10h
s2:
    mov es:, al
    add di, 2
    loop s2
    ; 存入字符属性

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

    mov ax, 4c00h
    int 21h
codesg ends
end start

人造人 发表于 2022-6-30 16:25:06

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

6YKT6ZKm5LqI 发表于 2022-6-30 19:17:13

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

偶我太蠢了,因为程序比较长,我也没有记最后一个循环结束的地址,所以我一直-t,每次都把第一个w打印出来以后才看到程序结束的地方,然后再用-g跳转,所以最后打印出来就没有第一个w{:10_266:}

2022xsy 发表于 2022-6-30 19:54:45

{:10_266:}

hornwong 发表于 2022-7-1 00:01:42

{:5_108:}

kerln888 发表于 2022-7-1 08:07:54

{:10_256:}{:10_256:}{:10_256:}

1molHF 发表于 2022-7-1 08:17:15

{:10_256:}

1050293757 发表于 2022-7-1 11:01:51

{:5_109:}
页: [1]
查看完整版本: 向显存写入字符串,第一个字符总会被覆盖