Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2012, 18:10   #11
cesco10
 
Регистрация: 15.11.2012
Сообщений: 8
По умолчанию

[QUOTE=8Observer8;1138108]cesco10, обратите внимание на ответ sauvage. Это уже готовое решение:


Если вас комментарии смущают, то без них так:

Первое задание:
Код:
PUSH x
PUSH y
POP BX
POP BX
А можете мне разъяснить что происходит во время этих операций?
cesco10 вне форума Ответить с цитированием
Старый 26.11.2012, 19:19   #12
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Код:
PUSH x  // заносим в стек X
PUSH y  // заносим в стек Y
POP BX  // достаем из стека Y
POP BX  // достаем из стека X
counter вне форума Ответить с цитированием
Старый 27.11.2012, 22:36   #13
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Подробно, насколько смог.

- скачиваем Ollydbg по следующей ссылке (восьмая в списке) http://wasm.ru/toollist.php
- распаковываем скаченный архив
- запускаем Ollydbg.exe
- открываем загружаем любой exe-файл c помощью Ollydbg, для этого нажимаем F3 (или в меню: File -> Open) и открываем любой exe-файл
- так вот здесь минуточку если вы не выполнили предыдущие шаги, то читать дальше вам бессмысленно. И начните выполнять эту инструкцию, а не просто читать её
- дальше мы видим листинг:


Дальше показано: слева машинные команды, а справа мнемоника этих команд (PUSH, MOV и т.д.):



- напишем наши команды, для этого нажимаем в листинге пробел (или щелчёк правой кнопкой мыши в листинге (на месте где мы ходим ввести команду) -> Assembly, должно появится окно (в котором мы вводим команду):



- так должен выглядеть листинг после ввода команд:



- обратите внимание на следующий рисунок, это Hex Dump (это оперативная память, из которой процессор считывает команды (PUSH, MOV и т.д.) и выполняет их):



- найдём наши (введённые) команды в Hex Dump, для этого: щелчёк правой кнопкой мыши в области Hex Dump (прямо на байтах в таблице) -> Go to -> Expression (или Ctrl+G) и вводим адрес нашей первой команды PUSH 5:


Последний раз редактировалось 8Observer8; 27.11.2012 в 22:44.
8Observer8 вне форума Ответить с цитированием
Старый 27.11.2012, 22:38   #14
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

- нажимаем OK и видим, как наши команды расположены в оперативной памяти:



- теперь найдём эти команды (PUSH и POP) в официальной документации от Intel.

Этой документации 5 томов:

253665 - Basic Architecture
253666 - Instruction Set Reference A-M
253667 - Instruction Set Reference N-Z
253668 - System Programming Guide, Part 1
253669 - System Programming Guide, Part 2

Там нужен третий том сейчас, так как команды PUSH и POP начинаются на 'P'. Копируем в поисковик (например, google) следующую строку: 253667 - Instruction Set Reference N-Z

В поиске по открытому документу набираем: PUSH. Много нашёл, но мы будем искать с конца выданного списка (по разделу Numerics). Нажимаем на строке в документе: PUSH instruction, 4-285. Здесь можно прочитать всё о команде PUSH. Если проблемы с английским, то пользуйтесь http://translate.google.com/ Это я к тому, что нужно приучаться пользоваться первоисточниками, то есть официальной документацией.

И так, продолжим.

Стек - это область памяти, которая используется для хранения каких либо данных. Регистр ESP хранит адрес начала этой области памяти (стека). Видите, справа внизу отображается область стека (а ESP, как раз хранит этот адрес):



Когда выполняется команда PUSH, то сначала ESP меняет значение (на размер помещаемых в стек данных), а потом значение копируется в ячейку на которую указывает ESP. Причём PUSH бывает разный. Данные могут копироваться из регистра (например EAX) или из ячейки памяти и т.д. И размер данных может быть разным (и ESP будет менять своё значение на разное число, в зависимости от размера копируемых в стек данных (байт, слово, двойное слово и т.д.)).

Нажимаем F7 (или F8) (это выполнение пошагам) и смотрим, что произойдёт. Послы выполнения команды PUSH должен измениться ESP и константа содержимое регистра AX (2 байта) должно скопироваться в стек, смотрим, что так и есть:



Теперь опять нажимаем на F7 (или F8). Выполняется ещё один PUSH. Теперь снова меняется ESP и уже содержимое регистра CX (2 байта) копируется в стек:



В документации (которую мы рассмотрели выше) подробно написано, как работает PUSH:

8Observer8 вне форума Ответить с цитированием
Старый 27.11.2012, 22:39   #15
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Команда POP копирует данные из стека в регистр (или в оперативную память) и далее меняет указатель стека на величину данных (байт, слово (2 байта) и т.д.)). Значит при выполнении команды POP число 5 должно скопироваться в регистр BX (это младшее слово (2 байта) регистра EBX (4 байта)), а стек освобождается от этого числа (просто меняется указатель стака, 5 на своём месте может и остаться на какое-то время, но уже не в зоне "охраны" стека и ничто не гарантирует, что её (эту пятёрку) может другой PUSH затереть):



