用软盘引导扇区加载.bin文件到内存…

这篇博客介绍了如何在x86平台上,当程序超过一个扇区大小时,通过软盘引导扇区加载程序的策略。文章详细讲解了如何将程序分为引导程序和核心程序,以及如何通过引导程序将核心程序加载到内存中。作者通过示例展示了如何开辟堆栈空间,创建GDT表,并给出了加载文件到内存的步骤,包括搜索文件、读取扇区、解析FAT表等过程。
摘要由CSDN通过智能技术生成
在x86平台,如果我们的汇编程序比较小,例如只显示一个字符串,则我们用软盘的引导扇区(占一个扇区)就够了;但是我们的程序以后会越写越大,会超出一个扇区的范围(512字节),这时我们就需要改变策略,我们先把程序分成两个部分,第一部分是引导程序,第二部分是我们要真正操作的核心程序。我们把第二部分存到软盘的某个地方,然后通过第一部分的引导程序把第二部分程序加载到内存中运行。这样我们的核心程序就可以写得很大。

我们先把简单的部分说了,也就是第二部分程序,为了方便起见,我们还是现实一个字符串,但是在这里我们开辟1024*2个字节的堆栈空间,这样第二部分程序的大小就远远超出了512个字节。
代码如下
%include "pm.inc"

org 0x7c00
jmp LABEL_BEGIN
;----------------------------------------------------------------------------------------
;GDT table
[SECTION .gdt]
LABEL_GDT: Descriptor 0,     0,           0
LABEL_DESC_DATA: Descriptor 0,       DATA_LEN,   DA_DRW
LABEL_DESC_STACK: Descriptor 0,       STACK_LEN,   DA_DRWA + DA_32
LABEL_DESC_VIDEO: Descriptor       0xB8000, 0xFFFF,     DA_DRW 

GDT_LEN equ $ - LABEL_GDT
GDT_PTR dw GDT_LEN - 1
dd LABEL_GDT
;----------------------------------------------------------------------------------------
;Selector
SelectorData equ LABEL_DESC_DATA - LABEL_GDT
SelectorStack equ LABEL_DESC_STACK - LABEL_GDT
SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT

;----------------------------------------------------------------------------------------
[SECTION .data]
ALIGN 32
[BITS 32]
LABEL_DATA:
SayHelloLily: db "Hello, Lily!"
LilyStringOffset equ SayHelloLily - $$
SayHelloKaito: db "Hello, kaito!"
KaitoStringOffset equ SayHelloKaito - $$
DATA_LEN equ $ - LABEL_DATA - 1


[SECTION .stack]
ALIGN 32
[BITS 32]
LABEL_STACK:
times 1024*2 db 0
STACK_LEN equ $ - LAB
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值