gpt4 book ai didi

c - 我怎样才能得到 int 0x16 的值?

转载 作者:太空宇宙 更新时间:2023-11-04 07:52:34 34 4
gpt4 key购买 nike

我的 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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com