当前位置:   article > 正文

简单的boot引导的实现代码(内有详细注解,asm INT10的使用)_引导软件代码

引导软件代码
  1. # boot引导
  2. org 0x7c00 # org 用于指定程序的起始地址 BIOS会加载引导程序到内存地址0x7c00处
  3. BaseofStack equ 0x7c00 # 将标识符BaseOfStack 等价为数值0x7c00
  4. Label_Start:
  5. mov ax, cs ; 将寄存器cs的段基地址设置到DS ES SS等寄存器中,以及设置栈寄存器SP
  6. mov ds, ax
  7. mov es, ax
  8. mov ss, ax
  9. mov sp, BaseofStack # sp栈指针寄存器
  • ; 首先 cpu中寄存器用于存储内存中数据的物理地址
  • ; cs为代码段寄存器,一般用于存放代码;
  • ; 通常和IP 使用用于处理下一条执行的代码
  • ; cs:IP
  • ; 基地址:偏移地址
  • ; cs地址对应的数据 相当于c语言中的代码语句
  • ; ds 为数据段寄存器,一般用于存放数据;
  • ; ds地址对应的数据 相当于c语言中的全局变量
  • ; ss 为栈段寄存器,一般作为栈使用 和sp搭档;
  • ; ss地址对应的数据 相当于c语言中的局部变量
  • ; ss相当于堆栈段的首地址  sp相当于堆栈段的偏移地址
  • ; es 为扩展段寄存器;

=========================================================================

  • ;这段代码使用BIOS中断服务程序INT 10h的主功能编号有06h、02h和13h,它们的功能及参数说明如下。
  • ; ●上卷指定范围的窗口(包括清屏功能)
  • ; BIOS中断服务程序INT 10h的主功能号AH=06h可以实现按指定范围滚动窗口的功能,同时也具备清屏功能,具体寄存器参数说明如下。
  • ; INT 10h,AH=06h功能:按指定范围滚动窗口。AL=滚动的列数,若为0则实现清空屏幕功能;BH=滚动后空出位置放入的属性;
  • ; CH=滚动范围的左上角坐标列号;CL-滚动范围的左上角坐标行号;DH=滚动范围的右下角坐标列号;DL=滚动范围的右下角坐标行号;BH=颜色属性。
  • ; bit 0~2:字体颜色(0:黑,1:蓝,2:绿,3:青,4:红,5:紫,6:综,7:白)bit 3 :字体亮度(0:字体正常,1:字体高亮度)。
  • ; bit 4~6:背景颜色(0:黑,1:蓝,2:绿,3:青,4:红,5:紫,6:综,7:白)。bit 7:字体闪烁(0:不闪烁,1:字体闪烁)。
  • ; 这条命令主要用于按指定范围滚动窗口,但是如果AL=0的话,则执行清屏功能。在使用清屏功能时(AL寄存器为0 ),其他BX、CX、DX寄存器参数将不起作用,读者无需纠结它们的数值。
  1. ;===============clear screen 上卷指定范围窗口
  2. mov ax, 0600h
  3. mov bx, 0700h
  4. mov cx, 0000h
  5. mov dx, 0184fh
  6. int 10h

=========================================================================

  • ; ●设置屏幕光标位置
  • ; BIOS中断服务程序INT 10h的主功能号AH=02h可以实现屏幕光标位置的设置功能,具体寄存器参数说明如下。
  • ; INT 10h,AH=O2h功能:设定光标位置。DH=游标的列数;
  • ; DL=游标的行数;BH=页码。
  • ; 这条语句的目的是,将屏幕的光标位置设置在屏幕的左上角(0,0)处。不论是行号还是列号,它们皆从0开始计数,屏幕的列坐标0点和行坐标0点位于屏幕的左上角,纵、横坐标分别向下和向右两个方向延伸,或者说坐标原点位于屏幕左上角。
  1. ;===============set focus 设置光标位置
  2. mov ax, 0200h
  3. mov bx, 0000h
  4. mov dx, 0000h
  5. int 10h

