马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我将字符串显示在中间,但是会被dos上显示的指令给挡住 ,就像这样:
然后我想如果打印在黑色部分说不定就不会被覆盖了,但是第一个字符还是显示不出来 ,就像这样:
求高人指导
代码如下: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:[si]
mov es:[di], al
inc si
add di, 2
loop s1
; 将字符存入偶数偏移地址
mov di, 1
; pop bx
mov al, ds:10h[bx] ; 取出字符串属性赋给al
inc bx ; ds:[bx]指向下一行字符串的属性
mov cx, 10h
s2:
mov es:[di], al
add di, 2
loop s2
; 存入字符属性
pop ax
pop cx
add ax, 0AH ; 将段地址修改到下一行
loop s3
mov ax, 4c00h
int 21h
codesg ends
end start
奇怪,代码应该没问题,我这边可以显示出来
你试试不用debug,直接运行看看能不能显示出来
试试再换一个空的位置看看能不能显示出来
|