在BIOS将引导扇区加载到内存后,尝试通过预先计算引导扇区的地址来打印引导扇区中的字符

问题描述 投票:0回答:1

我对装配以及与之相关的一切都很陌生。我只知道寄存器如何工作以及如何对其进行基本操作的基础知识。我一直在关注 cfenollosa/os-tutorial (github),并试图找出引导扇区的位置以及如何通过定向寻址来打印字符。我能够使用传统的方括号打印字符。但是,在尝试预先计算标签的地址时,我会得到错误的结果,有时会出现空白输出或随机乱码字符。

我尝试阅读周围的内容,我了解到,标签动态地为任何数据分配地址,但是没有办法找到它吗?如果可能的话,请将其分解得尽可能低。谢谢。

[org 0x7c00]

mov bx, 0x7c00
mov al, [bx + 0x2d]      ; Load character from offset 0x2d
mov ah, 0x0e             ; BIOS teletype function
int 0x10                 ; Print the character
    
jmp $                    ; Infinite loop

the_secret:              ; Pad to reach offset 0x2d
db 'X'                   ; Place 'X' at offset 0x2d

times 510-($-$$) db 0    ; Pad the rest of the boot sector
dw 0xaa55                ; Boot signature

期望了解标签如何工作以及是否可以通过预先计算其地址来寻址它们。

assembly x86-64 nasm qemu bootloader
1个回答
0
投票

这是可能的,但很乏味。您必须确定字符之前每条指令的机器代码。这就是汇编程序的用途。我已要求

nasm
提供清单:

 1                                  [org 0x7c00]
 2                                  
 3 00000000 BB007C                  mov bx, 0x7c00
 4 00000003 8A472D                  mov al, [bx + 0x2d]      ; Load character from offset 0x2d
 5 00000006 B40E                    mov ah, 0x0e             ; BIOS teletype function
 6 00000008 CD10                    int 0x10                 ; Print the character
 7                                      
 8 0000000A EBFE                    jmp $                    ; Infinite loop
 9                                  
10                                  the_secret:              ; Pad to reach offset 0x2d
11 0000000C 58                      db 'X'                   ; Place 'X' at offset 0x2d
12                                  
13 0000000D 00<rept>                times 510-($-$$) db 0    ; Pad the rest of the boot sector
14 000001FE 55AA                    dw 0xaa55                ; Boot signature

您可以看到第 11 行是您的角色,其偏移量为

0000000C
。另请注意,您没有初始化
ds
,因此它可能不为零。

© www.soinside.com 2019 - 2024. All rights reserved.