2016-05-26 19 views
0

私はCプログラムからasm関数を呼び出し、別のC関数を呼び出して新しいパラメータを渡そうとしますが、2番目の関数はasmのパラメータを受け取りました。ここに3つのファイルがあります。Cの呼び出しからASMのパラメータを取得する

main.cの

#include <stdio.h> 
#include <stdlib.h> 
#include "ac.h" 

int main (int argc,char **argv) 
{ 
    char * s = _pusher(115,9); 
    fprintf(stdout,"From pusher '%s'\n",s); 
    free(s); 
    return EXIT_SUCESS; 
} 

#define _GNU_SOURCE 
#include <stdio.h> 
#include <stdlib.h> 
#include "ac.h" 

char * _aff(int a,int b) 
{ 
    char * s; 
    fprintf(stdout,"In aff(%d,%d)\n",a,b); 
    asprintf(&s,"v = %d - %d",a,b); 

    return s; 
} 
ac.cファイル

ファイルaa.asm

[CPU x64] 
[BITS 64] 

extern _aff 
global _pusher 

[SECTION .text] 
_pusher: 
    push rbp 
    mov rbp,rsp 

    push 123 ;seems no effect 
    push 321 ;seems no effect 

    call _aff 

    add rsp,24 
    mov rsp,rbp 
    pop rbp 
    ret 

[SECTION .data] 
[SECTION .bss] 

私が実行すると、私はこの出力を得る:

In aff(115,9) 
From pusher : 'v = 115 - 9' 

しかし、私は私自身の新しいパラメータを渡すにはどうすればよい

In aff(123,321) 
From pusher : 'v = 123 - 321' 

を期待していましたか? OPは、彼が彼のアセンブリ言語関数に渡したパラメータが処理されていなかったことに気づい

_aff(char *param,...) and use VA_LIST inside so pusher should be call like this 
_pusher(int count,char **tbl) 
+0

読みますあなたのプラットフォームのABIと期待通りに引数を渡します。 – Olaf

+0

奇妙なことは、メインから送信されるそれらのパラメータが_affに向かっているということです。私はmov rbp、rspは私の新しいスタックを作ったと思った – lilington

+0

あなたはすでに質問で明らかにしたことを繰り返さないでください。コメントを理解できない場合は、「ABI」を検索してください。 – Olaf

答えて

1

:最終的な目標は_pusher a char **に取ると、このようなaffを呼び出すことです。

@Olafは、OPが正しい環境変数ABI(アプリケーションバイナリインターフェイス - プラットフォーム上の関数の呼び出し方法の定義)を使用していないことに気付きました。彼はWikipediaで説明されている古いものを使用していました。

@Michaelペッチは、x64の開発のために、代わりにPUSHスタック(x86の規則)に値をINGのの、彼は最初の二つの期待のレジスタにロードする必要があることを示すことによって明らか:RDIRSI

0

私はちょうど私は6ヶ月後に作業コードを投稿するのを忘れていました。 したがって、asm関数はchar **を受け取り、それを整形してredisに送信します。

このコードは他の人にとって役に立ちます。

redisReply * _pusher(redisContext *c, int count, char **args); 

はその後_pusherは(argsが[0]、...、argsが[COUNT-1]を、 "...%S%S"、C)redisCommandを呼び出します。

[CPU x64]                
[BITS               
extern redisCommand 
global _pusher 

[SECTION.text]                 
_pusher: 
push rbp 
mov rbp,rsp 

mov rax,rsi 
cmp rax,1 
je arg_1 

cmp rax,2 
je arg_2 

cmp rax,3 
je arg_3 

cmp rax,4 
je arg_4 

cmp rax,5 
jge arg_more 

arg_1:               
sub rsp,0x3 
mov byte [rbp - 0x3],0x25 
mov byte [rbp - 0x2],0x73          
mov byte [rbp - 0x1],0x0          

mov rax,rdi             
mov rdi,rdx             
mov rdx,[rdi]             
lea rsi,[rbp - 0x3]          
mov rdi,rax             
jmp debut_appel             

arg_2:               
sub rsp,0x6             
mov byte [rbp - 0x6],0x25          
mov byte [rbp - 0x5],0x73          
mov byte [rbp - 0x4],0x20          
mov byte [rbp - 0x3],0x25          
mov byte [rbp - 0x2],0x73          
mov byte [rbp - 0x1],0x0          

mov rax,rdi             
mov rdi,rdx             
mov rdx,[rdi]             
mov rcx,[rdi + 0x8]          
lea rsi,[rbp - 0x6]          
mov rdi,rax             
jmp debut_appel 

arg_3: 
sub rsp,0x9 
mov byte [rbp - 0x9],0x25 
mov byte [rbp - 0x8],0x73 
mov byte [rbp - 0x7],0x20 
mov byte [rbp - 0x6],0x25 
mov byte [rbp - 0x5],0x73 
mov byte [rbp - 0x4],0x20 
mov byte [rbp - 0x3],0x25 
mov byte [rbp - 0x2],0x73 
mov byte [rbp - 0x1],0x0 

mov rax,rdi 
mov rdi,rdx 
mov rdx,[rdi] 
mov rcx,[rdi + 0x8] 
mov r8, [rdi + 0x10] 
lea rsi,[rbp - 0x9] 
mov rdi,rax 
jmp debut_appel 

arg_4: 
sub rsp,0xc 
mov byte [rbp - 0xc],0x25 
mov byte [rbp - 0xb],0x73 
mov byte [rbp - 0xa],0x20 
mov byte [rbp - 0x9],0x25 
mov byte [rbp - 0x8],0x73 
mov byte [rbp - 0x7],0x20 
mov byte [rbp - 0x6],0x25 
mov byte [rbp - 0x5],0x73 
mov byte [rbp - 0x4],0x20 
mov byte [rbp - 0x3],0x25 
mov byte [rbp - 0x2],0x73 
mov byte [rbp - 0x1],0x0 

mov rax,rdi 
mov rdi,rdx 
mov rdx,[rdi] 
mov rcx,[rdi + 0x8] 
mov r8, [rdi + 0x10] 
mov r9, [rdi + 0x18] 
lea rsi,[rbp - 0xc] 
mov rdi,rax 
jmp debut_appel 

arg_more: 
mov r8,rdi           
mov rdi,rdx 
mov rcx,rax 
sub rcx,5 
lea rax, [rcx * 3] 
add rax, 0xf 

sub rsp,rax 
mov rdx,rbp 
sub rdx,rax 
lea rsi,[rdx] 

mov byte [rbp - 0xc],0x25 
mov byte [rbp - 0xb],0x73 
mov byte [rbp - 0xa],0x20 
mov byte [rbp - 0x9],0x25 
mov byte [rbp - 0x8],0x73 
mov byte [rbp - 0x7],0x20 
mov byte [rbp - 0x6],0x25 
mov byte [rbp - 0x5],0x73 
mov byte [rbp - 0x4],0x20 
mov byte [rbp - 0x3],0x25 
mov byte [rbp - 0x2],0x73 
mov byte [rbp - 0x1],0x0 


;debut de boucle 
loop_start: 
    mov byte [rdx],0x25 
    mov byte [rdx + 1],0x73 
    mov byte [rdx + 2],0x20 
    add rdx,0x3 

    lea rax , [rcx * 0x8] 
    mov rbx,[rdi + rax + 0x20] 
    push rbx 
関連する問題