Ошибка сегментации NASM при изменении переменной, которая должна быть в разделе чтения-записи .data (раздел .data не работает без пробела?) - PullRequest
1 голос
/ 12 марта 2020

У меня проблема с программой, которую я пишу в NASM с использованием SASM, я использую переменную в качестве счетчика, и как только я изменил ее и пытаюсь сохранить новое значение по используемому адресу в памяти, я получить ошибку сегментации. Вот биты кода, относящиеся к переменной:

section.data
p_count DW 0

section.text
global CMAIN
CMAIN:
    mov ebp, esp; for correct debugging
    mov bx, [p_count]
    inc bx
    mov [p_count], bx

    ret

Программа останавливается, когда достигает последней строки. У кого-нибудь есть идея, в чем может быть проблема?

1 Ответ

3 голосов
/ 12 марта 2020

Вы забыли пробел в section.data.text), поэтому по умолчанию все перешло в раздел .text только для чтения.

section.data анализируется как метка, например foo.bar: будет , а не директива section. Двоеточие в конце метки является необязательным, если имя метки также не является допустимой инструкцией поместить ваш код в .data, который связан с неисполняемыми страницами памяти. В этом случае вы бы столкнулись с ошибкой при получении кода из первой инструкции!


Вы должны были получить предупреждение от NASM, например:

warning: label alone on a line without a colon might be in error [-w+orphan-labels]

Если ваш NASM не сделал ' t предупреждение, используйте более новую версию, где она включена по умолчанию,
или запустите NASM с -Worphan-labels, чтобы включить это полезное предупреждение.

...