C 如何获得int 0x16的值?

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

我的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可执行文件,请使用针对此环境的工具链,例如。

您遇到了工具链问题

您使用的GCC版本是32位编译器。在顶部插入
asm(“.code16gcc”)
指令会更改汇编程序的行为,以允许使用32位指令,但不会使GCC知道实模式中使用的分段内存模型。结合您用来生成
.com
二进制文件的步骤(未知,可能不正确),结果将是一个不工作的可执行文件


如果您想构建DOS可执行文件,请使用针对此环境的工具链,例如。

像这样?您为什么环境编写代码,使用什么编译器?@Dashwuf gcc下WSL@138谢谢,但没用。有我的实际代码的例子吗?像这样?你为什么环境编写代码,使用什么编译器?@Dashwuff gcc下WSL@138谢谢,但没用。有我的实际代码的例子吗?