请问这段程序的作用是:org 07c00h ; 告诉编译器程序加载到7c00处 mov ax, cs mov ds, ax mov es, ax call DispStr ; 调用显示字符串例程jmp $ ; 无限循环,$代表当前汇编行的地址DispStr: mov ax, BootMessage ; 把BootMessage的首地址传给寄存器ax mov bp, ax ; ES:BP = 串地址 mov cx, 16 ; CX = 串长度 mov ax, 01301h ; AH = 13, AL = 01h mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮) mov dl, 0 int 10h ; 10h 号中断 ret BootMessage: db "Hello, MY OS!" ; 想要开机后在屏幕上显示的字符串 times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节 $$表示一个section的开始处汇编后地址 dw 0xaa55 ; 结束标志
时间: 2023-06-07 17:10:42 浏览: 170
这段程序的作用是启动操作系统并在屏幕上显示“Hello, MY OS!”。程序会将BootMessage字符串的首地址传给寄存器ax并调用DispStr子程序,将字符串显示在屏幕上。程序最后跳转到当前汇编行的地址,无限循环等待用户输入。 这是一个操作系统的引导程序,其首地址为0x7c00,大小为512字节,最后两个字节为0xaa55作为结束标志。程序运行时,BIOS会将其加载到内存中,并跳转到该位置开始执行。
相关问题
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彩色字符模式显示缓冲区的操作。
assume cs:code,ds:data data segment db 'welcome to masm!' db 2H,24H,71H ;字符串属性值 data ends code segment display PROC near push ax ; 保存ax寄存器的内容 push bx ; 保存bx寄存器的内容 push cx ; 保存cx寄存器的内容 push si ; 保存si寄存器的内容 mov ax,0b800H mov es,ax ;80×25彩色字符模式显示缓冲区段地址送入es mov cx,10h ; 计数器cx置为16进制10 mov bx,0 ; 将bx寄存器清零 mov si,0 ; 将si寄存器清零 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 pop si pop cx pop bx pop ax ret display ENDP start: mov ax,data mov ds,ax ;字符串及属性值所在段的段地址送入ds call display mov ax,4c00h int 21h code ends end start在该代码中加入详细的注释
; 假设 cs:code,ds:data
data segment
db 'welcome to masm!' ; 数据段定义了一个字符串 'welcome to masm!'
db 2H,24H,71H ; 数据段定义了三个字节的属性值,用于控制字符显示颜色
data ends
code segment
display PROC near
push ax ; 保存ax寄存器的内容
push bx ; 保存bx寄存器的内容
push cx ; 保存cx寄存器的内容
push si ; 保存si寄存器的内容
mov ax,0b800H ; 将80×25彩色字符模式显示缓冲区段地址送入ax寄存器
mov es,ax ; 将ax寄存器中的地址值送入es寄存器
mov cx,10h ; 将计数器cx置为16进制10
mov bx,0 ; 将bx寄存器清零
mov si,0 ; 将si寄存器清零
s0: ; 循环读取数据段中的值并将其写入显示缓冲区段
mov ax,[bx] ; 从数据段中读取一个字节,存入ax寄存器
mov es:[0720h+si+bx],ax ; 将ax寄存器中的值写入显示缓冲区段中
mov al,2h ; 将属性值 2H 存入 al 寄存器
mov byte ptr es:[0721h+si+bx],al ; 将属性值写入显示缓冲区段中
inc bx
inc si
loop s0 ; 循环执行,直到计数器cx递减为0
mov cx,10h ; 将计数器cx置为16进制10
mov bx,0 ; 将bx寄存器清零
mov si,0 ; 将si寄存器清零
s1: ; 循环读取数据段中的值并将其写入显示缓冲区段
mov ax,[bx]
mov es:[07c0h+si+bx],ax
mov al,24h ; 将属性值 24H 存入 al 寄存器
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 ; 将属性值 71H 存入 al 寄存器
mov byte ptr es:[0861h+si+bx],al
inc bx
inc si
loop s2
pop si ; 恢复寄存器内容
pop cx
pop bx
pop ax
ret
display ENDP
start:
mov ax,data ; 将数据段地址送入ax寄存器
mov ds,ax ; 将ax寄存器中的地址值送入ds寄存器
call display ; 调用显示函数
mov ax,4c00h ; 将程序终止码送入ax寄存器
int 21h ; 调用DOS系统功能中断
code ends
end start ; 程序结束标记
阅读全文