Следующий POP копирует тройку в регистр BX (уничтожая пятёрку) и меняет указатель стека (стек освобождается от тройки):




Подробно об языке ассембера и об отладчике Ollydbg написано по следующим ссылкам:

http://wasm.ru/article.php?article=ollydbg01
http://wasm.ru/article.php?article=ollydbg02
http://wasm.ru/article.php?article=ollydbg03
http://wasm.ru/article.php?article=ollydbg04
http://wasm.ru/article.php?article=ollydbg05

Последний раз редактировалось 8Observer8; 27.11.2012 в 22:50.
8Observer8 вне форума Ответить с цитированием
Старый 28.11.2012, 07:38   #16
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

8Observer8, ну Вы энтузиаст! Нагорную проповедь прочтите, если ещё не читали, на досуге. В частности, обратите внимание на фразу: "...не мечите бисер перед свиньями..."
vadimych вне форума Ответить с цитированием
Старый 28.11.2012, 09:35   #17
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Всё таки, если человек задал вопрос:

Цитата:
Сообщение от cesco10 Посмотреть сообщение
А можете мне разъяснить что происходит во время этих операций?
Значит хочет разобраться. И сейчас он понимает, что если он не повторит этой инструкции (которую я написал), то более сложные вещи, которые встретятся в будущем, станут ещё сложнее.

Нужно ещё понимать следующую мысль: человеку нужно видеть границы абстракции. Во время этих операций происходит очень многое. Всё что нам нужно знать на уровне абстракции языка ассемблера описано в официальной документации. Глубже - это уже другая абстракция.

Теперь у него есть оружие: отладчик Ollydbg и доступ к официальной документации. Что позволяет самому видеть, что должно происходить (из документации) и что происходит на самом деле (в отладчике). Здесь нужно понять одну простую вещь, что нужно увидеть в живую в отладчике, чем 100 раз на бумаге. Увидеть и выполнить пошагам. Незнание английского компенсируем переводчиком (http://translate.google.com/ и учим английский). Он же не будет теперь спрашивать про каждую команду: что присходит во время её выполнения. Теперь, он сможет сам искать описание каждой команды в официальной документации. Переводить переводчиком или с помощью словаря. Вводить команду в отладчик и смотреть, что происходит.

Ещё мой знакомый говорит, что лучше сделать, чем не далать. Не жалею о потраченном времени
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу разобраться! Apsalon Microsoft Office Excel 1 28.12.2010 18:54
Нужно разобраться со стеком GladiatoR24 Общие вопросы C/C++ 1 08.05.2010 11:34
НЕ МОГУ РАЗОБРАТЬСЯ... GSV84 HTML и CSS 0 03.02.2010 01:38