c - 从 NASM 函数返回字符数组

标签 c linux nasm

为了练习 NASM,我正在尝试执行以下操作:

1)从C语言命令行读取字符串

2)将该字符串传递给 NASM 函数,该函数将该字符串作为其第一个参数

3)从 NASM 函数返回确切的字符串

前缀.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;
}

在我运行(它编译时没有任何问题)并将我的字符串提供给程序后,我收到段错误(核心转储)错误。

最佳答案

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

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

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

关于c - 从 NASM 函数返回字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32939635/

相关文章:

c - 更改后自动重新编译C程序?

linux - Amazon EC2 Linux Distro init.d 脚本优先启动守护程序

c - 在 32 位 WinXP 下使用 64 位数字

将对等方的 IPv6 地址与本地主机进行比较

c - technions DHT22.c程序如何计算温度?

Linux命令不是很清楚

assembly - Insight 调试器在寄存器中显示错误值

assembly - 调用函数后内核出现三重错误

c - C 和 Objective-C 入门

linux - mkbundle System.ComponentModel.Win32Exception 错误