我在Assembly中有这个代码,我想打开一个C程序,传递一个参数,并在执行这个C程序后,一个值返回到我的汇编程序。
更具体地说,这个:
[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
希望现在更清楚了。
再次,谢谢!
答案 0 :(得分:2)
如果您确定要执行整个程序而不只是调用函数,请查看如何执行system calls(这里是Linux的link,尽管我还没有读过这个),然后查看fork(2)
和wait(2)
。你必须提出一个方案来传回结果,比如pipe(2)
。
您无法从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'应用程序来调用你的函数,编译它并查看编译器生成的程序集。然后使用此程序集作为如何从汇编代码调用的示例。