为了在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)错误。
答案 0 :(得分:2)
首先尝试编写一个C程序来实现char* prefix(char *str)
,反汇编并理解它。
问题1:应删除add esp, 4
。函数应保留堆栈指针。即esp
在第一条指令之前和返回指令之前应该是相同的。汇编代码将esp
增加4。
问题2:不要将您的.asm
和.c
命名为相同。使用不同的名称。