我的 C 代码中有这个内联汇编器:
asm volatile ("mov %ah, 01\n"
"int $0x16\n");
此代码是 getch()
的汇编版本
它有效,但现在我想获取返回此内联汇编器的值(具体来说,我想知道返回中断 16h 的键)。
我该怎么做?
编辑:我正在使用 C 和 DosBox 制作 MS-DOS COM 文件。目前一切正常,除了我现在遇到的问题。
完整代码:
asm (".code16gcc\n"
"call dosmain\n"
"mov $0x4C,%ah\n"
"int $0x21\n");
static void print(char *string)
{
asm volatile ("mov $0x09, %%ah\n"
"int $0x21\n"
: /* no output */
: "d"(string)
: "ah");
}
int dosmain(void)
{
int a;
asm volatile ("mov %%ah, 0\n"
"int $0x16\n"
: "=r"(a));
print(a);
print("Hello, World!\n$");
return 0;
}
但是会导致一个很好的“缓冲区溢出?”
最佳答案
你有一个工具链问题。
您使用的 GCC 版本是 32 位编译器。在顶部插入 asm(".code16gcc")
指令会更改汇编程序的行为以允许使用 32 位指令,但不会让 GCC 知道实模式下使用的分段内存模型。结合您用来生成 .com
二进制文件的(未知且可能不正确的)步骤,结果将是一个无法运行的可执行文件。
如果您想构建 DOS 可执行文件,请使用针对此环境的工具链,例如 OpenWatcom .
关于c - 我怎样才能得到 int 0x16 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52901063/