如何获取int 0x16的值?

时间:2018-10-19 23:28:26

标签: c gas

我的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;
}

但是会引起不错的“缓冲区溢出吗?”

1 个答案:

答案 0 :(得分:2)

您遇到了工具链问题。

您使用的GCC版本是32位编译器。在顶部插入asm(".code16gcc")指令会更改汇编程序的行为,以允许使用32位指令,但是不会使GCC意识到实模式下使用的分段内存模型。结合您用于生成.com二进制文件的(未知的,可能不正确的)步骤,结果将是无法运行的可执行文件。

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