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 17:53:03 浏览: 23
好的,将代码改写成子程序如下:
```
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
好的,我可以将这段代码改写成一个子程序,以方便在其他程序中调用。下面是改写后的代码:
```
assume cs:code
data segment
db 'welcome to masm!'
db 2,36,113 ; 颜色
data ends
code segment
; 显示字符串的子程序
print_string:
push ax bx cx dx si di bp
; 参数传递:
; ax - 字符串的地址
; bx - 字符串的长度
; cx - 字符串的颜色属性
; dx - 字符串在屏幕上的偏移量
; bp - 字符串在显存中的偏移量
mov si, ax
mov cx, bx
mov di, dx
mov bp, 0b800h
add bp, dx
mov ah, cl
s:
push cx
mov cl, 16
s1:
mov al, [si]
mov word ptr [bp], ah
add bp, 2
add si, 1
loop s1
pop cx
add bp, 128
add di, 160
loop s
pop bp di si dx cx bx ax
ret
start:
mov ax, data
mov ds, ax
mov bx, 16
mov di, 16
mov ax, 0b800h
mov es, ax
mov si, 16012+352
mov cx, 3
mov ax, offset data ; 字符串的地址
mov bx, 16 ; 字符串的长度
mov cx, 113 ; 字符串的颜色属性
mov dx, 16 ; 字符串在屏幕上的偏移量
call print_string ; 调用子程序显示字符串
mov ax, 4c00h
int 21h
code ends
end start
```
这里定义了一个名为`print_string`的子程序,将字符串、长度、颜色属性、在屏幕上的偏移量和在显存中的偏移量作为参数传递进去。在子程序中,使用`push`指令保存寄存器的值,使用`mov`指令将参数加载到寄存器中,并使用`add`指令计算出在显存中的偏移量。然后,使用嵌套循环的方式将字符串逐行显示在屏幕上。最后,使用`pop`指令恢复寄存器的值,并使用`ret`指令返回到调用点。
在主程序中,定义了字符串的地址、长度、颜色属性、在屏幕上的偏移量,并调用`print_string`子程序显示字符串。
以子程序的形式改写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,160*12+35*2 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
以下是将该段代码改写为子程序的示例:
```assembly
; 定义数据段
data segment
db 'welcome to masm!'
db 2,36,113 ;颜色
data ends
; 定义代码段
code segment
assume cs:code, ds:data
; 定义子程序
print_string proc
push ax bx cx dx si di bp
mov si, 0
mov di, 0
mov bl, 0 ; 颜色
mov ah, 0x0e ; BIOS中断中用于输出字符的函数号
loop_start:
mov al, [string+si] ; 从数据段中读取字符
cmp al, 0 ; 判断是否已经读取到字符串末尾
je loop_end
mov ah, [color+si] ; 从数据段中读取颜色
mov bh, 0 ; BIOS中断中用于输出字符的页面号
mov cx, 1 ; 输出一个字符
int 0x10 ; 调用BIOS中断输出字符
inc si
jmp loop_start
loop_end:
pop bp di si dx cx bx ax
ret
print_string endp
start:
mov ax, data
mov ds, ax
call print_string ; 调用子程序输出字符串
mov ax, 4c00h
int 21h
code ends
end start
```
该程序使用了一个名为`print_string`的子程序,该子程序会将数据段中的字符串以及颜色输出到屏幕上。在主程序中,通过调用该子程序实现字符串的输出。