我有一个非常简单的问题;我有一个数组应该存储一些结果 内联汇编程序。我现在的问题是如何从中移动数据 内联汇编程序进入数组?我正在使用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;
任何人都有这个想法,这怎么可以简单完成?
谢谢!
答案 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;
}
这样做,我得到错误信息:对结果的未定义引用。 我想这需要以某种方式传递给内联汇编?