我学习纯硬件(无操作系统)编程,并且从闪存驱动器引导时出现问题(使用金士顿DT101 G2 8Gb)。最初的代码,没有备份,我现在不能完全复制它,因为它:(在模拟器(最新的Bochs)和现场硬件上都工作得很好。之后增加了更多的功能性(转储输出子程序和加载闪存驱动器使用int 13h函数42h)在Bochs中完美工作,但在现场计算机上完全没有 - 计算机在尝试运行时重新启动 因此,我已经将代码简化为一种最简单的形式I曾在年初和修改段寄存器的初始化这是它看起来像现在:。闪存驱动器上的主引导记录不起作用
load_address equ 0x7c00 ;was used earlier but not now, just keeping it if anything
use16 ;we start in real mode
bootloader_start:
cli
;setting up the segments
xor ax, ax
mov ss, ax
mov sp, 0x7c00
push word 0x7c0
pop ds
push ds
push word continue
retf
continue:
sti
;copying CS into video memory to check it value (blue background)
mov ax, 0xb800
mov es, ax
mov ax, cs
push ax
mov ah, 0x17
mov [es:0], ax
pop ax
mov al, ah
mov ah, 0x17
mov [es:2], ax
;infinit loop
jmp short $
current_tty_address: ;was used earlier
dw 0
boot_drive_number: ;was used earlier
db 0
padding:
;padding to sector size - 2
times 510-($-$$) db 0
dw 0xaa55 ;mbr identifier
;if comipling for Bochs, padding to hard disk image size (flat mode, 10Mb)
%ifdef BOCHS
padding2:
times 512 * (17 * 4 * 306 - 1) db 0
%endif
但这并不能正常工作,它把一个角色在第一屏幕位置(0,0),但未来位置只是黑色(但至少应该有一个蓝色背景,不管角色是什么代码是)。此外,写在不同大小的闪存驱动器上的相同代码(金士顿DT101 G2,32Gb)给出了“缺少操作系统...”消息。我尝试了不同的变化,但仍然无法完成这项工作,也无法弄清楚会发生什么。 这是一个闪存驱动器的问题? A可以回想,几个月前,我尝试了使用相同闪存模式的LinuxLive,并在4 - 5发布后停止引导。 这里我使用的是: 电脑型号:惠普EliteBook 8440p; (offlease); CPU:Intel Core i5 M520 2.40GHz 2核; BIOS:Hewlett-Packard 68CCU Ver。 F.0D,14/07/2010(我不知道是否更新); Compilator:NASM; 磁盘操作软件:DiskProbe V1.0(R.尤金鲍康,微软)
请帮我理解发生了什么。 非常感谢。
它放入第一个位置的是什么字符? –
它为C0h代码(单行边界表的左下角)放置伪码符号 – Ruslan
@Ruslan你的链接命令是什么样的? –