2015-10-05 47 views
-1

我试图做实践的NASM起见下面返回一个字符数组:从NASM函数

1)阅读来自命令行的字符串用C

2)传递字符串到NASM函数,它接受字符串作为它的第一个参数

3)返回确切字符串从NASM功能

prefix.asm:

;nasm -f elf32 prefix.asm -o prefix.o 

segment .bss 
pre resb 256 

segment .text 
global prefix 

    prefix: 
     push ebp   ;save the old base pointer value 
     mov ebp,esp  ;base pointer <- stack pointer 

     mov eax,[ebp+8] ;function argument 

     add esp, 4 
     pop ebp 
     ret 

前缀C:

//nasm -f elf32 prefix.asm -o prefix.o 
//gcc prefix.c prefix.o -o prefix -m32 
#include <stdio.h> 
#include <string.h> 

char* prefix(char *str); 

int main(void) 
{ 
    char str[256]; 
    char* pre; 
    int a; 

    printf("Enter string: "); 
    scanf("%s" , str) ; 
    pre = prefix(str); 
    printf("Prefix array: %s\n", pre); 
    return 0; 
} 

我运行后(它编译W/O任何问题),并提供我的字符串的程序,我得到一个分割故障(核心转储)错误。

+0

降低排队的原因是什么? – SpiderRico

回答

2

首先尝试写一个C程序来实现char* prefix(char *str),反汇编并理解它。

问题1:应删除add esp, 4。一个函数应该保留堆栈指针。即在第一条指令之前和返回指令之前,esp应该相同。您的汇编代码由012增加esp 4.

问题2:请勿将您的.asm.c命名为相同。使用不同的名字。

+0

这令人惊讶地做到了!非常感谢。 – SpiderRico