我正在尝试运行以下写入端口的代码。
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/