Проблема удаления пробелов в сборке NASM x86 - PullRequest
0 голосов
/ 19 июня 2019

Я работаю над кодом, который удалит пробелы из заданной строки.Но я столкнулся с ошибкой сегментации.

section .text
extern printf
global  remove_spaces

remove_spaces:
    push ebp
    mov ebp, esp

    mov eax, [esp+8]
    mov edx, eax
rs_loop:    
    mov cl, [edx]
    cmp cl, 0
    je  rs_exit

    inc edx

    cmp cl, ' '
    je  rs_loop

    mov [eax], cl
    inc eax 
    jmp rs_loop

rs_exit:
    push DWORD [esp + 8]
    push DWORD format2
    call printf

exit:
    mov esp, ebp
    pop ebp
    ret


section .data       
    format:         DB "** a=%s\ **",   00ah,       0
    format2:        DB "d* a=%d\ *d",   00ah 
    format3:        DB "type is:%d ",   00ah,       0   

У меня есть адрес моей строки в eax.Затем я копирую его в edx и начинаю проходить через него.Если символ не пробел, я пытаюсь добавить его в строку в EAX.Но когда я добавляю эту строку в код:

 mov [eax], bl

, у меня возникает ошибка сегментации.

Вот мой код c:

#include <stdio.h>
#include <stdlib.h>

extern  char* remove_spaces(char *a);

    int main(){
      char *a = "Remove spaces  . ";
      char *spaces_removed = remove_spaces(a);
      //printf("\n%s", spaces_removed);
      return 0;
    }

Я проверил, верна ли моя строка.Интересно, я пропускаю инструкцию mov [eax], bl, потому что пока все выглядит нормально.Что я должен делать?PS: вопрос и код редактируются в соответствии с предложением @Jester.

А вот мой скрипт make-файла и bash:

CC=g++
ASMBIN=nasm

all : asm cc link
asm : 
    $(ASMBIN) -o food.o -f elf -g -l remove_spaces.lst remove_spaces.asm
cc :
    $(CC) -m32 -c -g -O0 main.cpp &> errors.txt
link :
    $(CC) -m32 -g -o test main.o remove_spaces.o
clean :
    rm *.o
    rm test
    rm errors.txt   
    rm remove_spaces.lst

и

rm -f main
rm -f remove_spaces.o
nasm -f elf -o remove_spaces.o remove_spaces.asm
gcc -m32 -o main main.c remove_spaces.o
./main
...