为什么BIOS将MBR读入0x7C00地址处(x86平台下)

对于很多人来讲0x7C00这个地址是很神秘的,不知道这是干什么的。但是对于了解过x86平台下BIOS启动过程的人,对这个地址再熟悉不过了。BIOS就是将MBR读入0x7C00地址,然后进行后续的引导的。操作系统或是bootloader开发者必须假设 他们的汇编代码被加载并从0x7C00处开始执行。0x7C00的定义对于这个地址,它不属于Intel x86平台规范的,而是属于BIOS规范中定义的内容。0x7C00第一次出现在IBM PC 5150的BIOS处理int 19(19号中断)的时候,IBM PC 5150是x86(32位)IBM PC/AT系列的祖先,这款PC于1981年发布,使用了intel 8088(16位)的处理器和16KB的RAM内存,BIOS和微软的基本指令均放在该内存中。当打开电源,BIOS开始自检,然后出发19号中断,在处理19号中断时,BIOS检测电脑是否具有软盘、硬盘或是固定磁盘,如果有任何可以使用的磁盘,BIOS酒吧磁盘的第一个扇区(512B)加载到内存的0x7C00地址处。0x7C00的前身0x7C00地址第一次出现在IBM PC 5150的ROM bios中,在此之前使用的地址是0×200。使用该地址的原因主要有:当时8086中断向量使用地址为0×0-0x3FF;86-DOS从0×400处被加载;而它不使用0×200-0x3FF这段中断向量地址。因此这段0×200-0x3FF地址不能被其他程序使用,Tim Paterson(86-DOS开发者)选择0×200作为MBR加载地址。0x7C00的意义他们想留下32kb内更多的空间给操作系统来加载自己;8086/8088使用0×0-0x3FF作为中断向量,然后BIOS数据紧随之后;引导扇区是512字节,但是用于引导程序的栈或数据区域需要多于512字节;因此0x7C00,32kb中的最后1kb被选中。一旦操作系统被引导并开始,引导扇区将一直不会被使用指导重启,因此操作系统和应用程序可以自由的使用32KB的最后1kb空间。在操作系统被加载后,内存布局如下:

+——————— 0×0| Interrupts vectors(中断向量表)

+——————— 0×400| BIOS data area(BIOS的数据区域)

+——————— 0×5??| OS load area(操作系统加载区域)

+——————— 0x7C00| Boot sector(引导区域)

+——————— 0x7E00| Boot data/stack(引导数据/堆栈)

+——————— 0x7FFF| (not used)+——————— (…)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是修改后的程序: ``` org 0x7c00 ; 告诉汇编器这是一个MBR程序,并将其加载到0x7c00 mov ah, 0x0e ; 设置打印模式 mov al, 'X' ; 打印你的姓名拼音 int 0x10 ; 调用BIOS中断打印字符 mov al, 'X' int 0x10 mov al, 'X' int 0x10 mov al, 'X' int 0x10 mov al, '1' ; 打印你的学号 int 0x10 mov al, '2' int 0x10 mov al, '3' int 0x10 mov al, '4' int 0x10 mov al, '5' int 0x10 mov al, '6' int 0x10 mov bx, 0x7c00 ; 将bx指向程序的起始地址 mov cx, 18 ; 设置要计算的字符总数为18 mov dx, 0 ; 初始化结果寄存器 sum_loop: add dl, byte [bx] ; 将当前字符的ASCII值加到dx寄存器中 inc bx ; 将bx指向下一个字符 loop sum_loop ; 重复执行,直到所有字符都被理 mov ah, 0x0e ; 设置打印模式 mov al, ' ' ; 打印一个空格 int 0x10 add dl, 144 ; 将寄存器值加上144,以将其转换为ASCII字符 mov al, dl ; 将结果存储到al寄存器中 int 0x10 ; 调用BIOS中断打印字符 mov al, ':' int 0x10 mov ah, 0 ; 设置中断号为0x10,功能为获取键盘输入 int 0x16 ; 等待用户按下任意键 jmp $ ; 无限循环 times 510-($-$$) db 0 ; 填充剩余的空间,使程序大小为512字节 dw 0xaa55 ; MBR标识 ``` 主要修改如下: 1. 在计算结果并打印时,我们使用了不同的方式来将结果转换为ASCII字符。具体来说,我们首先使用`add dl, 144`指令将寄存器值加上144,然后将结果存储回dl寄存器中。接下来,我们将dl寄存器中的值存储到al寄存器中,并使用`int 0x10`指令调用BIOS中断以在屏幕上打印结果。 2. 我们删除了名字和学号之间的空格,同时将打印冒号的指令移动到了打印结果的指令之后,以确保结果和冒号之间没有空格。 请注意,这个程序仍然是非常基础的,只是一个简单的示例程序,并且未经过充分测试。在实际使用中,您可能需要进行更多的测试和错误理,以确保程序可以正确地运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值