0

我有一个关于 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"

我会很感激任何可能有问题的建议

4

2 回答 2

1

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

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

IEEE 754 双精度数中,指数位于最高位,在您的情况下为零。由于分数不为零(在您的情况下为 4),因此您有一个次正规数。这意味着你写了一个非常小的数字,而不是 4。

我猜您想将 4 的双重版本移动到该地址。

于 2012-05-02T09:56:45.310 回答
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 的建议;)。真的好用啊!!

于 2012-05-04T17:06:24.203 回答