【问题标题】:Passing table pointer from C to Assembly Function将表指针从 C 传递到汇编函数
【发布时间】:2012-05-02 08:07:55
【问题描述】:

我遇到了一个涉及 C 和 Assembly 合作的问题。我想写一个程序,将表指针发送到汇编函数,在这个函数中,表中填充了一些数据,next返回到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"

如果有任何可能有问题的建议,我将不胜感激

【问题讨论】:

  • 为什么不在调试器中单步调试代码?这会很快地告诉你问题出在哪里。
  • 由于它始终是相同的值,因此您没有写入正确的内存位置,并且您提供的信息不足,例如arch、汇编程序、函数调用标准……设置堆栈帧的代码也会有所帮助。并 +1 以“使用调试器逐步完成”。

标签: c arrays pointers assembly


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢我终于明白我的错误是什么了。我还根据您的想法找到了解决方案。这就是如何修复它的问题的答案: 第一个简单声明:segment .data Four dw 4 next mov ebx, tab fild word [Four] //conversion int-> mov ebx, tab fstp qword [ebx] // pop从 stack sreight 到 tab Mayby 这有点糟糕,但它的工作原理。也感谢使用 gdb 的建议;)。真的很有用!
【解决方案2】:

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

第一个简单声明:

 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 的建议;)。真的很有用!

【讨论】:

    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 2016-10-01
    • 2015-02-03
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多