将 VS 内联汇编器翻译成 GCC 内联汇编器

用户10481362

我发现这个带有内联汇编代码的 C 代码:

ReadFromCMOS (unsigned char array [])
{
   unsigned char tvalue, index;

   for(index = 0; index < 128; index++)
   {
      _asm
      {
         cli             /* Disable interrupts*/
         mov al, index   /* Move index address*/
         /* since the 0x80 bit of al is not set, NMI is active */
         out 0x70,al     /* Copy address to CMOS register*/
         /* some kind of real delay here is probably best */
         in al,0x71      /* Fetch 1 byte to al*/
         sti             /* Enable interrupts*/
         mov tvalue,al
       }

       array[index] = tvalue;
   }
}

WriteTOCMOS(unsigned char array[])
{
   unsigned char index;

   for(index = 0; index < 128; index++)
   {
      unsigned char tvalue = array[index];
      _asm
      {
         cli             /* Clear interrupts*/
         mov al,index    /* move index address*/
         out 0x70,al     /* copy address to CMOS register*/
         /* some kind of real delay here is probably best */
         mov al,tvalue   /* move value to al*/
         out 0x71,al     /* write 1 byte to CMOS*/
         sti             /* Enable interrupts*/
      }
   }
}

我试图转换为 GNU 内联汇编器,但我失败了,主要是因为 GNU 内联汇编很混乱,使用过时的 AT&T 语法并且难以使用。

给我错误的代码:

void read_cmos(unsigned char array[])
{
    unsigned char tvalue, index;
    for (index = 0; index < 128; ++index)
    {
        /* read from CMOS */
        asm ("cli; outb %1, $0x70; inb $0x71, %0; sti" : "=a"(tvalue) : "a"(index));
    }
    array[index] = tvalue;
}
模糊

尝试这样的事情:

/* read from CMOS */
asm ("cli; outb %1, $0x70; inb $0x71, %0; sti" : "=a"(tvalue) : "a"(index));

/* write to CMOS */
unsigned char i = index;
asm volatile ("cli; outb %0, $0x70; movb %1, %%al; outb %%al, $0x71; sti" : "+a"(i) : "rm"(tvalue));

请注意,使用额外的变量 fortvalue是可选的。你也可以指定

"+a"(array[index])

或者

"a"(array[index])

直接地。重要的是您传递的表达式具有字节大小的类型,因此 gcc 选择al而不是eax.

需要分配indextoi以允许al在不更改 的值的情况下被破坏index这段代码应该可以正常工作。或者,第二组指令也可以分为两部分:

asm volatile ("cli; outb %0, $0x70" :: "a"(index));
asm volatile ("outb %0, %0x71" :: "a"(tvalue));

这避免了对额外变量的需要,并在选择寄存器时为编译器提供了更大的灵活性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

“不支持mov” GCC内联汇编器

来自分类Dev

gcc内联汇编器定义字符串

来自分类Dev

“不支持mov” GCC内联汇编器

来自分类Dev

C ++将参数传递给内联汇编器函数

来自分类Dev

将GCC / ATT样式的汇编器转换为Visual Studio汇编器?

来自分类Dev

Powerpc拱上的gcc内联汇编器隐式函数声明

来自分类Dev

使用-O1和内联汇编器的GCC分段故障

来自分类Dev

内联汇编器在 vs 2015 中给出了 c2400

来自分类Dev

内联汇编器语法错误

来自分类Dev

将数据放在.text中时的汇编器警告和gcc警告

来自分类Dev

为什么GCC无法通过-Wa,-adhln = a.lst将选项传递给gas汇编器?

来自分类Dev

从C的内联汇编器中定义的访问数组

来自分类Dev

内联汇编器:标志-保存或不保存

来自分类Dev

Delphi内联汇编器和类属性

来自分类Dev

使用内联汇编器调用Brk syscall

来自分类Dev

将结构体/记录从汇编器传递到Ada

来自分类Dev

将各种参数从C传递到汇编器

来自分类Dev

将GNU汇编器编译到Windows

来自分类Dev

GCC ARM如何使用内联汇编将值分配给特定的fp寄存器?

来自分类Dev

将标签移入64位寄存器-内联汇编(GCC / CLANG)

来自分类Dev

汇编器SegFail

来自分类Dev

(C中的内联汇编)汇编器消息:错误:未知伪操作:

来自分类Dev

ARM GCC内联汇编

来自分类Dev

gcc交叉编译器使用了错误的汇编器

来自分类Dev

生成ELF而不是目标文件的Tizen gcc汇编器-无法创建静态库

来自分类Dev

汇编器char输出

来自分类Dev

汇编器-数组问题

来自分类Dev

汇编器签名比较

来自分类Dev

GNU汇编器宏