如何在彙編呼叫c語言函式

2021-08-09 10:12:33 字數 1694 閱讀 4792

1樓:匿名使用者

用彙編呼叫c函式,比較簡單一點。

把c程式編譯成obj。

在組合語言呼叫c函式之前,這樣宣告一下:

extrn ***x:far(其中***x是c寫的函式,依據實際情況,可能要加乙個前導下劃線,寫成_***x:far)

然後call就可以了,很好用

鏈結時和c的obj一起鏈結

很簡單的,你不妨試試

2樓:韌勁

一、 引數傳遞的基本規則(atpcs(arm—thumb procedure call standard))

1、 引數傳遞

二、匯程式設計序、c程式相互呼叫舉例

1、 c程式呼叫匯程式設計序

匯程式設計序的設計要遵守atpcs(arm—thumb procedure call standard),保證程式呼叫時引數的正確傳遞。在匯程式設計序中使用export 偽操作宣告本程式,使得本程式可以被別的程式呼叫。在c程式使用extern宣告該匯程式設計序。

下面是乙個c程式呼叫匯程式設計序的例子。其中匯程式設計序strcopy實現字串複製功能,c程式呼叫strcopy完成字串複製的工作。

//c程式

#include

extern void strcopy(char *d, const char *s);

int main( )

;匯程式設計序

area scopy, code, readonly

export strcopy

strcopy

ldrb r2, [r1], #1

strb r2, [r0], #1

cmpr2,#0

bne strcopy

mov pc, lr

end2、 匯程式設計序呼叫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 )

; 匯程式設計序呼叫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 stopend

3樓:海獅

c語言需要執行環境,需要初始化暫存器等。

直接呼叫是不行的

C語言指標建立函式問題,C語言指標呼叫函式問題,急求解釋(本題是《c和指標》上的題目)

第乙個表示傳遞graphadjlist型別的引用g,第二個表示傳遞graphadjlist型別的指標g 另外這是c 不是c。c語言指標呼叫函式問題,急求解釋 本題是 c和指標 上的題目 c語言指標作函式引數時的返回問題 首先,弄懂函式引數都是靠值傳遞。指標也是。進入函式後,函式建立幾個空間給形參,再...

c語言函式呼叫引數傳遞的是什麼,C語言函式呼叫引數傳遞的是什麼

c語言傳遞的是值而不是位址,這一點從vb轉過來的程式設計師一定要注意。否則不經意間就會犯錯誤。另外下層函式修改上層函式變數不是一種好習慣,容易引發錯誤。c語言中函式可以返回乙個函式值,如果你需要返回多個函式值可以用下面的形式 fun int a,int b main 如果按vb的習慣,fun int...

C語言函式呼叫的問題

主函式的a作為輸入引數輸入給函式aaa進行計算,計算後a的值不發生變化。這是c語言的基本規則。從編譯原理角度講,輸入aaa的只是a的值,並不是a所在的暫存器或位址,a的值輸入aaa後,該值被存放在另乙個臨時暫存器或位址,發生改變的是這個臨時暫存器或位址的值,而非a所在的暫存器或位址的值,所以,a的值...