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

avatar
corlo407
12 марта 2020 в 13:22
249
1
1

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

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

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

Источник
Michael
12 марта 2020 в 13:49
0

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

corlo407
12 марта 2020 в 13:53
0

Я изменил код в сообщении, чтобы он содержал это.

ecm
12 марта 2020 в 14:00
2

В строке section.text отсутствует пробел между словом «section» и названием раздела. То же самое для .data.

Ответы (1)

avatar
Peter Cordes
12 марта 2020 в 19:20
3

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

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

Противоположная ошибка (действительный section .data, но с ошибками section.text) приводит к помещению вашего кода в .data, который связывается с неисполняемыми страницами памяти. В этом случае вы бы отказались от выборки кода из первой инструкции!


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

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

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