我不相信有什么问题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应进行相应设置。
有关其他设置说明的更多信息,请参阅我的 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
。第二个命令生成一个零填充的磁盘映像(disk.img
)的大小为 1024 * 720(720kb 软盘),最后一个命令复制 512 字节的数据bootload.bin
到磁盘映像的第一个扇区。conv=notrunc
tells DD写入后不要截断文件。如果你把它去掉disk.img
写入引导扇区后,长度为 512 字节。