第一次编写,参考别人的实现了下。

实验环境及工具

  • ubuntu 14.0
  • nasm

思路:

  • 写一段汇编代码,输出 Hello, World
  • 将该段代码写入软盘镜像的第一个扇区
  • 安装virtualbox创建一个操作系统,从软盘镜像引导,查看结果

引导区代码

 1  ;; BIOS会把512字节的引导扇区加载到 0000:7c00 处,
 2     ;; 然后跳转到0000:7c00处,将控制权交给引导代码。
 3     org 07c00h                  ;这一行告诉编译器,我们的代码将被加载到7c00处。
 4     mov ax, cs                  ;将代码段寄存器的值送入AX
 5     mov ds, ax                  ;将数据段的地址置为代码段的地址?
 6     mov es, ax                  ;将附加段的地址置为代码段的地址?
 7     call  DispStr               ;调用显示字符串例程
 8     jmp $                       ;无限循环, $表示当前行编译后的地址
 9     ;; 以上就是整个程序的执行过程了
10     ;; 下面是DispStr子程序
11 DispStr:
12     mov ax, BootMessage         ;将字符串首地址传给寄存器ax
13     mov bp, ax                  ;CPU将用ES:BP来寻址字符串
14     mov cx, 16                  ;通过CX,CPU知道字符串的长度
15     mov ax, 01301h              ;AH=13表示13号中断, AL=01H,表示目标字符串仅仅包含字符,属性在BL中包含,移动光标
16     mov bx, 000ch               ;黑底红字, BL=0CH,高亮
17     mov dl, 0                   ;dh表示在第几行显示,dl表示第几列显示
18     int 10h                     ;BIOS的10H中断的13号中断用于显示字符串
19     ret
20 BootMessage:    db "Hello, OS world!" ;对NASM来讲,标号和变量的作用一样, db表示define byte
21     ;; $当前行被汇编后的地址,$$表示一个section开始处的地址,本程序只有一个section,所以指0x7c00
22     times 510-($-$$) db 0           ;填充剩下空间,使生成的二进制恰好为512字节
23     dw 0xaa55                       ;结束标志,如果发现扇区以0xAA55结束,则BIOS认为它是一个引导扇区,dw表示define word
View Code

相关文章:

  • 2022-12-23
  • 2021-10-12
  • 2022-01-06
  • 2021-08-18
  • 2022-12-23
  • 2021-12-08
  • 2022-01-01
猜你喜欢
  • 2021-12-20
  • 2021-12-20
  • 2021-12-05
  • 2021-10-03
  • 2022-01-05
  • 2021-11-27
相关资源
相似解决方案