=========================================================================

  • ; ●显示字符串
  • ; BIOS中断服务程序INT 10h的主功能号AH=13h可以实现字符串的显示功能,具体寄存器参数说明如下。
  • ; INT 10h,AH=13h 功能:显示一行字符串。AL=写入模式。
  • ; AL=00h:字符串的属性由BL寄存器提供,而CX寄存器提供字符串长度(以B为单位),显示后光标位置不变,即显示前的光标位置。
  • ; AL=01h:同AL=00h,但光标会移动至字符串尾端位置。
  • ; AL=02h:字符串属性由每个字符后面紧跟的字节提供,故CX寄存器提供的字符串长度改成以Word为单位,显示后光标位置不变。
  • ; AL=03h:同AL=02h,但光标会移动至字符串尾端位置。CX=字符串的长度。
  • ; DH=游标的坐标行号。DL=游标的坐标列号。
  • ; ES:BP=→>要显示字符串的内存地址。BH=页码。
  • ; BL=字符属性/颜色属性。
  • ; bit 0~2:字体颜色(0:黑,1:蓝,2:绿,3:青,4:红,5:紫,6:综,7:白)。bit 3 :字体亮度(0:字体正常,1:字体高亮度)。
  • ; bit 4~6:背景颜色(0:黑,1:蓝,2:绿,3:青,4:红,5:紫,6:综,7:白)。bit 7:字体闪烁(0:不闪烁,1:字体闪烁)。
  • ; 字符串的显示功能,算是BIOS中断服务程序中使用比较频繁的功能。该功能不仅可以显示字符串、设定字体的前景色和背景色,还可以设置待显示字符串的坐标位置。此功能非常适合显示不同的日志信息,因此在后续开发过程中将会多次使用到。
  1. ;============display on screen : start booting....
  2. mov ax, 1301h
  3. mov bx, 000fh
  4. mov dx, 0000h
  5. mov cx, 10
  6. push ax
  7. mov ax, ds
  8. mov es, ax
  9. pop ax
  10. mov bp, startBootMessage
  11. int 10h

=========================================================================

  • 这段汇编代码实现了软盘驱动器的复位功能,它相当于重新初始化了一次软盘驱动器,从而将软盘驱动器的磁头移动至默认位置。整个复位过程是通过BIOS中断服务程序INT 13h的主功能号AH=00h实现的,具体寄存器参数说明如下。
  • INT 13h,AH=O0h功能:重置磁盘驱动器,为下一次读写软盘做准备。DL=驱动器号,00H~7FH:软盘;80H~OFFH:硬盘。
  • DL=00h代表第一个软盘驱动器(“drive A:”);
  • DL=01h代表第二个软盘驱动器(“drive B:”);DL=80h代表第一个硬盘驱动器;
  • DL=81h代表第二个硬盘驱动器。
     
  1. ;======== reset floppy
  2. xor ah,ah
  3. xor dl,dl
  4. jmp $

=========================================================================

  • ; 首先定义一个字符串"start Boot",并取名为startBootMessage,汇编代码startBootMessage: db "Start Boot"可以理解为C语言中的一维字符数组,而标识符startBootMessage可以看作数组名。
  • ; 汇编代码
    times 510 - ($ - $$ ) db 0
    其中,表达式
    $ - $$
    的意思是,将当前行被编译后的地址(机器码地址)减去本节(Section )程序的起始地址。由于Boot引导程序只有一个以0x7c00为起始地址的节,那么表达式
    $ - $$
    的作用是计算出当前程序生成的机器码长度,进而可知引导扇区必须填充的数据长度
    (510 -($ - $$) )
    又因为软盘是个块设备,访问块设备的特点是每次必须以扇区为单位(512B),而times伪指令恰好可以实现多次重复操作,所以这行汇编代码的目的是,通过times伪指令填充引导扇区剩余空间,以保证生成的文件大小为512B。
  • ; 最后,再将一个字(0xaa55 )填充到程序的末尾。此处请注意,已经提到引导扇区是以0x55和0xaa两个字节作为结尾,由于Intel处理器是以小端模式存储数据,那么用一个字表示0x55和0xaa就应该是0xaa55,这样它在扇区里的存储顺序才是0x55、0xaa。
  1. startBootMessage: db "start Boot"
  2. ;=========fill zero until whole sector
  3. times 510-($-$$) db 0
  4. dw 0xaa55

总体代码:

  1. org 0x7c00
  2. BaseofStack equ 0x7c00
  3. Label_Start:
  4. mov ax, cs
  5. mov ds, ax
  6. mov es, ax
  7. mov ss, ax
  8. mov sp, BaseofStack
  9. ;===============clear screen
  10. mov ax, 0600h
  11. mov bx, 0700h
  12. mov cx, 0
  13. mov dx, 0184fh
  14. int 10h
  15. ;===============set focus
  16. mov ax, 0200h
  17. mov bx, 0000h
  18. mov dx, 0000h
  19. int 10h
  20. ;============display on screen : start booting....
  21. mov ax, 1301h
  22. mov bx, 000fh
  23. mov dx, 0000h
  24. mov cx, 10
  25. push ax
  26. mov ax, ds
  27. mov es, ax
  28. pop ax
  29. mov bp, startBootMessage
  30. int 10h
  31. ;======== reset floppy
  32. xor ah,ah
  33. xor dl,dl
  34. jmp $
  35. startBootMessage: db "start Boot"
  36. ;=========fill zero until whole sector
  37. times 510-($-$$) db 0
  38. dw 0xaa55

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/346628
推荐阅读
相关标签
  

闽ICP备14008679号