修改以下汇编程序:data segment char db 'welcome' color db 07h,42h,24h,70h,14h,41h,21h,12h data ends code segment assume cs:code, ds:data st1: mov ax, data mov ds, ax mov ax, 0b800h mov es, ax mov cx, 8 lea bx, char lea si, color mov di, 12160+402 l: mov al, [bx] mov es:[di], al mov al, [si] mov es:[di+1], al inc bx inc si add di, 2 loop l mov ah, 4ch int 21h code ends end st1
时间: 2023-07-02 08:18:34 浏览: 222
这段汇编程序的作用是在屏幕上显示字符串"welcome",并且每个字符有不同的颜色。修改后的程序如下:
```
data segment
char db 'welcome'
color db 07h, 02h, 04h, 06h, 0Ah, 0Ch, 0Eh, 0Fh
data ends
code segment
assume cs:code, ds:data
st1:
mov ax, data
mov ds, ax
mov ax, 0b800h
mov es, ax
mov cx, 8
lea bx, char
lea si, color
mov di, 0
l:
mov al, [bx]
mov bl, [si]
mov es:[di], al
mov es:[di+1], bl
inc bx
inc si
add di, 2
loop l
mov ah, 4ch
int 21h
code ends
end st1
```
修改的部分有:
1. 修改了 color 数组,使得每个字符的颜色更加鲜艳。
2. 将 di 的初始值从 12160+402 改为 0,这样字符串就会从屏幕左上角开始显示。
3. 修改了 mov 指令,使用了 bl 寄存器来保存颜色数据,这样就能够将字符和颜色一起写入显存中了。
相关问题
2.在变量BUF里存放着6个字节的无符号数,请编程找出其中的最大值,并将其在显示器中显示出来。 提示如下: DATA SEGMENT BUF DB 13H,78H,80H,0FFH,05H,0F9H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX 。。。。。 MOV AH,4CH INT 21H CODE ENDS END START
以下是可以实现上述功能的汇编语言代码:
```
DATA SEGMENT
BUF DB 13H,78H,80H,0FFH,05H,0F9H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV CX,6 ; 将循环计数器 CX 设置为 6,因为 BUF 中有 6 个字节
LEA SI,BUF ; 将 BUF 的起始地址存储在 SI 中
MOV AL,[SI] ; 将 BUF 的第一个字节存储在 AL 中
MOV BL,AL ; 将 AL 中的值存储在 BL 中,BL 用于存储当前的最大值
LOOP_START:
INC SI ; 将 SI 指向下一个字节
CMP [SI],BL ; 将当前字节与 BL 中的值进行比较
JBE NOT_MAX ; 如果当前字节小于等于 BL 中的值,跳转到 NOT_MAX
MOV BL,[SI] ; 如果当前字节大于 BL 中的值,将当前字节存储在 BL 中
NOT_MAX:
LOOP LOOP_START ; 继续循环,处理下一个字节
; 将最大值 BL 的十六进制表示显示在屏幕上
MOV DL,BL ; 将 BL 中的值存储在 DL 中,DL 用于存储要显示的字符
MOV AH,2 ; 设置 INT 21H 的功能号为 2,用于显示字符
ADD DL,30H ; 将 DL 中的值加上 30H,得到对应的 ASCII 码
INT 21H ; 调用 INT 21H 显示字符
MOV AH,4CH ; 设置 INT 21H 的功能号为 4CH,用于程序结束
INT 21H ; 调用 INT 21H 结束程序
CODE ENDS
END START
```
上述代码中,使用循环逐个比较 BUF 中的每个字节,并将最大值存储在 BL 中。最后,将最大值转换为 ASCII 码,并调用 INT 21H 的功能号为 2 的中断显示在屏幕上。
assume ds:data, cs:code data segment db 'welcome to masm!' db 2H,24H,71H data ends code segment start: mov ax,data mov ds,ax mov ax,0B800H mov es,ax mov cx,10h mov bx,0 mov si,0 s0:mov ax,[bx] mov es:[0720h+si+bx],ax mov al,2h mov byte ptr es:[0721h+si+bx],al inc bx inc si loop s0 mov cx,10h mov bx,0 mov si,0 s1:mov ax,[bx] mov es:[07c0h+si+bx],ax mov al,24h mov byte ptr es:[07c1h+si+bx],al inc bx inc si loop s1 mov cx,10h mov bx,0 mov si,0 s2:mov ax,[bx] mov es:[0860h+si+bx],ax mov al,71h mov byte ptr es:[0861h+si+bx],al inc bx inc si loop s2 mov ax,4c00h int 21h code ends end start 改成子程序形式
下面是将代码改写成子程序形式的程序:
```
assume ds:data, cs:code
data segment
db 'welcome to masm!'
db 2H,24H,71H
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0B800H
mov es,ax
call print_string_attr_1
call print_string_attr_2
call print_string_attr_3
mov ax,4c00h
int 21h
print_string_attr_1:
mov cx,10h
mov bx,0
mov si,0
s0:
mov ax,[bx]
mov es:[0720h+si+bx],ax
mov al,2h
mov byte ptr es:[0721h+si+bx],al
inc bx
inc si
loop s0
ret
print_string_attr_2:
mov cx,10h
mov bx,0
mov si,0
s1:
mov ax,[bx]
mov es:[07c0h+si+bx],ax
mov al,24h
mov byte ptr es:[07c1h+si+bx],al
inc bx
inc si
loop s1
ret
print_string_attr_3:
mov cx,10h
mov bx,0
mov si,0
s2:
mov ax,[bx]
mov es:[0860h+si+bx],ax
mov al,71h
mov byte ptr es:[0861h+si+bx],al
inc bx
inc si
loop s2
ret
code ends
end start
```
以上程序将每个循环改写成了一个子程序,分别是print_string_attr_1、print_string_attr_2和print_string_attr_3。在主程序中调用这三个子程序即可完成字符串及属性值输出到80×25彩色字符模式显示缓冲区的操作。
阅读全文