gcc asm太多内存引用

时间:2015-10-10 16:29:27

标签: c for-loop gcc memory reference

我正在尝试使用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编译

2 个答案:

答案 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)上运行。 InOut是受保护的指令,用户模式应用程序无法使用。我假设您在DOS上运行此操作?