【问题标题】:Error compiling C program with DevCpp when using inline assembly使用内联汇编时使用 DevCpp 编译 C 程序时出错
【发布时间】:2016-05-11 21:15:05
【问题描述】:

我正在使用DevCpp编译以下代码但出现问题:

#include<stdio.h>

int main(){
    char s;

    __asm(
    "mov %ah, 1"
    "int 21h"
    "mov %ah,2"
    "mov %dl,%al"
    "int 21h"
    );

    return 0;
}

DevCpp编译器产生的错误是:

错误:垃圾int 21hmov %ah' after expression Error: too many memory references formov'

我该如何解决这个问题?

【问题讨论】:

  • 您的汇编程序将其视为一个字符串...您使用的是什么汇编程序?
  • 在汇编代码的每一行附加一个\n\t
  • 你读过这个devcpp的常见问题解答
  • 如前所述,您至少需要在每个字符串的末尾添加\n\n\t 在生成的输出中看起来更漂亮,因为它缩进了。但是即使你编译了这个int 21h,如果你生成一个Windows 可执行文件,它也不会正常工作。 Dev-CPP 是一个 32 位编译器,不针对 DOS。 GCC 可能会抱怨使用十六进制的h 后缀,并且您必须使用-masm=intel 进行编译才能使用intel 语法。但是int 21h 会在遇到该指令时使您的 Windows 应用程序崩溃。

标签: c gcc x86 inline-assembly


【解决方案1】:

FAQ 演示了在每个 __asm 中执行一个语句。

__asm("mov %ah, 1") ;
__asm("int 21h"   ) ;
__asm("ONE AND ONLY ONE INSTRUCTION") ;

应该可以用\n 分隔行,但我没有看到记录。

__asm("mov %ah, 1\n"
      "int 21h   \n"
      "MULTIPLE INSTRUCTIONS WITH \n") ;

【讨论】:

  • 保证。在 GCC 中,__asm 的使用将强制将行发送到汇编代码中,这些代码将由 GNU 汇编器 (as) 处理。由于新行可以分隔 GNU 汇编器中的指令,因此将 __asm 中的指令与 \n 分隔也是完全有效的。 \n\t 通常是您所看到的,因为如果您告诉 asgcc 发出中间汇编代码,它会漂亮地生成汇编代码。
  • 已对上面的 OP 进行了评论,常见问题解答明确指出,__asm 用于每一行程序集...
  • 如果我没记错的话,在 GCC 中使用 ; 来分隔同一 __asm 块中的汇编指令对我来说效果很好......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
相关资源
最近更新 更多