在 pushing/popping 其他寄存器时从相对于 EBP 的堆栈访问函数参数?
Accessing function args from the stack relative to EBP while pushing/popping other registers?
我正在写一个汇编程序和一个C程序; C 程序将调用一个用汇编编写的函数。环境是 Ubuntu 18.04LTS x64.
它是为32位x86设计的,将被NASM编译,但它不能传递正确的参数。
为了简化问题,我只是更改了我的函数以获得 a 和 b 的总和。
extern int FindPattern(int a,int b);
int result;
result=FindPattern(1,1);
printf("%d\n",result);
global FindPattern
section .text
FindPattern:
push ebp
push esi
push edi
push ebx
push edx
push ecx
mov ebp,esp
mov esi,[ebp+8] ; a
mov edi,[ebp+12] ; b
mov eax,0
add eax,esi
add eax,edi ; return a+b
pop ecx
pop edx
pop ebx
pop edi
pop esi
pop ebp
ret
函数只是将a和b相加,returns相加。总和应该是2,但是我得到了一个随机数,比如1449041840。看来程序集没有得到正确的参数。
代码有什么问题,我该如何解决?
# Makefile
cc=gcc
ASMBIN=nasm
all : asm cc link
asm:
$(ASMBIN) -o findpattern.o -f elf32 -l findpattern.lst findpattern.asm
cc :
$(cc) -m32 -c -g -O0 -fpack-struct graph_io.c
link :
$(cc) -m32 -o graph_io findpattern.o graph_io.o
clean:
rm *.o
rm graph_io
rm findpattern.lst
你的栈帧设置有误。 push ebp; mov ebp, esp
必须在任何其他堆栈移动发生之前发出。
通过在设置 ebp
之前将其他内容压入堆栈,您已将 ebp
设置为指向与平常不同的位置,从而导致所有偏移量不同。要解决这个问题,首先设置堆栈帧,然后压入剩余的寄存器:
global FindPattern
section .text
FindPattern:
push ebp
mov ebp,esp
push esi
push edi
push ebx
push edx
push ecx
mov esi,[ebp+8] ; a
mov edi,[ebp+12] ; b
mov eax,0
add eax,esi
add eax,edi ; return a+b
pop ecx
pop edx
pop ebx
pop edi
pop esi
pop ebp
ret
我正在写一个汇编程序和一个C程序; C 程序将调用一个用汇编编写的函数。环境是 Ubuntu 18.04LTS x64.
它是为32位x86设计的,将被NASM编译,但它不能传递正确的参数。
为了简化问题,我只是更改了我的函数以获得 a 和 b 的总和。
extern int FindPattern(int a,int b);
int result;
result=FindPattern(1,1);
printf("%d\n",result);
global FindPattern
section .text
FindPattern:
push ebp
push esi
push edi
push ebx
push edx
push ecx
mov ebp,esp
mov esi,[ebp+8] ; a
mov edi,[ebp+12] ; b
mov eax,0
add eax,esi
add eax,edi ; return a+b
pop ecx
pop edx
pop ebx
pop edi
pop esi
pop ebp
ret
函数只是将a和b相加,returns相加。总和应该是2,但是我得到了一个随机数,比如1449041840。看来程序集没有得到正确的参数。
代码有什么问题,我该如何解决?
# Makefile
cc=gcc
ASMBIN=nasm
all : asm cc link
asm:
$(ASMBIN) -o findpattern.o -f elf32 -l findpattern.lst findpattern.asm
cc :
$(cc) -m32 -c -g -O0 -fpack-struct graph_io.c
link :
$(cc) -m32 -o graph_io findpattern.o graph_io.o
clean:
rm *.o
rm graph_io
rm findpattern.lst
你的栈帧设置有误。 push ebp; mov ebp, esp
必须在任何其他堆栈移动发生之前发出。
通过在设置 ebp
之前将其他内容压入堆栈,您已将 ebp
设置为指向与平常不同的位置,从而导致所有偏移量不同。要解决这个问题,首先设置堆栈帧,然后压入剩余的寄存器:
global FindPattern
section .text
FindPattern:
push ebp
mov ebp,esp
push esi
push edi
push ebx
push edx
push ecx
mov esi,[ebp+8] ; a
mov edi,[ebp+12] ; b
mov eax,0
add eax,esi
add eax,edi ; return a+b
pop ecx
pop edx
pop ebx
pop edi
pop esi
pop ebp
ret