在fasm(MS-DOS)中以0xF000FFFE(计算机类型)访问内存

时间:2013-02-17 19:13:43

标签: assembly x86 dos fasm

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

mov al, [0xF000FFFE]

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

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

返回我的计算机的'type',使用LARGE模型时(在代码生成设置中)。 那么如何解决这个问题呢? (例如,我知道,masm有.model指令,但是没有这样的东西在fasm中)。请帮忙......

2 个答案:

答案 0 :(得分:2)

Turbo-C正在执行从 far 地址0xF000FFFE读取的指令。该段是地址的高16位,而偏移是地址的低16位。在大型内存模型中, far 指针0xF000FFFE指向段0xF000,偏移量= 0xFFFE。实模式segment:offset (logical) address通过计算(segment<<4)+offset转换为物理地址,在这种情况下为物理地址(0xF000 << 4)+ 0xFFFE = 0xFFFFE,它是1MiB之后的倒数第二个字节系统ID字节所在的ROM BIOS中的内存标记。

您将需要创建等效的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

答案 1 :(得分:0)

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