【问题标题】:Accessing memory at 0xF000FFFE (computer type) in fasm (MS-DOS)在 fasm (MS-DOS) 中访问 0xF000FFFE(计算机类型)的内存
【发布时间】:2013-02-17 19:13:43
【问题描述】:

问题是:我需要从 BIOS 内存中获取“计算机”类型。我知道,我可以在 fasm 中这样做(我的程序和所有段都是 16 位):

mov al, [0xF000FFFE]

但是返回零是不对的,因为 turbo c++ 3.1 中的等效代码

UCHAR pcType = *((UCHAR*)0xF000FFFE);

返回我计算机的正确“类型”,在使用 LARGE 模型时(在代码生成设置中)。 那么如何在 fasm 中修复它? (例如我知道,masm 有 .model 指令,但 fasm 中没有这样的东西)。请帮忙...

【问题讨论】:

  • 不...试过了。而且我对其他一些地址也得到了零,而在 c++ 中没关系...
  • 据我了解,首先我应该进入虚幻模式,所以我的调用应该是这样的: mov ax, 0xF000 mov ds, ax mov al, [0xFFFE] 很好用))跨度>

标签: assembly x86 dos fasm real-mode


【解决方案1】:

Turbo-C 正在执行从 far 地址 0xF000FFFE 读取的指令。段是地址的高 16 位,偏移量是地址的低 16 位。在大内存模型中,far 指针 0xF000FFFE 指向段 0xF000,偏移量 = 0xFFFE。实模式 segment:offset (logical) address 通过计算 (segment<<4)+offset 转换为物理地址,在这种情况下是物理地址 (0xF000

您需要创建等效的 FASM 代码来将段寄存器之一设置为 0xF000,然后检索偏移量 0xFFFE 处的值。以下代码只是通过Int 21h/AH=4Ch 返回的错误级别(代码)将系统 ID 返回给 DOS。返回值在AL中:

format mz                      ; Create a DOS EXE program

    mov ax, 0xf000
    mov es, ax                 ; ES = 0xf000
    mov al, [es:0xfffe]        ; Read byte at 0xF000:0xFFFE

    mov ah, 4Ch                ; DOS Exit and Return with error code function
    int 21h                    ; Exit and return System ID in AL

【讨论】:

    【解决方案2】:

    它在 Turbo C 中有效,因为它将 32 位值解释为段:偏移量对,而不是平面指针。如果要使用平面指针,则应使用地址 0xFFFFFFFE(如果 BIOS 未禁用闪存映射),或 0xFFFFE,即与指针 F000:FFFE 对应的线性内存地址。这两个都只在虚幻模式下工作,因为它们使用大于 64K 的偏移量,这在纯实模式下是不可能的。最简单的可能是使用普通的 16 位段:偏移地址,就像您在评论中提到的那样,因为这将始终有效。

    【讨论】:

      猜你喜欢
      • 2011-01-02
      • 2020-10-23
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多