如何从汇编代码运行C二进制文件?

时间:2011-05-31 02:09:42

标签: c assembly binary

我在Assembly中有这个代码,我想打开一个C程序,传递一个参数,并在执行这个C程序后,一个值返回到我的汇编程序。

更具体地说,这个:

  • 打开一个C程序,将String作为参数传递。
  • C程序会将此String转换为float并将其返回
  • 我会抓住这个漂浮物并在我的装配程序中使用它。
[ASM]                 // Executing Assembly code
     \------------->  // Run C Program passing a value as parameter
      [C Program]     // Do Stuff
     /------------->  // Return value that I can catch back in my Assembly code
[ASM]                 // Goes back to executing Assembly code using value the 
                      // value received by the C program.

重要信息:我在Linux上,并不确定我的C二进制文件是什么。 * .out可能吗?也可以使用一些指针。

PS:我知道所有的浮点指令以及我在Assembly中所做的无数其他选项,但它适用于我的计算机体系结构和组织类,这就是我需要它的方式。

谢谢大家。

编辑:让我解释一下。

我已将此C代码编译到名为Convert的文件中,并将其放入与我的程序集(.s)代码相同的文件夹中:

//#includes
int main(int argc, char* argv[]){

    float fVal;
    sscanf(argv[1], "%f", &fVal);

    return fVal;
}

通过Assembly,我想执行Convert传递字符串为“3.1415”作为参数。 转换会将其转换为浮动并返回。

通过Assembly,然后我将从堆栈中POP,并使用Float 3.1415。

我想到的只是一个系统调用:

push   parameter
push   Executable's name
sys                     ! to wake the system to run my executable

pop    eax              ! pop the Float returned by Convert to EAX

希望现在更清楚了。

再次,谢谢!

3 个答案:

答案 0 :(得分:2)

如果您确定要执行整个程序而不只是调用函数,请查看如何执行system calls(这里是Linux的link,尽管我还没有读过这个),然后查看fork(2)wait(2)。你必须提出一个方案来传回结果,比如pipe(2)

编辑0:

您无法从float那样返回main()。首先,它将被转换为整数,因此您将丢失小数部分。其次,操作系统实际上只使用了部分单词来返回程序退出 status 。查看您在C中使用的宏的wait(2)手册页以提取该状态,并查看libc标题以查看它们的作用。

您需要使用其他工具来返回流程中的浮点值,可能类似于Unix pipeline

答案 1 :(得分:1)

您当然可以实现总体目标,而不必通过委派给C来手动编写浮点转换代码,但是您正在以错误的方式思考问题。您无需从汇编程序中调用整个C程序,只需调用一个函数即可。这个函数叫做strtod,你不必实现它,因为它已经存在于C库中。

你似乎是在x86-32上,所以这应该做你想要的:

push    $0x0   ; endptr
push    parameter
call    strtod
addl    %esp, $8
; double return value is in %st(0)

答案 2 :(得分:0)

这取决于C编译器如何生成程序集/机器代码,以及它运行的cpu。

许多'C'编译器将传递堆栈上的函数参数,这意味着您将理解堆栈帧,在汇编代码中创建一个,然后跳转到'C'函数/标签。

所以也许简单的方法是创建一个Test'C'应用程序来调用你的函数,编译它并查看编译器生成的程序集。然后使用此程序集作为如何从汇编代码调用的示例。