【问题标题】:x86 Access a label without including the filex86 访问标签而不包含文件
【发布时间】:2014-09-22 17:09:32
【问题描述】:

我正在开发一个简单的内核以及一个引导加载程序。在引导加载程序进入保护模式之前,我想使用中断来检索系统上的内存量(int 0x12),然后将标签保存的值设置为我检索到的内存量。一旦内核加载(在保护模式下)我想访问数据。

一开始打算使用如下结构:

; 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 标签完全不同,它们指向的地址并不相同,我该怎么做呢?

【问题讨论】:

    标签: assembly x86 nasm


    【解决方案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
    ; ...
    

    【讨论】:

      【解决方案2】:

      两个不同文件中的两个不同名称;还是三个?随便

      第一个……

              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
      

      您可以使用“条件汇编”来做到这一点。

      如果您需要这方面的指导,请询问。

      【讨论】:

        猜你喜欢
        • 2016-02-16
        • 1970-01-01
        • 2016-02-23
        • 1970-01-01
        • 1970-01-01
        • 2013-08-08
        • 2012-07-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多