我正在尝试使用asm从CMOS读取时间,但我收到此错误:
/tmp/ccyx8l5L.s:1236: Error: too many memory references for 'mov'
/tmp/ccyx8l5L.s:1240: Error: too many memory references for 'out'
/tmp/ccyx8l5L.s:1244: Error: too many memory references for 'in'
/tmp/ccyx8l5L.s:1252: Error: too many memory references for 'mov'
这是代码:
for (index = 0; index < 128; index++) {
asm("cli");
asm("mov al, index"); /* Move index address*/
asm("out 0x70,al"); /* Copy address to CMOS register*/
/* some kind of real delay here is probably best */
asm("in al,0x71"); /* Fetch 1 byte to al*/
asm("sti"); /* Enable interrupts*/
asm("mov tvalue,al");
array[index] = tvalue;
}
我正在使用gcc编译
答案 0 :(得分:1)
gcc使用AT&amp; T语法。
使用post_install do |installer|
installer.pods_project.build_configuration_list.build_configurations.each do |configuration|
configuration.build_settings['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
end
end
答案 1 :(得分:1)
正如Janycz所指出的那样,你的代码使用英特尔语法作为汇编程序,而gcc(默认情况下)则指望&amp; t。如果你正在使用gcc,那么这样的事情:
int main()
{
unsigned char array[128];
for (unsigned char index = 0; index < 128; index++) {
asm("cli\n\t"
"out %%al,$0x70\n\t"
/* some kind of real delay here is probably best */
"in $0x71, %%al\n\t" /* Fetch 1 byte to al*/
"sti" /* Enable interrupts*/
: "=a" (array[index]) : "a" (index) );
}
}
这最大限度地减少了你必须编写的asm数量(4行与你的6行)并允许编译器执行更多优化。请参阅gcc&#39; s inline asm的文档,了解这一切是如何运作的。
我还没有尝试过这样做,因为它不会在保护模式操作系统(如Windows)上运行。 In
和Out
是受保护的指令,用户模式应用程序无法使用。我假设您在DOS上运行此操作?