【发布时间】:2017-09-27 18:08:49
【问题描述】:
对于一个类项目,我正在实现一个内核级网络驱动程序,它利用向端口写入各种值。我为outb 和outw 创建了宏,它们都可以正常工作,但outl 继续发出编译器警告。定义如下:
#define outl(data, port) \
do { \
asm volatile("outl %l1, (%w0)" \
: \
: "d" (port), "a" (data) \
: "memory", "cc" ); \
} while(0)
编译器给出错误:invalid 'asm': '%l' operand isn't a label。
如果我这样定义它:
#define outl(data, port) \
do { \
asm volatile("outl %1, %0" \
: \
: "dN" (port), "a" (data) \
: "memory", "cc" ); \
} while(0)
我从汇编器那里收到这条消息:Warning: using '%eax' instead of '%ax' due to 'l' suffix。
我做错了什么?消除这两个警告的正确语法是什么?
【问题讨论】:
-
您使用的是 C 和 C++ 中的哪一个?请删除您不使用的语言的标签。
-
如何调用
outl宏?您的调用中data的类型是什么? -
你希望
%l1做什么? -
如果您不回答您在 cmets 中收到的问题,您的问题很可能会因为“不清楚您在问什么”而被关闭,因为您拒绝澄清。
-
%l1用于标签。你可能是指%k1。k是请求32位的注册表单。