C 如何获得int 0x16的值?
我的C代码中有一个内联汇编程序:C 如何获得int 0x16的值?,c,gnu-assembler,C,Gnu Assembler,我的C代码中有一个内联汇编程序: asm volatile ("mov %ah, 01\n" "int $0x16\n"); 此代码是getch() 它可以工作,但现在我想得到返回这个内联汇编程序的值(特别是我想知道返回中断16h的键) 我怎么能做到 编辑:我正在使用C和DosBox制作MS-DOS COM文件。目前一切正常,除了我现在遇到的问题 完整代码: asm (".code16gcc\n" "call dosmain\n" "mov
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可执行文件,请使用针对此环境的工具链,例如。您遇到了工具链问题 您使用的GCC版本是32位编译器。在顶部插入
asm(“.code16gcc”)
指令会更改汇编程序的行为,以允许使用32位指令,但不会使GCC知道实模式中使用的分段内存模型。结合您用来生成.com
二进制文件的步骤(未知,可能不正确),结果将是一个不工作的可执行文件
如果您想构建DOS可执行文件,请使用针对此环境的工具链,例如。像这样?您为什么环境编写代码,使用什么编译器?@Dashwuf gcc下WSL@138谢谢,但没用。有我的实际代码的例子吗?像这样?你为什么环境编写代码,使用什么编译器?@Dashwuff gcc下WSL@138谢谢,但没用。有我的实际代码的例子吗?