我在开发中有一个简单的内核和一个bootloader。在引导加载程序进入保护模式之前,我想使用中断来检索系统上的内存量(int 0x12),然后将标签保存的值设置为我检索到的ram数量。一旦内核加载(在保护模式下),我想访问数据。
首先要使用以下结构:
; sysinfo.asm
RAM: dd 0 ; declare RAM as a 4 byte label
; boot.asm
%include "sysinfo.asm"
; bootloader code here
xor ax, ax
int 0x12
mov [RAM], ax
; go into protected mode and launch kernel
; kernel.asm
%include "sysinfo.asm"
mov ax, [RAM]
; print ax
然而,正如我预期的那样,由于boot1.asm中的RAM标签和kernel.asm中的RAM标签完全不同,因此它们不指向同一地址,我该怎么办?
答案 0 :(得分:1)
我建议定义一个结构,该结构保存在加载过程中收集的信息,然后将结构的地址传递给某些寄存器中的内核。
SYSINFO.ASM:
struc BootInfo
.ram resd 1
; .. some other useful information ...
endstruc
boot.asm:
%include "sysinfo.asm"
bootinfo: istruc BootInfo
at ram, dd 0
iend
; ....
xor ax, ax
int 0x12
mov [bootinfo + BootInfo.ram], ax ; set amount of ram
; ...
mov edx, bootinfo ; pass address of BootInfo in some register
; goto kernel code
kernel.asm:
%include "sysinfo.asm"
; Address of BootInfo in edx
mov eax, [edx + BootInfo.ram] ; get ram to eax
; ...
答案 1 :(得分:0)
两个不同文件中的两个不同名称;还是三个?无论
第一个......
RAM: dd 0 ; declare RAM as a 4 byte label
...变为
Boot_Dot_Asm_RAM: dd 0 ; declare RAM as a 4 byte label
第二个成为......
Kernal_Dot_Asm_RAM: dd 0 ; declare RAM as a 4 byte label
您可以使用“条件汇编”执行此操作。
如果你需要指点,请问。