首页 > 解决方案 > 括号中的g ++内联汇编不匹配

问题描述

g++ 向我抱怨以下代码中缺少括号:

                                              1                   2 3
                                              v                   v v
__asm__ volatile("inb %1, %0" : : "=a" (result) : "Nd" (portnumber) );
                ^                      ^               ^
                1                      2               3

如您所见,括号是匹配的,并且有三个左括号和三个右括号。

还有更多信息,我正在关注一个 youtube 教程

标签: c++assemblyx86g++inline-assembly

解决方案


:你在 output 之前有一个额外的,所以你最终在输入部分得到了你的输出声明。 以及该错误的原因:编译器需要clobber列表的输入操作数声明。 clobber 列表只能包含字符串文字(寄存器名称"memory"和/或"cc"1),不能包含().

    __asm__ volatile("inb %1, %0" 
            : "=a" (result)       // output
            : "Nd" (portnumber)   // input
          //  : "memory"   // optional, clobber list
     );

您可能需要一个"memory"clobber 列表来确保这是按 wrt 排序的。内存访问。或者不是,如果你确定它不需要。

脚注 1:x86 上的 asm 语句隐式破坏了条件代码,"cc". 如果您愿意,可以将其用于文档。但是您不希望它在这里,因为inb它不会触及 EFLAGS。


推荐阅读