我有一个非常简单的问题;我有一个数组,它应该存储一些
内联汇编程序例程。我现在的问题是如何从
数组中的内联汇编程序?我使用gcc在x86机器上编译。考虑以下简单的代码片段:

int main() {
  int result[32];

  __asm__ __volatile__(  ".mov  esi, 32 \n\t");

  __asm__ __volatile__(  ".mov  edi, 32 \n\t");

  __asm__ __volatile__(  ".rept 32 \n\t");
  __asm__ __volatile__(  ".mov  eax, esi \n\t");

  __asm__ __volatile__(  ".sub  eax, edi \n\t");

  __asm__ __volatile__(  ".sub  edi, 1 \n\t");

  //Code here for storing eax in result[0], result[1], ... result[31],

  __asm__ __volatile__(  ".endr \n\t");

  for(i=0; i<32; i++)
     printf("%d\n", results[i]);

  return (0);
}

最后,输出应该是这样的:
结果[0]=32;
结果[1]=31;
结果[2]=30;
...
结果[31]=1;
有人知道,怎么能这么简单?
谢谢!

最佳答案

我会用这个循环:

    __asm {
        lea edx, result
        mov ecx, 32
loop1:
        mov dword ptr [edx], ecx
        add edx, 4
        loop loop1
    }

更新(感谢Bastien的评论):在研究了此文档之后(http://www.cs.virginia.edu/~clc5q/gcc-inline-asm.pdf):
从asm(在GCC中)访问的变量必须是静态的,源和目标是相反的,必须使用特殊语法来偏移数组。
#include <stdio.h>

static int results[32];

int main(int argc, char** argv)
{
    int i;

    asm volatile( "xor %eax, %eax \n\t");
    asm volatile( "movl $0x020, %edi \n\t");
    asm volatile( ".rept 32 \n\t");
    asm volatile( "mov %edi, _results(,%eax,4) \n\t");
    asm volatile( "dec %edi \n\t");
    asm volatile( "inc %eax \n\t");
    asm volatile( ".endr");

    for (i=0; i<32; i++)
        printf("%d\n", results[i]);

    return 0;
}

这对gcc 3.4.4(cygwin)起作用

关于c - 将数据从内联汇编移动到C中的数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/910066/

10-10 17:13
查看更多