2014-09-19 75 views
2

我有一个简单的内核以及一个引导加载程序。在引导装载程序进入保护模式之前,我想使用中断来检索系统内存量(int 0x12),然后将标签保存的值设置为检索到的内存量。一旦内核加载(处于保护模式),我想访问数据。x86在不包含文件的情况下访问标签

起初打算用以下结构:

; 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标签是完全不同的,他们不指向同一个地址,我怎么能这样做?

回答

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 
; ... 
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 

你可以用“做到这一点条件汇编“。

如果您需要指针,请询问。

相关问题