|

楼主 |
发表于 2022-6-29 23:30:28
|
显示全部楼层
我改了一下,但是还是只能打印出一行,而且打印出来的是"Aelcome to masm!", 第一个字符有问题,可以麻烦再帮我看一下是哪里有问题吗
- 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 8 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, 0b872h ; 定位第十二行中间位置(作段地址使用): (11 * 160 + (80 - 16) / 2 * 2)在转换为16进制
- 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, 00A0H ; 将段地址修改到下一行
- loop s3
- mov ax, 4c00h
- int 21h
- codesg ends
- end start
复制代码 |
|