c++ - 错误 : expected string-literal before ‘command’ /reusing asm volatile

标签 c++

我正在尝试运行以下写入端口的代码。

void write(uint8_t size, uint8_t data, uint16_t port_number){
    char command[] = "out_ %0, %1";
    command[3] = size; //outb, outw or outl
    __asm__ volatile(command: : "a"(data), "Nd"(port_number) );
}

我收到以下错误消息:

test.cpp:32:22: error: expected string-literal before ‘command’
 __asm__ volatile(command : : "a"(data), "Nd"(port_number) );

如果我尝试运行这一行:

__asm__ volatile("outb %0, %1": : "a"(data), "Nd"(port_number) );

它编译没有问题。

现在,我知道我可以通过创建 3 个版本的 write 函数来解决这个问题,每个版本对应一种形式的“out”,但是有没有更好的方法来解决这个问题而无需复制粘贴代码?

最佳答案

__asm__ volatile() 的第一个参数 AsmTemplate 必须是字符串文字。

对于每个输出大小,您只需要使用相应的文字调用函数即可。您可以在此处使用 if-else 或 switch-case 来使用分支:

void write(uint8_t size, uint8_t data, uint16_t port_number){
    char command[] = "out_ %0, %1";
    command[3] = size; //outb, outw or out
    switch(size) {
        case 'b': __asm__ volatile("outb %0, %1": :"a"(data), "Nd"(port_number) ); break;
        case 'w' : __asm__ volatile("outw %0, %1": :"a"(data), "Nd"(port_number) ); break;
        case 'l' : __asm__ volatile("outl %0, %1": :"a"(data), "Nd"(port_number) ); break;
    } 
}

添加案例以涵盖每个可能的“大小”值。

您可以使用以大小为参数的#define 来缩短每一行

关于c++ - 错误 : expected string-literal before ‘command’ /reusing asm volatile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47856242/

相关文章:

c++ - "Argument of Type Incompatible"来自继承类

c++ - 为什么我的Magic Square算法只能找到一半可能的解决方案?

c++ - 有什么理由更喜欢从 IDE 中运行应用程序而不是运行独立的可执行文件?

c++ - 如何禁用缩小转换警告?

c++ - 在立方体面上应用图像 - VTK

c++ - 大型矩阵的矩阵库?

c++ - Makefile: multiple definition and undefined reference 错误

c++ - gcc 编译器不显示类模板注入(inject)名称的正确错误

c++ - 无法在C++中删除

c++何时将方法放在类之外