; int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)
_wWinMain@16 proc near
var_4= dword ptr -4
hInstance= dword ptr 4
hPrevInstance= dword ptr 8
lpCmdLine= dword ptr 0Ch
nShowCmd= dword ptr 10h
Из того, что я вижу, последние 4 переменных являются параметрами, переданными функции WinMain. Кроме того, var_4 должен быть переменной int, объявленной позже в теле функции. Теперь у меня есть пара вопросов:
a) Каков размер слова в 32-битной программе Windows? 4 байта? будучи словом 8?
b) Почему var_4 установлен на -4? Почему бы не начать, допустим, 0?
c) Стандартная процедура определения ints в c, хотя
var_x = dword ptr y?
Спасибо
а. DWORD без знака, 32 бит: см. здесь (старое имя, MS начала использовать его, когда Windows была 16-разрядной).
б. вершина стека (dword ptr 0) занята обратным адресом
с. переменная y
здесь не работает. Во всяком случае, это систематическое использование dword ptr
характерно для некоторых сборщиков и дизассемблеров, а не для "стандартной процедуры".
а.
Двор - это машинное слово. Эти имена были унаследованы от Win16, где 2 байта фактически сформировали машинное слово.
б. Это число представляет относительное смещение к обратному адресу в стеке. байты 0..3 - это обратный адрес. байты < 0 - локальные переменные, a >= 4 - параметры для функции. Посмотрите на учебник для ассемблера. Написание нескольких функций в чистой ASM - лучший способ понять эти детали.
с. ASM не стандартизирован. Таким образом, нет стандартной процедуры.
(a) A dword
- действительно простое слово, а это 32-бит.
(b) Индексирование в стеке не обязательно выполняется с помощью указателя стека, но с помощью указателя кадра. (Указатель "Base" в IA-land.) Фрейм, err, base, pointer будут настроены так, чтобы сделать трассировки стека возможными. Локали и аргументы, вероятно, имеют более низкие адреса в памяти, "выше" в стеке.
(c) Вряд ли практически любой другой ассемблер, формат Intel реализует эту абстракцию, где типы данных имеют ширину, но не типизированные инструкции, поэтому ассемблер выбирает 8-, 16 - или 32-битный код операции 1 на основе вашего объявления операнда. Я написал много сборки ia32, но только в различных других ассемблерах 2 поэтому я не могу прокомментировать, как этот метод off-beat работает на практике. Кажется, это неудобно издалека...
1. Технически 16-битные и 32-битные коды операций одинаковы, но необязательные префиксные байтовые переключатели между 16- и 32-битным режимами.
2. Другой формат ассемблера IA32 называется AT & T Format для истерических изюмов.