我对装配以及与之相关的一切都很陌生。我只知道寄存器如何工作以及如何对其进行基本操作的基础知识。我一直在关注 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
期望了解标签如何工作以及是否可以通过预先计算其地址来寻址它们。
这是可能的,但很乏味。您必须确定字符之前每条指令的机器代码。这就是汇编程序的用途。我已要求
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
,因此它可能不为零。