1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| ;主引导程序 ; 起始编译地址是 0x7c00 SECTION MBR vstart=0x7c00 mov ax,cs mov ds,ax mov es,ax mov ss,ax mov fs,ax mov sp,0x7c00
; 使用BIOS 显示服务(Video Service)--INT 10H ;;;;;;;;; 下面这三行代码是获取光标位置 ;;;;;;;;; ;.get_cursor获取当前光标位置,在光标位置处打印字符. mov ah, 3 ; 输入: 3号子功能是获取光标位置,需要存入ah寄存器 mov bh, 0 ; bh寄存器存储的是待获取光标的页号
int 0x10 ; 输出: ch=光标开始行,cl=光标结束行 ; dh=光标所在行号,dl=光标所在列号
;;;;;;;;; 获取光标位置结束 ;;;;;;;;;;;;;;;;
;;;;;;;;; 打印字符串 ;;;;;;;;;;; ;还是用10h中断,不过这次是调用13号子功能打印字符串 mov ax, message mov bp, ax ; es:bp 为串首地址, es此时同cs一致, ; 开头时已经为sreg初始化
; 光标位置要用到dx寄存器中内容,cx中的光标位置可忽略 mov cx, 8 ; cx 为串长度,不包括结束符0的字符个数 mov ax, 0x1301 ; 子功能号13是显示字符及属性,要存入ah寄存器, ; al设置写字符方式 ah=01: 显示字符串,光标跟随移动 mov bx, 0x2 ; bh存储要显示的页号,此处是第0页, ; bl中是字符属性, 改颜色,要不看不见 int 0x10 ; 执行BIOS 0x10 号中断 ;;;;;;;;; 打字字符串结束 ;;;;;;;;;;;;;;;
jmp $ ; ; 死循环
message db "TEST MBR" ; 字符串定义 ; 保证 MBR 512B times 510-($-$$) db 0 db 0x55,0xaa
|