问题是:我需要从BIOS内存中获取'计算机'类型。我知道,我可以在fasm中这样做(我的程序和所有段都是16位):
mov al, [0xF000FFFE]
但是返回零并且它不对,因为turbo c ++ 3.1中的等效代码
UCHAR pcType = *((UCHAR*)0xF000FFFE);
返回我的计算机的'type',使用LARGE模型时(在代码生成设置中)。 那么如何解决这个问题呢? (例如,我知道,masm有.model指令,但是没有这样的东西在fasm中)。请帮忙......
答案 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位段:偏移量寻址,就像你在评论中提到的那样,因为它总是有效。