今天正式开始照猫画虎了——对着书抄代码。从Boot Sector 开始:
; PC通电启动后,由内存地址 FFFF:0000(ROM中) 处开始,执行一个 jump 指令, ; 跳转到另一个 ROM 位置开始自检(RAM、keyboard、显示器、软硬磁盘等)。 ; 之后控制权转移给 ROM 中的启动程序,将引导盘上的 Boot Sector 读入内存绝对位置 07C00h 处。 ; 然后 JUMP 到 0X7C00 处,开始后运行 Boot Sector 程序。 org 07c00h ; org 指令告诉编译器本程序将要被加载到内存的起始地址, ; 编译器会把本程序中所有用到的段内偏移地址自动加上 org 后跟随的数值。 ; org 指令指示地址偏移调整是编译期概念,只影响内存寻址指令的编译, ; 编译产生的程序已经加上偏移量。 mov ax, cs mov ds, ax mov es, ax call DispStr jmp $ ; 显示字符串 DispStr: mov ax, BootMessage ; 变量和标签无区别,无[]为地址,有[]为值 mov bp, ax ; es:bp = 字符串地址 mov cx, 16 ; cx = 字符串长度 mov ax, 1301h ; ah = 功能号(13h,在Teletype模式下显示字符串), ; al = 显示方式(01h,显示属性在BL中,光标跟随移动) mov bx, 000Ch ; bh = 页号(0h), bl =(AL = 0、1时)显示属性(0Ch,黑底红字) mov dx, 0 ; DH、DL = 起始行、列 int 10h ret BootMessage: db ‘Hello, World!‘, 0 times 510 - ($ - $$) db 0 ; $ = 编译后本行的地址,$$ = 编译后本节的起始地址 ; times = 重复 dw 0xAA55 ; Boot Sector 最后2个字节为 0xAA55,表示这是启动程序
编译,用昨天写的小程序覆写,虚拟机加载启动。。。。。。成功!
时间: 2024-10-16 10:03:08