Итак, этим утром я опубликовал путаный вопрос об собрании, и я получил отличную подлинную помощь, которую я очень ценю.
И теперь я начинаю собираться в сборку и начинаю понимать, как это работает.
Вещи, которые, как я чувствую, я понимаю, включают в себя стек, прерывания, двоичный/шестнадцатеричный и вообще то, что делают большинство основных операций (jmp, push, mov и т.д.).
Понятия, которые я пытаюсь понять и которым вы хотите помочь, приведены ниже - это было бы огромной помощью, если бы вы могли обратиться к любому из следующих вопросов:
- Что именно происходит в разделе .data? Объявляются ли эти переменные?
- Если да, можем ли мы объявить переменные позже в разделе кода? Если нет, почему бы и нет? Если да, как и почему мы используем раздел данных, то?
- Какой регистр? Как он сравнивается с переменной? Я имею в виду, что я знаю это место, где хранится небольшая часть информации... но это звучит точно как переменная для меня.
- Как создать массив? Я знаю, что это кажется случайным, но мне любопытно, как я буду делать что-то вроде этого.
- Есть ли список каких-то общих практик для того, для чего нужно использовать каждый регистр? Я до сих пор не получаю их полностью, но заметил, что некоторые люди говорят, например, что определенный регистр должен использоваться для хранения "возвращаемых значений" из процедур - существует ли исчерпывающий или, по крайней мере, информативный список таких методов?
- Одна из причин, по которой я изучаю сборку, - это лучше понять, что происходит за моим кодом высокого уровня. Имея это в виду - когда я программирую на С++, я часто думаю о стеке и куче. В сборке я знаю, что такое стек - где "куча"?
Некоторая информация: я использую masm32 с WinAsm в качестве среды IDE, и я работаю над Windows 7. У меня есть много предыдущих программ программирования на языках более высокого уровня, таких как С++/java.
edit: Спасибо за помощь всем, чрезвычайно информативным, как обычно! Качественный товар! Еще одна вещь - мне интересно, какая разница между указателем стека и указателем Base, или ESP и EBP. Может кто-нибудь помочь мне?
edit: Я думаю, что получаю это сейчас... ESP всегда указывает на вершину стека. Однако вы можете указать EBP на все, что захотите. ESP автоматически обрабатывается, но вы можете делать все, что хотите, с помощью EBP. Например:
push 6
push 5
push 4
mov EBP, ESP
push 3
push 2
В этом случае EBP теперь указывает на адрес, содержащий 4, но ESP теперь указывает на адрес, содержащий 2.
В реальном приложении 6, 5 и 4 могут быть функциональными аргументами, тогда как 3 и 2 могут быть локальными переменными внутри этой функции.