【发布时间】:2017-12-28 15:54:48
【问题描述】:
我正在开发在 x86 实模式下运行的选项 rom(扩展 rom)的 INT 13H 磁盘服务例程。 我需要在例程执行时访问位于 DS(DS=CS) 的全局变量,但全局变量变为只读! 只有位于 SS(SS!=DS) 的局部变量才能正常访问,但堆栈大小不够。 在例程中我需要的大小约为 2KB。我的问题是:
- 是否可以在例程中将数据存储到全局变量中?
- 如何在例程中查找/定位 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 等。