assume cs:code data segment db 'welcome to masm!' db 2,36,113 data ends code segment start: mov ax,data mov ds,ax mov bx,0 mov di,16 mov ax,0b800h mov es,ax mov si,16012+352 mov cx,3 s: mov ah,ds:[di] push cx mov cx,16 s1: mov al,ds:[bx] mov es:[si],ax add si,2 inc bx loop s1 pop cx add si,128 inc di mov bx,0 loop s mov ax,4c00h int 21h code ends end start改成子程序
时间: 2024-02-29 13:53:03 浏览: 137
好的,将代码改写成子程序如下:
```
assume cs:code
data segment
db 'welcome to masm!'
db 2,36,113
data ends
code segment
start:
mov ax, data
mov ds, ax
call displayMessage
mov ax, 4c00h
int 21h
displayMessage:
push bx
push di
push si
mov bx, 0
mov di, 16
mov ax, 0b800h
mov es, ax
mov si, 16012+352
mov cx, 3
s:
mov ah, ds:[di]
push cx
mov cx, 16
s1:
mov al, ds:[bx]
mov es:[si], ax
add si, 2
inc bx
loop s1
pop cx
add si, 128
inc di
mov bx, 0
loop s
pop si
pop di
pop bx
ret
code ends
end start
```
相关问题
assume cs:code data segment db 'welcome to masm!' db 2,36,113 ;颜色 data ends code segment start: mov ax,data mov ds,ax mov bx,0 mov di,16 mov ax,0b800h mov es,ax mov si,16012+352 mov cx,3 s: mov ah,ds:[di] push cx mov cx,16 s1: mov al,ds:[bx] mov es:[si],ax add si,2 inc bx loop s1 pop cx add si,128 inc di mov bx,0 loop s mov ax,4c00h int 21h code ends end start
这是一个简单的汇编语言程序,使用了MASM汇编器。程序的功能是在屏幕上输出一句话“welcome to masm!”,并将其以蓝色和红色的方式高亮显示。其中,使用了数据段来存储输出的字符串和颜色信息,使用了代码段来定义程序的执行逻辑。在程序开始时,将数据段的地址存储到DS寄存器中,将代码段的地址存储到AX寄存器中,将DS的值存储到AX寄存器中,将0b800h存储到AX寄存器中,将ES的值存储到AX寄存器中。接下来,使用循环语句将字符串和颜色信息输出到屏幕上。最后,使用int 21h调用DOS中断来结束程序的执行。
改写assume cs:code data segment db 'welcome to masm!' db 2,36,113 data ends code segment start: mov ax,data mov ds,ax mov bx,0 mov di,16 mov ax,0b800h mov es,ax mov si,16012+352 mov cx,3 s: mov ah,ds:[di] push cx mov cx,16 s1: mov al,ds:[bx] mov es:[si],ax add si,2 inc bx loop s1 pop cx add si,128 inc di mov bx,0 loop s mov ax,4c00h int 21h code ends end start成子程序
在MASM中,可以使用PROC指令来定义子程序,改写后的代码如下:
data segment
db 'welcome to masm!'
db 2,36,113
data ends
code segment
start:
assume cs:code, ds:data ; 设置代码段和数据段的默认选择器
mov ax,data
mov ds,ax
mov bx,0
mov di,16
mov ax,0b800h
mov es,ax
mov si,16012+352
mov cx,3
s:
mov ah,[di] ; 读取数据段中的字符
push cx
mov cx,16
s1:
mov al,[bx] ; 读取数据段中的字符
mov es:[si],ax
add si,2
inc bx
loop s1
pop cx
add si,128
inc di
mov bx,0
loop s
jmp exit ; 跳转到退出子程序的标号
; 定义一个子程序
print_string PROC
push ax bx cx dx si di
mov ah,0Eh ; 调用DOS的INT 10h中断输出字符
mov si,0 ; 字符串索引为0
mov di,16012+352 ; 显示缓冲区地址
mov al,[si] ; 读取字符串中的字符
jmp .compare
.print:
int 10h ; 输出字符
add di,2 ; 增加显示缓冲区地址
add si,1 ; 增加字符串索引
.compare:
cmp al,0 ; 字符串是否结束
jne .print ; 如果没有结束,继续输出
pop di si dx cx bx ax ; 恢复寄存器
ret ; 返回
print_string ENDP
exit:
mov ax,4c00h
int 21h
code ends
end start
在主程序中,我们定义了一个名为print_string的子程序,用来输出字符串。在主程序中,我们只需要调用print_string即可输出字符串,代码更加简洁易懂。
阅读全文