簡體   English   中英

從C調用獲取ASM中的參數

[英]Getting parameter in ASM from C call

我從C程序調用了一個asm函數,然后嘗試調用另一個C函數並提供了新參數,但是第二個函數接收了asm的參數。 這是3個文件。

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;
}

ac.c文件

#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;
 }

文件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'

如何傳遞自己的新參數? 最終目標是接受_pusher a char **並按如下方式調用aff

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

OP注意到他傳遞給他的匯編語言函數的參數未得到處理。

@Olaf指出,OP沒有為他的環境使用正確的ABI(應用程序二進制接口-如何在平台上調用函數的定義)-他正在使用Wikipedia中描述的(很多)舊版本。

@邁克爾佩奇澄清指出,針對x64的發展,而不是PUSH荷蘭國際集團的值壓入堆棧(x86的約定),他應該將它們加載到前兩個預期寄存器: RDIRSI

我只是意識到在六個月后,我忘記發布工作代碼。 因此,asm函數將接收char **並將其格式化以發送給redis。

希望這段代碼對其他人有用。

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

然后_pusher將調用redisCommand(c,“%s%s ...”,args [0],...,args [count-1]):

[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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM