从NASM函数返回char数组

时间:2015-10-05 00:01:18

标签: c linux 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;
}

运行后(它没有编译任何问题)并将我的字符串提供给程序,我得到一个Segmentation fault(core dumped)错误。

1 个答案:

答案 0 :(得分:2)

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

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

问题2:不要将您的.asm.c命名为相同。使用不同的名称。