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為單個的字元
}
就這樣,簡單吧,去試試吧 :-)