我遇到了一个与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"
我会对任何可能出错的建议表示感谢
答案 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的设备;)。这真的很有用。!