2017-11-01 49 views
-1

スタックメモリアドレスをレジスタに格納しようとしています。要点は、3つの引数を取るアセンブリコードからc関数を呼び出すことです。スタック内の位置のメモリアドレスをアセンブリからどのように渡すか?

1)関数へのポインタ:私はleaq label(%rip), %rdi

2を使用して取得)INT:単純で、movq $2, %rsi

3)メモリアドレスへのポインタ:これはトリッキーな部分です。このアドレスはスタック位置2 = -16(%rsp)と言うことができます。

このスタック位置をレジスタ%rdxに渡して、c関数でその結果を書き込む方法はありますか?

注:このc機能は、知っておく必要がある場合はスレッドpthreadです。

+1

LEA -16(%のRSP)、CPUの%RDX – prl

+1

アセンブリ? – EJP

+0

@EJP x86アーキテクチャ – Bibrak

答えて

2

私はそれをしました、ありがとう。ここで完全なソリューションである:

アセンブリコード:

1 .globl main 
    2 main: 
    3 
    4 pushq %rbp 
    5 movq %rsp, %rbp 
    6 subq $8, %rsp 
    7 
    8 movq $50, -8(%rbp) 
    9 
10 leaq PrintHello(%rip), %rdi 
11 movq $17, %rsi 
12 leaq -8(%rbp), %rdx 
13 
14 callq dispatcher 
15 callq wait 
16 
17 movq -8(%rbp), %rax 
18 movq %rax, %rdi 
19 callq print_int 
20 
21 addq $8, %rsp 
22 movq $0, %rax 
23 popq %rbp 
24 retq 

出力:

In dispatcher arg = 17 
In wait 
wrap_func: args_data.ret = 50 
Hello World! It's me, thread # 17! 
wrap_func: after assignment-> args_data.ret = 20 
Exit from wait 
関連する問題