用汇编语言以assume开头和子程序的形式在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串‘welcome to masm’。向B8000H~BFFFFH写入数据
时间: 2024-02-29 13:52:14 浏览: 69
masm 汇编写的一个小程序
好的,以下是用汇编语言实现在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串‘welcome to masm’,并向`B8000H~BFFFFH`写入数据的代码:
```
assume cs:code
data segment
msg1 db 'welcome to masm', 0ah, 0dh, '$'
msg2 db 'welcome to masm', 0ah, 0dh, '$'
msg3 db 'welcome to masm', 0ah, 0dh, '$'
data ends
code segment
start:
mov ax, data
mov ds, ax
; 获取屏幕宽度和高度
mov ah, 0fh
int 10h
mov bh, 0
mov bl, 7
mov cx, 80
div cx
mov cx, ax
mov dx, bx
; 计算字符串的长度
mov si, offset msg1
mov di, offset msg2
mov bp, offset msg3
mov al, 0
mov cx, 0
mov dl, byte ptr [si]
cmp dl, '$'
je calc_end
calc_loop:
inc si
inc cx
mov dl, byte ptr [si]
cmp dl, '$'
jne calc_loop
calc_end:
mov al, 0
mov dl, byte ptr [di]
cmp dl, '$'
je calc2_end
calc2_loop:
inc di
add al, 2
mov dl, byte ptr [di]
cmp dl, '$'
jne calc2_loop
calc2_end:
mov al, 0
mov dl, byte ptr [bp]
cmp dl, '$'
je calc3_end
calc3_loop:
inc bp
add al, 2
mov dl, byte ptr [bp]
cmp dl, '$'
jne calc3_loop
calc3_end:
; 显示绿色字符串
mov ah, 0ah
mov al, 7
mov bh, 0
mov cx, dx
sub cx, byte ptr [si]
shr cx, 1
mov dx, byte ptr [si]
mov bp, sp
add bp, 2
mov byte ptr [bp], dl
inc bp
mov byte ptr [bp], al
inc bp
mov si, offset msg1
mov ah, 0
rep movsb
; 显示绿底红色字符串
mov ah, 0ah
mov al, 4
mov bh, 0
mov cx, dx
sub cx, byte ptr [di]
shr cx, 1
mov dx, byte ptr [di]
mov bp, sp
add bp, 2
mov byte ptr [bp], dl
inc bp
mov byte ptr [bp], al
inc bp
mov si, offset msg2
mov ah, 0
rep movsb
; 显示白底蓝色字符串
mov ah, 0ah
mov al, 1
mov bh, 0
mov cx, dx
sub cx, byte ptr [bp]
shr cx, 1
mov dx, byte ptr [bp]
mov bp, sp
add bp, 2
mov byte ptr [bp], dl
inc bp
mov byte ptr [bp], al
inc bp
mov si, offset msg3
mov ah, 0
rep movsb
; 向B8000H~BFFFFH写入数据
mov bx, 0b800h
mov es, bx
xor bx, bx
lea si, [msg1]
mov cx, dx
mov dl, byte ptr [si]
cmp dl, '$'
je write_end
write_loop:
inc si
mov al, byte ptr [si]
mov ah, byte ptr [si+1]
shl ah, 4
or al, ah
mov es:[bx], ax
add bx, 2
mov dl, byte ptr [si]
cmp dl, '$'
jne write_loop
write_end:
; 退出程序
mov ah, 4ch
int 21h
code ends
end start
```
解释一下代码:
首先,我们使用`assume cs:code`语句来声明代码段的名称为`code`。
然后,在`data segment`中,我们定义了三个字符串`msg1`、`msg2`和`msg3`,分别用于显示绿色、绿底红色和白底蓝色的字符串。每个字符串后面都加上了换行和回车符号,并以`$`作为结束符号。
接着,在`code segment`中,我们定义了一个`start`标签,表示程序的入口点。
然后,我们使用`mov ax, data`和`mov ds, ax`语句将数据段的地址加载到`DS`寄存器中,以便我们可以访问定义的字符串。
接下来,我们使用`int 10h`中断调用来获取屏幕的宽度和高度,并保存在`CX`和`DX`寄存器中。然后,我们计算出每个字符串在屏幕上的起始位置和长度。
然后,我们分别使用`mov ah, 0ah`和`int 10h`中断调用来显示三个字符串。其中,`mov al, 7`、`mov al, 4`和`mov al, 1`分别表示要显示的字符串的颜色。
接下来,我们使用`mov bx, 0b800h`和`mov es, bx`语句将`ES`寄存器加载到显存地址`0b800h`,以便我们可以向显存中写入数据。然后,我们使用`rep movsb`指令向显存中写入数据,从而在屏幕上显示字符串。
最后,我们使用`mov ah, 4ch`和`int 21h`来退出程序。
注意:上面的代码是在`DOS`环境下编写和运行的。如果你使用的是`Windows`或其他操作系统,需要使用相应的系统调用来向显存中写入数据。
阅读全文