我的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;
}
但是会引起不错的“缓冲区溢出吗?”
答案 0 :(得分:2)
您遇到了工具链问题。
您使用的GCC版本是32位编译器。在顶部插入asm(".code16gcc")
指令会更改汇编程序的行为,以允许使用32位指令,但是不会使GCC意识到实模式下使用的分段内存模型。结合您用于生成.com
二进制文件的(未知的,可能不正确的)步骤,结果将是无法运行的可执行文件。
如果要构建DOS可执行文件,请使用针对此环境的工具链,例如OpenWatcom。