将表指针从C传递给Assembly Function

时间:2012-05-02 08:07:55

标签: c arrays pointers assembly

我遇到了一个与C和大会合作有关的问题。我想编写一个程序,它向汇编程序的函数发送一个表指针,在这个函数中,表填充了一些数据,然后返回到C并将结果写入输出。

以下代码与C部分有关:

#include <stdio.h>
extern int oblicz(double,double, double, double, int, double *);//a signature of an  exter assembly function
int oblicz(double,double, double, double, int, double *);// the last position is a pointer  of my table
 //(some code)
 size =(int)k;
tab  = (double *)malloc(sizeof(double)*(size+1)); // alocation of memory
if (oblicz(a,b,P,Q,size,tab)) //the function
{
   for(i;i<size;i++)
    printf ("a result on %d index is %.10g \n",i, tab[i] );
}

装配部分:

 %define a qword [ebp+8]
%define b qword [ebp+16]
%define P qword [ebp+24]
 %define Q qword [ebp+32]
 %define sizet dword [ebp+40]
 %define tab dword [ebp+44]// the table pointer 

使代码完成变得简单我在下面的语法合成中使用了我只设置了tab [0]

;i omited setting frame etc.
xor ebx,ebx
mov ebx, tab
mov qword [ebx], 4

并且导致C是

a result on: 0 -is 1.669124542e-307 // it is always the same independently of value in this line : "mov qword [ebx], 4"

我会对任何可能出错的建议表示感谢

2 个答案:

答案 0 :(得分:1)

因此,您将文字整数 4移动到选项卡的第一个元素。第一个元素将如下所示:

04 00 00 00 00 00 00 00
^^ low address       ^^ high address

IEEE 754 double precision numbers中,指数位于顶部位,在您的情况下为零。由于分数不为零(在您的情况下为4),因此您有一个subnormal number。这意味着你写了一个非常小的数字而不是4。

我猜你想将版本的4移动到该地址。

答案 1 :(得分:0)

谢谢,我终于明白了我的错误。我根据你的想法找到了解决方案。这就是如何修复它的答案:

首先简单声明:

 segment .data
  Four dw 4

mov ebx, tab

fild word [Four]  //conversion int-> 
mov ebx, tab      
 fstp qword [ebx] // pop from stack streight to tab

也许它有点蹩脚但它确实有效。 还要感谢使用gdb的设备;)。这真的很有用。!