编写一个MBR简单的程序,在计算机屏幕显示自己的姓名拼音(XuXiaochen),拼音后紧跟学号21211501,并计算出上述字符的ASCII值的总和并以十进制形式显示出来。
时间: 2024-03-02 13:48:34 浏览: 222
好的,这是一个比较简单的任务,以下是代码:
```assembly
org 0x7c00
start:
; 设置段寄存器
xor ax, ax
mov ds, ax
mov es, ax
; 显示姓名拼音
mov ah, 0x0e ; BIOS中断0x10的功能号,用于显示字符
mov al, 'X'
int 0x10
mov al, 'u'
int 0x10
mov al, 'X'
int 0x10
mov al, 'i'
int 0x10
mov al, 'a'
int 0x10
mov al, 'o'
int 0x10
mov al, 'c'
int 0x10
mov al, 'h'
int 0x10
mov al, 'e'
int 0x10
mov al, 'n'
int 0x10
; 显示学号
mov ah, 0x0e
mov al, '2'
int 0x10
mov al, '1'
int 0x10
mov al, '2'
int 0x10
mov al, '1'
int 0x10
mov al, '1'
int 0x10
mov al, '5'
int 0x10
mov al, '0'
int 0x10
mov al, '1'
int 0x10
; 计算ASCII值总和
mov bx, 0 ; BX用于累加ASCII值
mov cx, 18 ; 循环计数器,18为姓名拼音和学号的字符总数
sum_loop:
mov al, [start + cx] ; 从内存中读取字符
add bx, ax ; 累加ASCII值
loop sum_loop
; 显示ASCII值总和
mov ah, 0x0e
mov al, ' '
int 0x10
mov ax, bx ; 把ASCII值总和存到AX寄存器
call print_decimal ; 调用一个函数,用于十进制数的显示
jmp $ ; 死循环
; 十进制数的显示函数
print_decimal:
push bx ; 保存BX寄存器
mov bx, 10 ; BX用于10的除法
xor cx, cx ; CX用于循环计数
cmp ax, 0 ; 如果AX等于0,直接显示0
jne print_decimal_loop
mov al, '0'
int 0x10
jmp print_decimal_end
print_decimal_loop:
xor dx, dx ; DX用于存放余数,先清零
div bx ; 除以10,商在AL,余数在AH
push dx ; 把余数压入堆栈中
inc cx ; 计数器加1
cmp ax, 0 ; 如果商等于0,退出循环
jne print_decimal_loop
print_decimal_display:
pop dx ; 从堆栈中弹出余数
add dl, '0' ; 把余数转换成字符
mov ah, 0x0e ; 显示字符
int 0x10
loop print_decimal_display
print_decimal_end:
pop bx ; 恢复BX寄存器
ret ; 返回
times 510-($-$$) db 0 ; 填充剩余的空间
dw 0xaa55 ; MBR的结束标志
```
注意,这个程序是一个MBR程序,只占用了512字节的空间,不需要链接其他文件,也不需要操作系统的支持。可以使用汇编器把它编译成二进制文件,然后使用dd命令把它写入硬盘的MBR区域,就可以在启动时加载并执行它了。
阅读全文