编写一个可以在emu8086上运行的MBR程序,在计算机屏幕显示“21210929周何昊然”,并计算出上述字符的ASCII值的总和并以十进制形式显示出来
时间: 2024-03-20 17:41:35 浏览: 28
下面是一个可以在emu8086上运行的MBR程序,实现了您的要求:
```
ORG 0x7c00 ; 指定程序在内存中的加载地址
start:
mov ax, 0x07c0 ; 设置数据段寄存器
mov ds, ax
mov si, msg ; 设置消息字符串首地址
call print_str ; 调用打印字符串的函数
mov si, msg ; 重新设置消息字符串首地址
call calc_sum ; 调用计算总和的函数
mov ah, 0x0e ; 用于向屏幕输出字符的BIOS中断号
mov al, ' ' ; 输出一个空格
int 0x10
mov ax, bx ; 将总和保存在ax寄存器中
call print_num ; 调用打印数字的函数
jmp $ ; 无限循环
; 打印字符串的函数
print_str:
lodsb ; 读取一个字符到al寄存器
or al, al ; 判断是否到了字符串末尾
jz done ; 如果到了,结束函数
mov ah, 0x0e ; 用于向屏幕输出字符的BIOS中断号
int 0x10 ; 调用BIOS中断输出字符
jmp print_str ; 继续输出下一个字符
done:
ret
; 计算总和的函数
calc_sum:
xor bx, bx ; 将bx寄存器清零
next_char:
lodsb ; 读取一个字符到al寄存器
or al, al ; 判断是否到了字符串末尾
jz done ; 如果到了,结束函数
add bl, al ; 把当前字符的ASCII值加到低8位中
adc bh, 0 ; 把进位加到高8位中
jmp next_char ; 继续处理下一个字符
done:
ret
; 打印数字的函数
print_num:
push ax ; 保存ax寄存器的值
push bx ; 保存bx寄存器的值
mov cx, 10 ; 用于除法的除数
xor bx, bx ; 将bx寄存器清零
next_digit:
xor dx, dx ; 将dx寄存器清零
div cx ; 用ax寄存器的值除以cx寄存器的值
add dl, '0' ; 将余数转换为ASCII码
mov ah, 0x0e ; 用于向屏幕输出字符的BIOS中断号
int 0x10 ; 调用BIOS中断输出字符
or ax, ax ; 判断是否除尽了
jnz next_digit ; 如果没有,继续处理下一位数字
pop bx ; 恢复bx寄存器的值
pop ax ; 恢复ax寄存器的值
ret
msg db "21210929周何昊然", 0 ; 消息字符串,以0结尾
```
这个程序使用了三个函数:`print_str`用于打印字符串,`calc_sum`用于计算总和,`print_num`用于打印数字。程序首先调用`print_str`函数打印出消息字符串,然后调用`calc_sum`函数计算出总和,并保存在`bx`寄存器中。最后调用`print_num`函数将总和以十进制形式打印出来。程序最后进入一个无限循环,保持程序运行。
请将这个程序保存为一个以`.asm`为后缀的文件,并使用emu8086汇编器进行汇编和链接,然后在emu8086模拟器中运行即可。
阅读全文