2016-04-13 21 views
1

アセンブリでコードを実行するC言語の主な機能があります。CからGNUへのパラメータの受け渡し64bitのアセンブリ関数

main.cの

#include <stdio.h> 

extern int addByAssembly(int first_number, int second_number); 

int main (int argc, char **argv) 
{ 
    int sum=0; 
    sum = addByAssembly(5,4); 
    printf ("%d\n",sum); 
    return 0; 
} 

addByAssembly.s

.data 
SYSREAD = 0 
SYSWRITE = 1 
SYSEXIT = 60 
STDOUT = 1 
STDIN = 0 
EXIT_SUCCESS = 0 

.text 
#.global main 
#main: 
#call write 
#movq $SYSEXIT, %rax 
#movq $EXIT_SUCCESS, %rdi 
#syscall 

#******** 
.globl addByAssembly 
addByAssembly: 
pushq %rbp 
movq %rsp, %rbp 
movq 16(%rsp), %rax 
addq 24(%rsp), %rax 

movq %rbp, %rsp 
popq %rbp 

しかし、私は、私の合計に混乱を得た:私は、単純な合計を作りたいです。

movq $123, %rax 

戻り値私は多くの方法を試してみました「VEの123ですが、合計に適切にこれを作る方法を見つけることができません:それは、私はこれを行う場合beause私はひどく、引数を渡すように見えます。

+0

はあなたが、実際には、適切な引数をキャプチャしていることを確認するために、デバッガでステップ実行しようとしたことがありますか? –

+3

あなたはABIを読んで理解し、それに従っていましたか?引数がスタックに渡されるとは思わない。一般的に、インラインアセンブラを使用する方が効果的です。 – Olaf

+0

まあ、私はしませんでした。私の言葉にはほとんど情報がありません。英語の芸術家は、よく、技術的なものです。私はCからレジストリにintを渡すことは間違っていると思っていますが、私はそれが適切であるべきかどうかわかりません。私は例を見つけませんでしたので、私はここで尋ねています。 32ビットのお尻で – user2678074

答えて

0

私はこれを説明するために非常に多くの努力と時間のためにありがとう 'ジェスター'!

要約すると、 CからAs(AsからCへ)のパラメータを渡すことはそれ自身のABI conventionを持っています。 あなたがそこに見ることができるように、paramsを順に送信されます。 1)RDI 2)RSI 3)RDX ...のように...

場合、あなたは大会でより多くのパラメータを持って、それが積み重ねられます。私の場合はそう

.globl addByAssembly 
addByAssembly: 
pushq %rbp 
movq %rsp, %rbp 
--movq 16(%rsp), %rax #this was wrong as my params are 
--addq 24(%rsp), %rax # first in %rdi, second in %rsi 
++lea (%rdi, %rsi), %rax # in my case this line will do 
         # %rdi+%rsi -> %rax (learn lea, usefull command) 
         # REMEMBER return value is always in %rax! 
movq %rbp, %rsp 
popq %rbp 
関連する問題