"次510 - ($ - $$)db 0"不起作用

时间:2016-03-17 05:42:26

标签: assembly nasm bootloader osdev x86-16

我正在学习引导扇区。我从 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;

1 个答案:

答案 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_secretmov 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字节。