2013-04-09 6 views
1

У меня проблема с записью в выделенную память. Вот код.Запись в. В сборе

total: .long 1  # my memory 

movl total, %eax  # I believe I'm copying address of total into eax 
movl $53, %esi  # set some value in esi 
movl (%esi), %eax # and put this value into total 

Почему его не работает? Это дает: «Naruszenie ochrony pamięci» (ядро сбрасывается), это на польском языке и означает что-то вроде нарушения доступа к памяти.

+0

Скобки вокруг неправильные вещи. – harold

+0

Похоже, что курсы по сборке в университетах начались еще раз ... –

ответ

2

Во-первых, в AT & T синтаксис, чтобы сохранить адрес метки в регистр, а

movl total, %eax 

который демонтирует в синтаксисе Intel как:

8b042500000000 mov eax, [0x0] 

вам нужно использовать :

movl $total, %eax 

, который разбирает как-то примерно так:

b800000000  mov eax, 0x0 

В этом смысле при использовании AT & T синтаксис один должен быть очень осторожным, чтобы избежать ошибок.

Затем, если вы исправите вышеуказанную проблему, вам все равно нужно исправить скобки последней инструкции, как упоминалось Seva и harold. Это должно быть так:

movl %esi, (%eax) 

Код вызывает ошибку сегментации, поскольку он обращается к областям памяти, к которым у вас нет доступа. В защищенном режиме вы не можете получить доступ к любому адресу памяти, который вам нужен, вам нужно иметь права на чтение/запись/выполнение для этой области памяти.

+0

Итак, есть ли другой способ хранения некоторых данных в памяти? Я не могу изменить общий итог? – Kmaczek

+0

Для хранения некоторых данных в памяти можно выполнить следующие операции: 1. зарезервировать память в разделе 'data' вашего кода или 2. использовать стек для локальных переменных или 3. запросить блок памяти из вашей ОС (например, с помощью 'malloc'). – nrz

+0

, но моя 'total' находится в разделе' .data'. Его не весь код: P – Kmaczek

0

Заменить

movl %esi, (%eax) 
+0

Это не помогает, такая же ошибка – Kmaczek

 Смежные вопросы

  • Нет связанных вопросов^_^