我正在学习引导扇区。我从 NASM 网站下载了nasm-installer-x64.exe。我的操作系统是win7-64bit。当我运行以下代码时,它无法正常工作
mov ah, 0x0e;
mov al, the_secret;
int 0x10;
mov al, [the_secret];
int 0x10;
mov bx, [the_secret];
add bx, 0x7c00;
mov al, [bx];
int 0x10;
mov al, [0x7c1e];
int 0x10;
jmp $;
the_secret:;
db 'X';
times 510-($-$$) db 0;
dw 0xaa55;
答案 0 :(得分:3)
我认为times 510-($-$$) db 0
没有任何问题。在我看来,您正在尝试找到访问变量the_secret
的正确方法,然后将其显示在屏幕上。我将提供一种基于此尝试的机制,它具有最大的希望:
mov al, [the_secret];
int 0x10;
如果您正确设置 DS ,请使用org 0x7c00
设置原点,并确保 BH 设置为您要写入的页码(你想要0)然后下面的代码应该工作:
[bits 16] ; 16-Bit code
[org 0x7c00] ; Set the origin point to 0x7c00
start:
xor ax,ax ; We want a segment of 0 for DS for this question
mov ds,ax ; Set AX to appropriate segment value for your situation
mov es,ax ; In this case we'll default to ES=DS
mov bx,0x8000 ; Stack segment can be any usable memory
mov ss,bx ; This places it with the top of the stack @ 0x80000.
mov sp,ax ; Set SP=0 so the bottom of stack will be @ 0x8FFFF
cld ; Set the direction flag to be positive direction
mov ah, 0x0e
mov al, [the_secret] ; al = character from memory DS:[the_secret]
xor bh, bh ; bh = 0 = video page number
int 0x10;
jmp $
the_secret:;
db 'X';
times 510-($-$$) db 0
dw 0xAA55
启动代码将 DS 设置为零,因为我们设置了原点0x7c00。引导加载程序加载到0x0000:0x7c00(物理地址0x07c00)。这样可以确保正确地访问变量the_secret
。 mov al, [the_secret]
相当于说mov al, ds:[the_secret]
。如果未正确设置 DS 段寄存器,并且未正确设置原点,则无法从正确的位置读取内存访问。
INT 0x10/AH=0x0E需要设置页码。第一个视频显示页面为0,应相应地设置 BH 。
有关其他设置说明的详细信息,请参阅包含General Bootloader Tips的StackOverflow答案。
如果正确写入磁盘映像,我提供的代码应向控制台显示X
。
组装此代码并生成磁盘映像(在我的示例中为720k软盘):
nasm -f bin bootload.asm -o bootload.bin
dd if=/dev/zero of=disk.img bs=1024 count=720
dd if=bootload.bin of=disk.img bs=512 count=1 conv=notrunc
第一个命令将bootload.asm
汇编成一个名为bootload.bin
的平面二进制文件。第二个命令产生大小为1024 * 720(720kb软盘)的零填充磁盘映像(disk.img
),最后一个命令将512个字节的数据从bootload.bin
复制到磁盘映像的第一个扇区。 conv=notrunc
告诉 DD 在写完后不要截断文件。如果您将其关闭disk.img
,则在写入引导程序后将长度为512字节。