[英]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的约定),他应该将它们加载到前两个预期寄存器: RDI
和RSI
我只是意识到在六个月后,我忘记发布工作代码。 因此,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.