A. 汇编语言是怎么调用c语言的程序的
一、 参数传递的基本规则(ATPCS(ARM—Thumb Procere Call Standard))
1、 参数传递
二、汇编程序、C程序相互调用举例
1、 C程序调用汇编程序
汇编程序的设计要遵守ATPCS(ARM—Thumb Procere Call Standard),保证程序调用时参数的正确传递。在汇编程序中使用EXPORT 伪操作声明本程序,使得本程序可以被别的程序调用。在C程序使用extern声明该汇编程序。
下面是一个C程序调用汇编程序的例子。其中汇编程序str实现字符串复制功能,C程序调用str完成字符串复制的工作。
//C程序
#include <stdio.h>
extern void str(char *d, const char *s);
int main( )
{
const char *srcstr=”First string-source”;
char dststr[ ]=”Second string-destination”;
printf(“Before ing:\n”);
printf(“%s\n %s\n”, srcstr,dststr);
str(dststr,srcstr);
printf(“After ing:\n”);
printf(“%s\n %s\n “,srcstr,dststr);
while(1) ;
}
;汇编程序
AREA S, CODE, READONLY
EXPORT str
Str
LDRB R2, [R1], #1
STRB R2, [R0], #1
CMPR2,#0
BNE Str
MOV PC, LR
END
2、 汇编程序调用C程序
汇编程序的设计要遵守ATPCS,保证程序调用时参数的正确传递。在汇编程序中使用IMPORT伪操作声明将要调用的C程序。下面是一个汇编程序调用C程序的例子。其中在汇编程序中设置好各参数的值。本例中有6个参数,分别使用寄存器R0存放第1个参数,
R1存放第2个参数, R2存放第3个参数, R3存放第4个参数, 第5个、第6个参数利用数据栈传送。由于利用数据栈传递参数,在程序调用结束后要调整数据栈指针。
//C程序g( )返回6个参数的和
int g( int a, int b, int c, int d, int e, int f )
{
printf(“e=%d\n”, e);
printf(“f=%d\n”, f);
return (a+b+c+d+e+f);
}
; 汇编程序调用C程序 g( ) 计算6个整数 i, 2*i, 3*i, 4*i, 5*i, 6*i的和
EXPORT f
AREA f ,CODE, READONLY
IMPORT g
MOV R0, #1
ADD R1, R0, R0
ADD R2, R1, R0
ADD R3, R2, R0
ADD R4, R3, R0
ADD R5, R4, R0
STR R4, [SP, #-4]!
STR R5, [SP, #-4]!
BL g
ADD SP, SP, #4
ADD SP, SP, #4
STOP B STOP
END
B. 如何在C++中调用C程序
如果引用多个,那么就如下所示
extern “C”{
#include “ s.h”
#include “t.h”
#include “g.h”
#include “j.h”};
然后在调用这些函数之前,需要将函数也全部声明一遍。2.
C++调用C函数的方法,将用到的函数全部重新声明一遍
extern “C”{
extern void A_app(int);
extern void B_app(int);
extern void C_app(int);
C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个C 函数的声明如下:
void foo(int x, int y);
该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。例如:
extern “C”{
void foo(int x, int y);
// 其它函数}或者写成
extern “C”{
#include “myheader.h”
// 其它C 头文件}
这就告诉C++编译译器,函数 foo 是个C 连接,应该到库中找名字_foo 而不是找_foo_int_int。
C. 怎么用java调用C的EXE程序并且实现程序自动输入
import java.io.*;
import java.lang.*;
import java.nio.charset.*;
public class Rt
{
public static void main(String[] args) throws Exception
{
if( args.length == 0 ) {
System.out.println("用法: java Rt <目标EXE> <提供给的参数...>");
return;
}
Runtime rt = Runtime.getRuntime();
ProcessBuilder pb = new ProcessBuilder(args);
Process p = pb.start();
p.waitFor();
int exitCode = p.exitValue();
System.out.println("exitCode = " + exitCode);
InputStream resultStream = p.getInputStream();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int size, SIZE = 4096;
byte[] buffer = new byte[SIZE];
while( (size = resultStream.read(buffer)) != -1 ) {
outputStream.write(buffer, 0, size);
}
byte[] bytes = outputStream.toByteArray();
outputStream.close();
String str = new String(bytes);
System.out.println(str);
}
/*
#include <stdio.h>
int main(int argc, char *argv[])
{
int i = 0;
printf("argc = %d\n", argc);
for(i = 0; i < argc; i ++)
printf("argv[%d] = %s\n", i, argv[i]);
return 0;
}
*/
}
D. java怎么引用c
Java调用C语言程序时,主要是涉及到操作系统底层的事件。这种时间Java无法处理,例如用户上传一内个视频文容件,需要后台给视频加上水印,或者后台分离视频流和音频流。只能通过调用C语言处理。
使用Java如何去调用C语言的接口呢?使用Java的JNI技术。
具体调用步骤如下:
1.首先创建Java文件 HelloJni.java ,并创建native方法。
2.编译Java文件并生成java头文件。
3.创建C语言文件,HelloWorld.c。
4.生成动态链接库文件 libhello.so。
5.设置动态链接库文件的目录。
6.把刚才生成的so文件拷贝到/home/lib下,然后执行class文件。
E. C璇瑷鍑芥暟璋冪敤鐨勪笁绉嶆柟寮忓苟鍒嗗埆涓句竴渚嬨
1銆佸间紶閫掞紝鍒涘缓鍙橀噺x鍜寉锛寈鐨勫肩瓑浜巃鐨勫硷紝y鐨勫肩瓑浜巄鐨勫
void Exchg1(int x, int y)
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf(鈥渪=%d,y=%d/n鈥,x,y)
}
void main()
{
int a=4,b=6;
Exchg1 (a,b) ;
printf(鈥渁=%d,b=%d/n鈥,a,b)
}
2銆佸湴鍧浼犻掞紝鐩稿綋浜庡缓绔嬩簡px鍜宲y涓や釜鎸囧悜鏁村瀷鐨勬寚閽堬紝鍏跺煎垎鍒涓篴鍜宐鐨勫湴鍧
Exchg2(int *px, int *py)
{
int tmp=*px;
*px=*py;
*py=tmp;
print(鈥*px=%d,*py=%d/n鈥,*px,*py);
}
main()
{
int a=4;
int b=6;
Exchg2(&a,&b);
Print(鈥渁=%d,b=%d/n鈥, a, b);
}
3銆佸紩鐢ㄤ紶閫掞紝x鍜寉鐩存帴寮曠敤a鍜宐锛屽筧鍜宐鎿嶄綔锛岀浉褰撲簬缁檃銆乥璧蜂簡鍒鍚峹銆亂
Exchg2(int &x, int &y)
{
int tmp=x;
x=y;
y=tmp;
print(鈥渪=%d,y=%d/n鈥,x,y);
}
main()
{
int a=4;
int b=6;
Exchg2(a,b);
Print(鈥渁=%d,b=%d/n鈥, a, b);
}
printf鐢ㄦ硶锛
printf()鍑芥暟鐨勮皟鐢ㄦ牸寮忎负:printf("<鏍煎紡鍖栧瓧绗︿覆>",<鍙傞噺琛>)銆
鍏朵腑鏍煎紡鍖栧瓧绗︿覆鍖呮嫭涓ら儴鍒嗗唴瀹癸細涓閮ㄥ垎鏄姝e父瀛楃︼紝杩欎簺瀛楃﹀皢鎸夊師鏍疯緭鍑;鍙︿竴閮ㄥ垎鏄鏍煎紡鍖栬勫畾瀛楃︼紝浠"%"寮濮嬶紝鍚庤窡涓涓鎴栧嚑涓瑙勫畾瀛楃︼紝鐢ㄦ潵纭瀹氳緭鍑哄唴瀹规牸寮忋
鍙傞噺琛ㄦ槸闇瑕佽緭鍑虹殑涓绯诲垪鍙傛暟锛屽叾涓鏁板繀椤讳笌鏍煎紡鍖栧瓧绗︿覆鎵璇存槑鐨勮緭鍑哄弬鏁颁釜鏁颁竴鏍峰,鍚勫弬鏁颁箣闂寸敤","鍒嗗紑,涓旈『搴忎竴涓瀵瑰簲锛屽惁鍒欏皢浼氬嚭鐜版剰鎯充笉鍒扮殑閿欒銆
姣斿傦細
int a=1234锛
printf("a=%d ",a);
杈撳嚭缁撴灉涓篴=1234銆
F. C语言 如何调用另一个程序的计算结果急!!!!!
这种返回结果不能获得的,除非使用动态连接库dll,要想通过exe获得结果,需要将第一个程序的返回结果改为输出结果:
#include"stdio.h"
floatmain()
{
floatt=100.5;
printf("%f",t);
return(t);
}
然后再第二个人程序中将输出重定向到一个文件,然后从文件中读入:
system("H1.exe >data.txt");
然后再从文件中读出结果(读文件代码很多,可网上找)
G. c语言如何 调用外部程序
fe函数名: exec...
功 能: 装入并运行其它程序的函数
用 法: int execl(char *pathname, char *arg0, arg1, ..., argn, NULL);
int execle(char *pathname, char *arg0, arg1, ..., argn, NULL,
char *envp[]);
int execlp(char *pathname, char *arg0, arg1, .., NULL);
int execple(char *pathname, char *arg0, arg1, ..., NULL,
char *envp[]);
int execv(char *pathname, char *argv[]);
int execve(char *pathname, char *argv[], char *envp[]);
int execvp(char *pathname, char *argv[]);
int execvpe(char *pathname, char *argv[], char *envp[]);
程序例: /* execv example */
#include <process.h>
#include <stdio.h>
#include <errno.h> void main(int argc, char *argv[])
{
int i; printf("Command line arguments:\n");
for (i=0; i<argc; i++)
printf("[%2d] : %s\n", i, argv[i]); printf("About to exec child with arg1 arg2 ...\n");
execv("CHILD.EXE", argv); perror("exec error"); exit(1);
}
多看书,多Google,网络,
H. c语言如何 调用外部程序
1. 在调用之前,先声明和定义函数
2. 根据你函数的参数类表来,填入函数调用时所真正用到的参数来进行调用
例如:要在函数 F(){... } 中调用新增的小程序int FA(int a)和 char FC(char c),按照上面讲的:
1.声明和定义
int
FA(int a){ /*函数功能具体的定义*/};
char
FC(char& c){ ... /*函数功能具体的定义*/};
2 根据函数的声明,在F()中加以调用
void
F()
{
... ...
int getA = FA(6); //6为int,如果参数是6.001,则会强制转换成为6
... ...
char getC= FC('a') //a为单个的字符
}
就这样,简单吧,去试试吧 :-)