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 

コードの達成を簡単にするために、タブ[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 double precision numbersでは、指数は上位ビットにあり、あなたの場合はゼロです。分数が非ゼロ (この場合は 4) であるため、非正規数があります。これは、4 ではなく、非常に小さな数を書いたことを意味します。

4 のdoubleバージョンをそのアドレスに移動したいと思います。

于 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 に答える