2009-09-08 6 views
1
; int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) 
[email protected] 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?

с) стандартной процедурой для определения Интсов в С, хотя

var_x = DWORD PTR у?

С благодарностью

ответ

2

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

b. верхняя часть стека (dword ptr 0) занята обратным адресом

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

+0

Спасибо за ответ. Но я определил свою переменную как int. Как получилось, что это 32-битная переменная без знака? Или это просто означает, что это указатель (который, очевидно, является неподписанным int?) –

+0

Это просто макросы, которые помогают сделать сборку ясной. Это смещения w.r.t. к указателю рамки. – user7116

+3

@devoured elysium Нет разницы между подписанными и неподписанными данными в ASM. Они всего лишь 32 бит. Разница заключается в том, какие инструкции вы используете для их работы. –

0

(a) A dword - простое слово, и это 32-бит.

(b) Индексирование в стеке необязательно выполняется с помощью указателя стека, но с помощью указателя кадра. (Указатель «Base» в IA-land.) Фрейм, err, base, pointer будут настроены так, чтобы сделать трассировки стека возможными. Локали и аргументы, вероятно, имеют более низкие адреса в памяти, «выше» в стеке.

(с) Вряд ли практически любой другой ассемблер, формат Intel реализует эту абстракцию, где типы данных имеют ширину, но не набран-в-инструкции, и поэтому ассемблер выбирает, как 8-, 16-, или 32-битный код операции на основе вашего объявления операнда. Я написал много сборки ia32, но только в разных ассемблерах , поэтому я не могу прокомментировать, как этот заходный подход работает на практике. Кажется, вид неуклюжим от расстояния ...


1. Технически 16-разрядные и 32-разрядные коды операций являются одинаковыми, но дополнительный байт префикса переключается между 16- и 32-битном режиме ,
2. Другой формат ассемблера IA32 называется AT & T Формат для истерического изюма.

1

a.

  • слово: 2 байта
  • DWORD: 4 байта
  • QWORD: 8 байт

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

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

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

Смежные вопросы