Передача значений в ячейку памяти Нарушение прав доступа в сборке

Я начну с этого блока кода:

mov   eax, 5
mov   DWORD PTR [eax], 123

Я пытаюсь переместить значение 123 в ячейку памяти по адресу 5, но я получаю нарушение доступа к записи. Единственное, что я могу догадаться, это то, что расположение памяти уже зарезервировано или используется. Но независимо от того, какой адрес я использую, это одно и то же. Если бы я был зачитан из того же места, скажите:

mov   eax, 5
mov   ebx, DWORD PTR [eax]

У меня нет ошибок. Что мне не хватает?

(Если это помогает, я кодирую в MASM, Win 7, 4 gb ram)

1
nl ja de

1 ответы

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

1
добавлено
@Eddie: вам нужно убедиться, что ОС знает о вашей памяти, которую вы пытаетесь использовать, - ваш процесс имеет виртуальное адресное пространство, которое ОС переводит на реальные адреса в памяти. Чтобы получить действительный адрес, вы можете либо использовать стек (указав на esp ), объявить переменные или кучу (с помощью malloc / VirtualAlloc )).
добавлено автор Mathew Hall, источник
Хотя я думаю, что странно, что не получают нарушение доступа чтение с того же адреса, вы должны.
добавлено автор Jens Björnhager, источник
Почему вы все равно читаете или записываете случайные адреса?
добавлено автор Jens Björnhager, источник
Затем я предлагаю вам начать использовать выделенные адреса памяти. Как статичная, так и динамическая память, как говорит Матфей.
добавлено автор Jens Björnhager, источник
«загрузка адреса, на который указывает esp, похожа на вызов push». Пожалуйста, обратитесь к учебнику, так как вы явно смущены об основах. Но вы можете нажать любой регистр/значение в стек, чтобы получить ячейку памяти для экспериментов. Но не забывайте pop , когда это будет сделано.
добавлено автор Jens Björnhager, источник
Также может быть, что вы понимаете понятия, но путаете терминологию. Во всяком случае, Art of assembly - хорошее место для начала.
добавлено автор Jens Björnhager, источник
Благодаря Jens, очень полезно знать, что первая мега принадлежит Windows, о которой я не знал. Но какой бы адрес я ни использовал, я получаю такое же нарушение доступа, но чтение не является проблемой. : /
добавлено автор Eddie, источник
@Jens. Просто пытаюсь узнать, как использовать указатели в сборке.
добавлено автор Eddie, источник
@Мэтью. Спасибо за ответ. Вы совершенно рок. Использование esp дало мне действительный адрес. Я предполагаю, что мне нужно будет всплывать, когда закончится, так как загрузка адреса, на который указывает esp, похожа на вызов push. Я знал, что могу объявить переменную и эффективно выполнить эту работу, я просто хотел научиться как упражнение, косвенность в сборке. Еще миллион спасибо за решение моей проблемы. И благодаря тебе тоже Дженс.
добавлено автор Eddie, источник
@Jens, я просто вытащил стек, и в нем было значение, которое я вставил в esp. Разумеется, я явно смущен об основах, и именно поэтому я здесь, но теперь только больше смущен вашим ответом и результатом, который я получил от выскакивания стека. Если у вас есть хороший учебник, который учитывает то, о чем я говорю, было бы неплохо, если бы вы указали мне на это. ;)
добавлено автор Eddie, источник
@Jens, потрясающе. Спасибо, что высунули это со мной. Приветствия. :)
добавлено автор Eddie, источник