【发布时间】:2011-09-05 03:43:29
【问题描述】:
我在Assembly中有这段代码,我想打开一个C程序,传递一个参数,在执行这个C程序后,一个值返回给我的Assembly程序。
更具体地说,这个:
- 打开一个将字符串作为参数传递的 C 程序。
- C 程序会将此字符串转换为浮点数并返回
- 我会捕捉这个浮点数并在我的汇编程序中根据需要使用它。
重要信息:我在 Linux 上,不确定我的 C 二进制文件是什么。 *.out 也许?也可以使用一些指针。
PS:我知道所有浮点指令和无数其他选项,我可以在 Assembly 中完成这一切,但它适用于我的计算机体系结构和组织类,这就是我需要的方式。
谢谢大家。
编辑:让我解释一下。
我已将此 C 代码编译成一个名为 Convert 的文件,并将其放入与我的程序集 (.s) 代码相同的文件夹中:
//#includes
int main(int argc, char* argv[]){
float fVal;
sscanf(argv[1], "%f", &fVal);
return fVal;
}
通过程序集,我想执行转换,将字符串作为“3.1415”作为参数传递。 Convert 会将其转换为 float 并返回。
通过组装,然后我将其从堆栈中弹出并使用 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
希望现在更清楚了。
再次感谢!
【问题讨论】:
-
通常的做法是先用C编写代码,然后使用编译器生成的程序集。转换为汇编是完全可选的。
-
你确定它是一个“程序”,即一个完整的二进制文件,而不仅仅是一个单独编译的 C 函数吗?
-
是的,我写了一个 C 程序(实际上只是 main() 函数),编译了它,我想从我的汇编代码中运行它,例如:“程序参数”,我的程序将运行,捕获 argv[1]("parameter") 并返回一个值,我将使用 POP 在我的汇编代码中捕获该值以从堆栈中获取返回值。
-
上一个问题中使用 sscanf 的结果是什么?如果您的 c 库甚至不包含
sscanf,它很可能也不包含execve。这就是您要查找的函数的名称,顺便说一句 -
我从包含标准库的外部 C 程序调用
sscanf,但我的汇编程序实现了自己的系统调用,仅对标准的几个函数。库。没有我需要的所有功能。不过,我可以自己实现它们,甚至尝试过,但是针对带有少量荷兰语 cmets 的格式错误的代码,我就是赢不了......