为了练习 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/