将数据从内联汇编移动到C中的数组中

时间:2009-05-26 10:46:43

标签: c assembly

我有一个非常简单的问题;我有一个数组应该存储一些结果 内联汇编程序。我现在的问题是如何从中移动数据 内联汇编程序进入数组?我正在使用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;

任何人都有这个想法,这怎么可以简单完成?

谢谢!

3 个答案:

答案 0 :(得分:2)

我会用这个循环来做到这一点:

    __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中)访问的变量必须是静态的,源和&amp;目的地相反,必须使用特殊语法来偏移数组。

#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)

答案 1 :(得分:1)

此行放在“sub edi”行之前将进行复制(AT&amp; T语法 - 目的地在右侧):

__asm__ __volatile__(  "movl %ecx, $label(,%edi,$4) \n\t");

答案 2 :(得分:1)

请忽略我的上一条评论,我在这里再试一次:

int main() {

  int results[32];
  int i;

  __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");

   __asm__(".intel_syntax prefix");  
  __asm__ __volatile__( "mov dword ptr results[%edi*4], %eax \n\t");  
  __asm__(".att_syntax prefix");


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

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

  return 0;
}

这样做,我得到错误信息:对结果的未定义引用。 我想这需要以某种方式传递给内联汇编?