assume cs:code,ds:data data segment db 'welcome to masm!' db 02h,24h,71h ;绿色,绿底红字,白底蓝字的属性机器码 data ends code segment start: mov ax,data mov ds,ax ;字符串及属性值所在段的段地址送入ds mov ax,0b800H ;显示区缓存地址开始位置,想要打印到屏幕,就需要这个地址 mov es,ax ;80*25彩色字符显示缓冲区段地址送入es mov cx,len ;cx寄存器存放字符串长度 mov si,0 ;si寄存器存放字符串偏移量,初始为0 ;显示绿色字符串 mov dl,2 ;;颜色属性 0000 0010 call PrintString ; 显示绿底红色字符串 mov dl, 24 call PrintString ; 显示白底蓝色字符串 mov dl, 71 call PrintString mov ax,4c00h int 21h PrintString proc push ax push bx push cx push dx mov ah, 02h ; 设置光标位置 mov bh, 0 ; 页码,默认为0 mov dh, 12 ; 竖直方向上的行数,假设为12 mov dl, 40 - (len / 2) ; 水平方向上的列数,使得字符串在屏幕中央显示 int 10h mov ah, 09h ; 显示字符串 mov bl, dl ; 设置字符颜色 lea dx, msg[si] ; dx寄存器存放字符串地址 int 21h pop dx pop cx pop bx pop ax code ends end start修改成可运行的
时间: 2024-02-10 17:07:26 浏览: 141
这段代码存在一些问题,例如字符串长度没有定义,需要先定义len,msg也没有定义,需要定义msg。以下是修改后的可运行代码:
```
assume cs:code,ds:data
data segment
msg db 'welcome to masm!', 02h, 24h, 71h ; 字符串及属性值
len equ $ - msg ; 计算字符串长度
data ends
code segment
start:
mov ax, data
mov ds, ax ; 字符串及属性值所在段的段地址送入ds
mov ax, 0b800h
mov es, ax ; 80*25彩色字符显示缓冲区段地址送入es
mov cx, len ; cx寄存器存放字符串长度
mov si, 0 ; si寄存器存放字符串偏移量,初始为0
; 显示绿色字符串
mov dl, 2 ; 颜色属性 0000 0010
call PrintString
; 显示绿底红色字符串
mov dl, 24
call PrintString
; 显示白底蓝色字符串
mov dl, 71
call PrintString
mov ax, 4c00h
int 21h
PrintString proc
push ax
push bx
push cx
push dx
mov ah, 02h ; 设置光标位置
mov bh, 0 ; 页码,默认为0
mov dh, 12 ; 竖直方向上的行数,假设为12
mov dl, 40 - (len / 2) ; 水平方向上的列数,使得字符串在屏幕中央显示
int 10h
mov ah, 09h ; 显示字符串
mov bl, dl ; 设置字符颜色
lea dx, msg ; dx寄存器存放字符串地址
int 21h
pop dx
pop cx
pop bx
pop ax
ret
PrintString endp
code ends
end start
```
阅读全文