gcc - 将Intel风格的汇编代码重写为GCC内联汇编

标签 gcc assembly operating-system dos interrupt

如何将此汇编代码编写为内联汇编?编译器:gcc(i586-elf-gcc)。 GAS 语法让我很困惑。 请告诉我如何将其编写为适用于 gcc 的内联程序集。

.set_video_mode:
    mov ah,00h
    mov al,13h
    int 10h   

.init_mouse:
    mov ax,0
    int 33h

我在组装时也有类似的。我将它们单独编写为汇编例程,以便从我的 C 程序中调用它们。我需要从 C 本身调用这些中断和更多中断。

此外,我需要根据我正在调用的中断例程将一些值放入某些寄存器中。请告诉我该怎么做。

我想做的就是从 C 调用中断例程。使用 int86() 对我来说也可以,但我没有该函数的源代码。 我想要 int86(),这样我就可以从 C 调用中断。

我正在开发自己的微型操作系统,因此我对调用中断或任何直接硬件访问没有任何限制。

最佳答案

我还没有测试过这个,但它应该可以帮助你开始:

void set_video_mode (int x, int y) {
  register int ah asm ("ah") = x;
  register int al asm ("al") = y;

  asm volatile ("int $0x10"
                : /* no outputs */
                : /* no inputs */
                : /* clobbers */ "ah", "al");
}

我已经输入了两个“clobbers”作为示例,但是您需要设置正确的 clobbers 列表,以便编译器知道您已经覆盖了寄存器值(可能没有)。

关于gcc - 将Intel风格的汇编代码重写为GCC内联汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8893931/

相关文章:

linux - CMake 保存剥离的调试信息

gcc - 如何将参数传递给 makefile 配方,或在解析时解析变量

memory-management - 有关N路集合关联缓存步骤的信息

c - 如何在 C 中以任何预处理器指令形式定义一组配置

c - 如何帮助 gcc 向量化 C 代码

c - 是否将指针转换到 intptr_t,对其进行算术运算,然后转换回已定义的行为?

c - 在汇编级别的这个极简 C 代码中到底发生了什么?

c - gcc:汇编代码中不同引用的命令行参数

C 内联汇编标签问题

python - 如何从 Jupyter notebook 获取操作系统命令的输出?