问题是:我需要从 BIOS 内存中获取“计算机”类型。我知道,我可以在 fasm 中这样做(我的程序和所有段都是 16 位):
mov al, [0xF000FFFE]
但是返回零,这是不正确的,因为 Turbo C++ 3.1 中的等效代码
UCHAR pcType = *((UCHAR*)0xF000FFFE);
返回我的计算机的正确“类型”,使用大型模型时(在代码生成设置中)。 那么如何在 fasm 中修复它呢? (例如,我知道 masm 有 .model 指令,但 fasm 中没有这样的东西)。请帮忙...
最佳答案
Turbo-C 正在执行从远地址 0xF000FFFE 读取的指令。段是地址的高16位,偏移量是地址的低16位。在大内存模型中,far指针0xF000FFFE指向段0xF000,偏移量=0xFFFE。实模式segment:offset (logical) address通过计算将(segment<<4)+offset
转换为物理地址,在本例中是物理地址 (0xF000<<4)+0xFFFE = 0xFFFFE,它是系统 ID 字节所在的 ROM BIOS 内存 1MiB 标记下方的倒数第二个字节。
您需要创建等效的 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
关于assembly - 在 fasm (MS-DOS) 中访问 0xF000FFFE(计算机类型)处的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14924967/