![]() |
|
|
![]()
|
|
| Codegrammer |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 1.4.2008 Репутация: нет Всего: нет |
Как создать локальный массив в функции? Переменную обычно делают LOCAL a:DWORD. А можно делать так с массивом? Знаю, что можно ручками делать с регистром ebp, но уже достало. Есть что-нить поцивилизованнее?
|
|||
|
||||
| iff |
|
|||
![]() Администратор ![]() ![]() Профиль Группа: Участник Сообщений: 949 Регистрация: 23.3.2007 Репутация: 5 Всего: 16 |
Локальный, значит в стеке?
Может так? Это сообщение отредактировал(а) iff - 23.3.2010, 20:37 -------------------- DOS... Синей пеленой экран заполнил чистый DOS Мышь... Стала вдруг квадратной, потеряла форму мышь... Я разбил окно, девяностопятое мастдайное окно, И поставил DOS, и тогда увидел: Это счастье, — вот оно. |
|||
|
||||
| Mikl_ |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
Codegrammer,
можно так LOCAL massiv[128]:BYTE но все равно это выльется в
Это сообщение отредактировал(а) Mikl_ - 27.4.2010, 03:59 |
|||
|
||||
| bugmenot1 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 8.5.2008 Репутация: нет Всего: 0 |
Подскажите пожалуста почему так получается, когда на С пишу wchar_t MASS[260] в ассемблере (смотрю через cl - /Fa) это вылевается в
Так как это wchar_t должно быть 520 (260х2), но почему там 528? Это сообщение отредактировал(а) bugmenot1 - 24.4.2010, 22:42 |
|||
|
||||
| iff |
|
|||
![]() Администратор ![]() ![]() Профиль Группа: Участник Сообщений: 949 Регистрация: 23.3.2007 Репутация: 5 Всего: 16 |
Я конечно не знаю, но...
1)Может быть в эти 8 байт компилятор записывает какоу-нибудь свою информацию? 2)Посмотрите, 520/16=32.5; а 528/16=33. Может быть это выравнивание элементов по параграфам? Такое выравнивание в роде бы увеличивает скорость исполнения программы процессором. Добавлено через 1 минуту и 16 секунд И ещё, в 3-ей строчке нет опечатки? Там должно быть sub ebp, 528 ; 00000210H -------------------- DOS... Синей пеленой экран заполнил чистый DOS Мышь... Стала вдруг квадратной, потеряла форму мышь... Я разбил окно, девяностопятое мастдайное окно, И поставил DOS, и тогда увидел: Это счастье, — вот оно. |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
iff, там должно быть sub esp, xxx
ebp указывает на фрейм и не должен меняться bugmenot1, дизассемблируйте функцию полностью и вы увидите как компилятор использует эти 8 байт. скорей всего это защита от переполнения буфера. Это сообщение отредактировал(а) GoldFinch - 25.4.2010, 20:38 |
|||
|
||||
| bugmenot1 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 8.5.2008 Репутация: нет Всего: 0 |
iff, 2) похоже на то.
GoldFinch в том то и дело, откинул все операции с локальной строкой, дабы вывести только объявление.
Значит при собственном объявлении локального массива стоит производить такое выравнивние? |
||||
|
|||||
| iff |
|
|||
![]() Администратор ![]() ![]() Профиль Группа: Участник Сообщений: 949 Регистрация: 23.3.2007 Репутация: 5 Всего: 16 |
Где вообще можно прочитать про то что такое локальный массив?
Добавлено через 11 минут и 41 секунду И ещё, правильно я понял принцип действия?
-------------------- DOS... Синей пеленой экран заполнил чистый DOS Мышь... Стала вдруг квадратной, потеряла форму мышь... Я разбил окно, девяностопятое мастдайное окно, И поставил DOS, и тогда увидел: Это счастье, — вот оно. |
|||
|
||||
| bugmenot1 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 8.5.2008 Репутация: нет Всего: 0 |
iff у Пильщикова (Программирование на языке ассемблера IBM PC) есть (9.5 Локальные данные процедур, стр. 164). Но там не говорится про выделение про запас/выравнивание.
Видимо это чисто оптимизация компилятора Майкрософт. mov al, 1 связано с return true. mov esp, ebp ; Пильщиков комментирует (правда 16 битный вариант mov sp, bp) это как освободить стек от локального массива/отказ от места для локальных данных. |
|||
|
||||
| iff |
|
||||||
![]() Администратор ![]() ![]() Профиль Группа: Участник Сообщений: 949 Регистрация: 23.3.2007 Репутация: 5 Всего: 16 |
Это я понял.
Это то же самое что
Можешь написать на С процедуру (а потом дизасемблировать ее), которая не только создаёт массив, но и записывает в его какой либо элемент: хочу посмотреть как это делается. -------------------- DOS... Синей пеленой экран заполнил чистый DOS Мышь... Стала вдруг квадратной, потеряла форму мышь... Я разбил окно, девяностопятое мастдайное окно, И поставил DOS, и тогда увидел: Это счастье, — вот оно. |
||||||
|
|||||||
| bugmenot1 |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 8.5.2008 Репутация: нет Всего: 0 |
iff не оспаривал, а процитировал Пильщикова.
Соединив две фразы можно сказать что посредством восстановления esp освобождается место. Кстати когда прочитал пост, то под рукой не было VC9, только 7.1 (C++ Toolkit 2003). Дизассемблировал функцию после него, так там чётко 520. Сейчас даю для VC9.
Кстати Пильщиков предлагает инициализировать по другому
Через 1 так как это Юникод. А вот нули и завершающий нуль видимо не обязательно, как сейчас сделал по аналогии с С. Это сообщение отредактировал(а) bugmenot1 - 27.4.2010, 18:42 |
||||||
|
|||||||
![]()
|
| Правила форума "Asm: Общие вопросы" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |