题目:
编写一段主引导扇区程序,计算从1加到1000的和,并在屏幕上显示结果
输出结果:
代码:
TypeScript
jmp near start
text db '1+2+3+...+1000='
start:
mov ax,0x07c0
mov ds,ax ;数据段从主引导区开始
mov ax,0xb800
mov es,ax ;显存地址从B8000物理地址开始
mov si,text ;si指向text的第一个字符
mov di,0
mov cx,start-text
s1:
mov al,[si]
mov [es:di],al ;保存字符
inc di
mov byte [es:di],0x07 ;保存字符属性:黑底白字
inc si
inc di
loop s1 ;显示'1+2+3+...+1000='
xor ax,ax
xor dx,dx
mov cx,1000
s2:
add ax,cx
adc dx,0 ;dx=0+CF
loop s2 ;累加1~1000,结果为dx:ax(dx高16位,ax低16位)
;此循环结束后,cx为0不用再次清零
mov ss,cx ;设置栈的段地址
mov sp,cx ;设置栈指针
mov bx,10 ;设置除数
s3:
inc cx ;cx记录条件循环次数(数位+1)
div bx ;(dx:ax)÷bx(为10)=ax......dx
or dl,0x30 ;把数字转换为字符
push dx ;余数进栈保存
xor dx,dx ;dx清0准备下一次除
cmp ax,0 ;商为0提前退出,提高效率
jne s3
s4:
pop dx
mov [es:di],dl
inc di
mov byte [es:di],0x07
inc di
loop s4 ;显示各个数位,可参考s1循环
jmp near $
times 510-($-$$) db 0 ;填满至512字节
db 0x55,0xaa ;结尾格式必须写
点我下载编译后产生的bin文件(写入主引导扇区后可在VirtualBox上运行)
具体怎么将bin文件写入主引导扇区见此文汇编语言在虚拟机中输出"Hello World!"
注意事项:
1.s1循环中,最后一定要加inc di,否则新写入的数据会被覆盖!
2.s3循环中,一定是保存完dx后再为dx清零