【问题标题】:Getting parameter in ASM from C call从 C 调用获取 ASM 中的参数
【发布时间】:2016-05-26 17:45:32
【问题描述】:

我从一个 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) 

【问题讨论】:

  • 读取您平台的 ABI 并按预期传递参数。
  • 奇怪的是那些从 main 发送的参数会直接发送到 _aff。我以为 mov rbp,rsp 做了我的新堆栈
  • 不要只是重复你在问题中已经阐明的内容。如果您不理解我的评论,请搜索“ABI”。
  • 我不理解您的评论,而不是因为 ABI。我正在使用 Fedora 23 x64,我读了这个来写代码en.wikipedia.org/wiki/X86_calling_conventions
  • 64-bit System V Linux calling convention 在寄存器(而不是堆栈)中传递前 6 个参数(可以用 8 个字节表示)。 RDIRSI 是前两个参数。

标签: c nasm


【解决方案1】:

OP 注意到他传递给汇编语言函数的参数没有得到处理。

@Olaf 指出,OP 没有为他的环境使用正确的 ABI(应用程序二进制接口——如何在平台上调用函数的定义)——他使用的是 Wikipedia 中描述的(非常)旧的。

@Michael Petch 澄清说对于 x64 开发,而不是 PUSH 将值放入堆栈(x86 约定),他应该将它们加载到前两个预期的寄存器中:RDIRSI

【讨论】:

    【解决方案2】:

    我只是意识到我忘了发布工作代码,6 个月后哎呀。 因此 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多