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

标签 assembly x86 dos fasm real-mode

问题是:我需要从 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/

相关文章:

我可以让编译器优化结构中的函数调用吗?

assembly - 机器指令和汇编指令有什么区别?

batch-file - 使用用户输入自定义 .bat 关机命令

c - 替代 dir 命令来查询 C 中的目录

assembly - 有没有官方文件证明JL和JNGE的工作原理是一样的?

linux - 没有 %gs 寄存器的 x86 子集 : binary patching code that uses %gs instead of trapping to emulation?

c++ - 加载 128 位混合 float+int 数据?

c - 通过计算汇编指令来测量 CPU 速度

gdb false 可以重新创建框架的寄存器吗?

assembly - 16 位 x86 汇编器,使用 8 位内存存储的颜色变量在屏幕上绘制蓝色时遇到问题吗?