Проблема ошибки сегментации NASM - PullRequest
1 голос
/ 27 марта 2011

Привет, я пишу на NASM под Linux, и у меня есть следующая проблема: мне нужно написать простую программу, в которой пользователь должен ввести строку, передать ее функции, которая возвращает ее размер:

Код:

%include "macros.inc"
        section .data
prompt1     db "Enter string: ",0
prompt1len  equ $-prompt1
prompt2     db "The size of string is: ",0
prompt2len  equ $-prompt2

        section .bss
string      resb 20
        section .text
            global _start
_start:     str_output prompt1len,prompt1
            str_input string 
            mov ebx,string
            call func
            str_output prompt2len,prompt2
            output eax
            exit 0

func:
            xor eax,eax
et        **cmp byte [ebx],0h**
            je end
            inc eax
            inc ebx
            jmp et
end         dec eax
            ret

А вот файл макроса:

%macro exit 1
        mov eax,1
        mov ebx,%1
        int 80h
%endmacro

%macro int_input 1
        mov eax,3
        mov ebx,0
        mov ecx,%1
        mov edx,1
        int 80h
        and eax,0Fh
        mov %1,eax
%endmacro

%macro str_input 1
        mov eax,3
        mov ebx,1
        mov ecx,%1
        mov edx,20
        int 80h
%    endmacro

%macro output 1
        mov eax,%1
        or eax,30h
        mov %1,eax
        mov eax,4
        mov ebx,1
        mov ecx,%1
        mov edx,1
        int 80h
%endmacro

%macro str_output 2+
        mov eax,4
        mov ebx,1
        mov ecx,%2
        mov edx,%1
        int 80h
%endmacro

Я отладил программу, и проблема в байте cmp инструкции [ebx], 0h, потому что когдаЯ запускаю программу, которая выводит ошибку сегментации после str_input.Я не вижу ничего плохого, но, возможно, я ошибся с адресацией.

Ответы [ 2 ]

0 голосов
/ 29 июня 2012

Это становится довольно устаревшим ... но ваша проблема в том, что "str_input" не вводит строку с нулем в конце!

0 голосов
/ 27 марта 2011

Попробуйте это перед звонком func:

mov ebx, offset string

похоже, вы используете синтаксис Intel. В AT & T синтаксис mov $string,%ebx будет правильным, потому что константы всегда немедленны, но в Intel

этого не происходит
...