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

标签 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   $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/

相关文章:

c - 从 GNU AS 调用时 C 乘法结果放在哪里?

mysql - mysql 中的并行查询执行

在 C 中使用 strtok 比较单词

c - 在 C 中,为什么不能将 const 变量用作数组大小初始值设定项?

assembly - 消除 Intel 语法中寄存器名称中标签的歧义

assembly - 汇编器什么时候使用像 R_X86_64_32S 这样的符号扩展重定位而不是像 R_X86_64_32 这样的零扩展更好?

c - 程序中未初始化的变量将极坐标转换为笛卡尔坐标,反之亦然(C)

使用 COM 端口发送和接收串行 (UART) 数据的 C 程序

c - 如何用C写rotate代码编译成 `ror` x86指令?

linker - GNU ld 删除部分