Простые вопросы сборки

1
; 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?

Спасибо

Теги:
assembly

3 ответа

2
Лучший ответ

а. DWORD без знака, 32 бит: см. здесь (старое имя, MS начала использовать его, когда Windows была 16-разрядной).

б. вершина стека (dword ptr 0) занята обратным адресом

с. переменная y здесь не работает. Во всяком случае, это систематическое использование dword ptr характерно для некоторых сборщиков и дизассемблеров, а не для "стандартной процедуры".

  • 0
    Спасибо за ответ. Но я определил мою переменную как int. Как получилось, что это 32-битная переменная без знака? Или это просто означает, что это указатель (который, очевидно, является беззнаковым int?)
  • 0
    Это просто определения макросов, которые помогут сделать сборку понятной. Они смещены относительно указателя кадра.
Показать ещё 1 комментарий
1

а.

  • слово: 2 байта
  • dword: 4 байта
  • qword: 8 байт

Двор - это машинное слово. Эти имена были унаследованы от Win16, где 2 байта фактически сформировали машинное слово.

б. Это число представляет относительное смещение к обратному адресу в стеке. байты 0..3 - это обратный адрес. байты < 0 - локальные переменные, a >= 4 - параметры для функции. Посмотрите на учебник для ассемблера. Написание нескольких функций в чистой ASM - лучший способ понять эти детали.

с. ASM не стандартизирован. Таким образом, нет стандартной процедуры.

0

(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 для истерических изюмов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню