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

标签 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;

有人知道如何简单地完成吗?

谢谢!

最佳答案

我会用这个循环来做:

    __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/

相关文章:

linux - 循环/输入逻辑流程问题(NASM x86 程序集)

c - 如何在 C 中正确编写将两个整数相加的函数

c - 是否有像 Haskell 的 Threadscope 这样的适用于 C/C++ 的良好线程跟踪器?

assembly - 为什么x86-64/AMD64 System V ABI要求16字节堆栈对齐?

assembly - 使用 MIPS 进行冒泡排序

memory - 8086汇编语言的简单问题

c - 是否可以使用目录流重命名 C 中的文件?

c - C 中的数据类型提升或降级

c - 在c中将时间戳散列到sha256校验和中

assembly - 我不确定这个 x86 Add 指令在做什么