c - 如何在x86实模式ISR中将数据存储到全局变量中?

标签 c assembly x86

我正在开发在x86实模式下运行的选项ROM(扩展ROM)的INT 13H磁盘服务例程。 我需要在例程执行时访问位于 DS(DS=CS) 的全局变量,但全局变量变为只读! 只有位于SS(SS!=DS)处的局部变量可以正常访问,但栈的大小不够。 例程中我需要的大小约为 2KB。我的问题是:

  1. 是否可以将数据存储到例程中的全局变量中?
  2. 如何在例程中查找/定位 2KB 可用内存?

非常感谢。

int global_var;

void __far int13h_isr(void)
{
    int local_var;

    __asm
    {
        push    ds
        push    es
        mov     bx, cs
        mov     ds, bx
        mov     es, bx
    };


    global_var = 0x22;  // global variable can NOT store 0x22 in the routine. 
    local_var  = 0x22;  // local variable can store 0x22 correctly.

    __asm
    {
        pop es
        pop ds
    };    
}

最佳答案

INT 13H disk service routine of option rom(expansion rom) Is it possible to store data into global variables in the routine?

数据无法存储到ROM中。如果在加载设备驱动程序之前需要内存,则扩展卡将需要它自己的内存。

How to find/locate 2KB usable memory in the routine?

设备驱动程序及其 ISR 可以分配内存,但 MSDOS 或其他操作系统必须能够在使用任何扩展特定的 INT 13H 调用之前启动并加载设备驱动程序。

关于c - 如何在x86实模式ISR中将数据存储到全局变量中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48010490/

相关文章:

c - 断言可变长度数组的分配

c++ - 手动添加 vector 异常处理程序

c - 拆分字符串并使用索引调用所需的元素

c - 优化字符串散列时出现奇怪的程序集输出

assembly - 在程序集 x86 中对齐

c - Visual Studio - 在 64 位项目中编译 32 位代码

c++ - 在 Intel Kaby Lake 架构上获取末级缓存未命中计数的确切代码是什么

c - printf 不显示变量,而是显示随机数

assembly - dword 操作数在汇编中有什么作用

c++ - x86/C++ - 指向指针 : Const being violated by compiler? 的指针