【问题标题】:How to store data into global variables in x86 real mode ISR?如何在 x86 实模式 ISR 中将数据存储到全局变量中?
【发布时间】:2017-12-28 15:54:48
【问题描述】:

我正在开发在 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
    };    
}

【问题讨论】:

  • 这里的“不能”是什么意思?你不能?你得到一个编译或运行时错误?你确定你可以像这样混合C和汇编吗?你检查生成的汇编代码了吗?
  • @usr2564301:内存访问去了别的地方。
  • 您需要在此处发布minimal reproducible example 以获得调试帮助。您需要在问题本身中包含所有重现问题的代码、构建代码所采取的步骤、运行代码的方式、预期的行为以及实际得到的行为。
  • 用纯asm编写整个ISR不是更容易吗?然后你不必担心让编译器保存/恢复与普通函数调用不同的东西。或者可能编写一个 asm 包装器,在调用 C 函数之前设置一些健全的段寄存器。与在变量或指针上使用far 属性并让编译器执行此操作相比,使用内联汇编来处理段寄存器似乎是个坏主意/让生活变得困难。 (查看编译器输出,看看它是否在制作你想要的 asm。)
  • @PeterCordes t我会更容易使用汇编,没有人用任何其他语言编写磁盘控制器选项 ROM,但我猜这里的原始发帖人不太了解汇编并认为他们可以通过使用 C 来解决这个问题。但是这里的问题很严重,使用小内存模型但假设 CS = DS,假设选项 ROM 是可写的,需要 2K 的 RAM,而选项 ROM 根本无法使用,混淆选项带有 TSR 的 ROM 等。

标签: c assembly x86


【解决方案1】:

INT 13H option rom(expansion rom)的磁盘服务程序 是否可以在例程中将数据存储到全局变量中?

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

如何在例程中查找/定位 2KB 可用内存?

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

【讨论】:

  • 致 rcgldr: 1. 你能教我或指导如何在 ISR 中找到 2KB 安全 RAM 吗? 2. 我不太明白“在使用任何扩展特定的 INT 13H 调用之前,MSDOS 或其他一些操作系统必须能够启动并加载设备驱动程序”。你的意思是我不应该在 ISR 中定位内存?
  • @marky1 - 以 MSDOS 为例,如果加载了设备驱动程序(通常在 config.sys 期间),那么要保留“安全 ram”,它只需将该 ram 作为它的一部分包含在内当它通过 INT 21H 退出时的图像,AX = 03100H,DX = 驱动程序结束的地址,它将驱动程序留在内存中。如我的回答所述,在加载设备驱动程序之前,无法使用任何需要 2K 内存的扩展特定调用。
猜你喜欢
  • 2021-02-18
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多