编写一个MBR程序,在计算机屏幕显示自己的姓名拼音,拼音后紧跟学号,并计算出上述字符的ASCII值的总和并以十进制形式显示出来。
时间: 2024-02-29 14:52:33 浏览: 184
好的,以下是一个简单的MBR程序,可以实现您的要求:
```
org 07c00h ; 程序加载到0x7c00处
bits 16 ; 16位模式
start:
mov ax, cs ; 初始化段寄存器
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7c00 ; 设置栈指针
; 显示姓名拼音
mov ah, 0x0e ; BIOS中断13h,功能号0Eh用于在屏幕上输出字符
mov al, 'L'
int 10h
mov al, 'i'
int 10h
mov al, 'u'
int 10h
mov al, ' '
int 10h
mov al, 'Y'
int 10h
mov al, 'a'
int 10h
mov al, 'n'
int 10h
mov al, 'g'
int 10h
mov al, ' '
int 10h
mov al, '2'
int 10h
mov al, '0'
int 10h
mov al, '7'
int 10h
mov al, '1'
int 10h
mov al, '0'
int 10h
mov al, '5'
int 10h
mov al, '0'
int 10h
; 计算ASCII总和
mov bx, 0 ; 初始化bx寄存器为0
mov cx, 15 ; 设置循环次数,即字符数
mov si, msg ; 设置源字符串地址
calc_sum:
lodsb ; 从si寄存器指向的地址取出一个字节存入al寄存器中,并将si寄存器加1
add bx, ax ; 计算ASCII总和
loop calc_sum ; 循环
; 显示ASCII总和
mov ah, 0x0e
mov al, ' '
int 10h
mov al, 'A'
int 10h
mov al, 'S'
int 10h
mov al, 'C'
int 10h
mov al, 'I'
int 10h
mov al, 'I'
int 10h
mov al, ':'
int 10h
mov ax, bx ; 将ASCII总和存入ax寄存器中
call print_num ; 调用打印数字的子程序
; 无限循环
cli ; 清除中断标志位,禁止中断
hlt ; 让CPU休眠直到下一次中断
jmp $ ; 无限循环
; 子程序:打印数字
print_num:
push ax ; 保存ax寄存器
push bx ; 保存bx寄存器
mov bx, 10 ; 将除数设为10
xor cx, cx ; 初始化cx寄存器为0
mov dx, 0 ; 初始化dx寄存器为0
div_loop:
xor dx, dx ; 清除dx寄存器
div bx ; 将ax寄存器除以bx寄存器,商存入ax寄存器,余数存入dx寄存器
push dx ; 将余数压入栈中
inc cx ; 增加循环次数
test ax, ax ; 如果ax寄存器中的值不为0,继续循环
jnz div_loop
print_loop:
pop dx ; 将栈顶元素弹出到dx寄存器
add dl, '0' ; 将余数转换为ASCII码
mov ah, 0x0e ; 调用BIOS中断13h,功能号0Eh在屏幕上输出字符
int 10h
loop print_loop ; 循环
pop bx ; 恢复bx寄存器
pop ax ; 恢复ax寄存器
ret ; 返回
msg db 'Liu Yang 201050', 0 ; 姓名拼音和学号字符串,最后一个0表示字符串结束符
times 510-($-$$) db 0 ; 填充0,使程序长度达到512字节
dw 0xaa55 ; MBR引导标志
```
您可以使用汇编器将上述代码编译为二进制文件,并使用软件将其写入磁盘的MBR扇区。当您启动计算机时,该程序将自动执行,并在屏幕上显示您的姓名拼音和学号,以及它们的ASCII值总和。
阅读全文