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

Assembly 在fasm(MS-DOS)中访问0xF000FFFE(计算机类型)处的内存,assembly,x86,dos,fasm,real-mode,Assembly,X86,Dos,Fasm,Real Mode,问题是:我需要从BIOS内存中获取“计算机”类型。我知道,我可以在fasm中这样做(我的程序和所有段都是16位): 但是,它返回0,这是不对的,因为Turbo C++ 3.1中的等效代码

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

<>但是,它返回0,这是不对的,因为Turbo C++ 3.1中的等效代码<

UCHAR pcType = *((UCHAR*)0xF000FFFE);
使用大型号时返回我的计算机的正确“类型”(在代码生成设置中)。
那么如何在fasm中修复它呢?(例如,我知道masm有.model指令,但fasm中没有这样的指令)。请帮助……

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

Turbo-C正在执行从far地址0xF000FFFE读取的指令。段是地址的上16位,偏移量是地址的下16位。在大内存模型中,far指针0xF000FFFE指向段0xF000,偏移量=0xFFFE。一个真实的模式通过计算<代码>翻译成物理地址(StEntNo……尝试。我也得到了一些其他地址的零,而在C++中它是好的……据我了解,首先我应该进入非真实模式,所以我的调用应该是这样的:MOV AX,0xF000 MOV DS,AX MOV AL,[0xFFFE]工作得很好)
UCHAR pcType = *((UCHAR*)0xF000FFFE);
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