我在写一个内联汇编代码来读取实时时钟。我正在加载寄存器编号(4)以读取到'dl'并将其加载到端口0x70。我正在尝试将这个寄存器值(4)读入al。欲了解更多信息 - RTCGNU汇编语法
asm(
"mov $4, %%dl;"
"out 0x70, %%dl;"
"in %%al, 0x71;"
:
:
:"%al","%dl"
);
我正在上编译包含该代码的C文件下面的错误消息。
Assembler messages:
Error: operand size mismatch for 'out'
Error: operand size mismatch for `in'
汇编器版本:使用BFD版(GNU Binutils的Ubuntu的)GNU汇编版本2.26.1下(x86_64-Linux的GNU)2.26.1
是否有人可以指出的问题?
根据猜测,错误信息是由于在常量前没有'$'。也就是说,如果你想让你的asm输出一个值,你需要有一个输出参数(在第一个冒号后面)。如果在运行Ubuntu时可以使用'in'或'out',我会感到很惊讶。在阅读RTC之前,你不应该“cli”吗?如果你正在构建16位代码,我不确定使用64位编译器是否可行。如果你想在启动时读取RTC,那么[this](https://stackoverflow.com/q/46074535/2189500)。 –
AT&T语法通常在右侧有目的地。我希望对于IN和OUT指令也是如此。 IN 0x71,%% al'? –
@DavidWohlferd在给予自己使用'iopl()'或'ioperm()'系统调用的权利后,你可以使用'in'和'out'。 – fuz