Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание локального массива, Как создать массив в функции 
:(
    Опции темы
Codegrammer
Дата 23.3.2010, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 1.4.2008

Репутация: нет
Всего: нет



Как создать локальный массив в функции? Переменную обычно делают LOCAL a:DWORD. А можно делать так с массивом? Знаю, что можно ручками делать с регистром ebp, но уже достало. Есть что-нить поцивилизованнее?
PM MAIL   Вверх
iff
Дата 23.3.2010, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 5
Всего: 16



Локальный, значит в стеке?
Код

mass db 'element', 0
len db ($-mass)\2

   ...


;xor di, di
mov cx, len
a10: push word ptr mass[di]
inc di
inc di
loop a10

Может так?

Это сообщение отредактировал(а) iff - 23.3.2010, 20:37


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
Mikl_
Дата 25.3.2010, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



Codegrammer, 
можно так     LOCAL massiv[128]:BYTE но все равно это выльется в 
Код
push ebp
mov ebp,esp
sub esp,128


Это сообщение отредактировал(а) Mikl_ - 27.4.2010, 03:59
PM MAIL   Вверх
bugmenot1
Дата 24.4.2010, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 8.5.2008

Репутация: нет
Всего: 0



Подскажите пожалуста почему так получается, когда на С пишу wchar_t MASS[260] в ассемблере (смотрю через cl - /Fa) это вылевается в 
Код
push    ebp
mov    ebp, esp
sub    esp, 528    ; 00000210H
?
Так как это wchar_t должно быть 520 (260х2), но почему там 528?

Это сообщение отредактировал(а) bugmenot1 - 24.4.2010, 22:42
PM MAIL   Вверх
iff
Дата 25.4.2010, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 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, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
GoldFinch
Дата 25.4.2010, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



iff, там должно быть sub esp, xxx
ebp указывает на фрейм и не должен меняться

bugmenot1, дизассемблируйте функцию полностью и вы увидите как компилятор использует эти 8 байт.
скорей всего это защита от переполнения буфера.

Это сообщение отредактировал(а) GoldFinch - 25.4.2010, 20:38
PM MAIL ICQ   Вверх
bugmenot1
Дата 26.4.2010, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 8.5.2008

Репутация: нет
Всего: 0



iff, 2) похоже на то.
GoldFinch в том то и дело, откинул все операции с локальной строкой, дабы вывести только объявление.
Код

bool Func()
{
    wchar_t MASS[260];
    return true;
}

Код

    push    ebp
    mov    ebp, esp
    sub    esp, 528                ; 00000210H

    mov    al, 1

    mov    esp, ebp
    pop    ebp
    ret    0

Значит при собственном объявлении локального массива стоит производить такое выравнивние?
PM MAIL   Вверх
iff
Дата 26.4.2010, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 5
Всего: 16



Где вообще можно прочитать про то что такое локальный массив?   smile

Добавлено через 11 минут и 41 секунду
И ещё, правильно я понял принцип действия?
Код

    push    ebp ;Сохранить ebp в стеке
    mov    ebp, esp ;а esp сохранить в ebp 
    sub    esp, 528                ; 00000210H

    mov    al, 1 ;Дальше работаем с маччивом как со стеком: инструкциями push и pop

    mov    esp, ebp ;Восстановить esp
    pop    ebp ;Восстановить ebp
    ret    0



--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
bugmenot1
Дата 26.4.2010, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 8.5.2008

Репутация: нет
Всего: 0



iff у Пильщикова (Программирование на языке ассемблера IBM PC) есть (9.5 Локальные данные процедур, стр. 164). Но там не говорится про выделение про запас/выравнивание.
Видимо это чисто оптимизация компилятора Майкрософт.

mov    al, 1 связано с return true.

mov    esp, ebp ; Пильщиков комментирует (правда 16 битный вариант mov sp, bp) это как освободить стек от локального массива/отказ от места для локальных данных.
PM MAIL   Вверх
iff
Дата 27.4.2010, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 5
Всего: 16



Цитата

mov    al, 1 связано с return true.

Это я понял.

Цитата

освободить стек от локального массива

Это то же самое что 
Цитата

Восстановить esp


Можешь написать на С процедуру (а потом дизасемблировать ее), которая не только создаёт массив, но и записывает в его какой либо элемент: хочу посмотреть как это делается.


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
bugmenot1
Дата 27.4.2010, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 8.5.2008

Репутация: нет
Всего: 0



iff не оспаривал, а процитировал Пильщикова.
Соединив две фразы можно сказать что посредством восстановления esp освобождается место.

Кстати когда прочитал пост, то под рукой не было VC9, только 7.1 (C++ Toolkit 2003). Дизассемблировал функцию после него, так там чётко 520.
Сейчас даю для VC9.
Код

#include <stdio.h>

void Func()
{
    wchar_t mass[260];
    mass[0] = 'a';
    mass[1] = 'b';
    mass[2] = '\0';
}

Код

; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01 

    TITLE    LocalMasiv
    .686P
    .XMM
    .model    flat

INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES

PUBLIC    __$ArrayPad$
PUBLIC    _Func
EXTRN    ___security_cookie:DWORD
EXTRN    @__security_check_cookie@4:PROC
; Function compile flags: /Odtp
_TEXT    SEGMENT
_mass$ = -528                        ; size = 520
__$ArrayPad$ = -4                    ; size = 4
_Func    PROC

; Line 4
    push    ebp
    mov    ebp, esp
    sub    esp, 528                ; 00000210H
    mov    eax, DWORD PTR ___security_cookie
    xor    eax, ebp
    mov    DWORD PTR __$ArrayPad$[ebp], eax
; Line 6
    mov    eax, 97                    ; 00000061H
    mov    WORD PTR _mass$[ebp], ax
; Line 7
    mov    ecx, 98                    ; 00000062H
    mov    WORD PTR _mass$[ebp+2], cx
; Line 8
    xor    edx, edx
    mov    WORD PTR _mass$[ebp+4], dx
; Line 9
    mov    ecx, DWORD PTR __$ArrayPad$[ebp]
    xor    ecx, ebp
    call    @__security_check_cookie@4
    mov    esp, ebp
    pop    ebp
    ret    0
_Func    ENDP
_TEXT    ENDS
END


Кстати Пильщиков предлагает инициализировать по другому
Код

    mov dword ptr [ebp - 520], '1'
    mov dword ptr [ebp - 519], 00h
    mov dword ptr [ebp - 518], '2'
    mov dword ptr [ebp - 517], 00h
    mov dword ptr [ebp - 516], '3'
    mov dword ptr [ebp - 515], 00h
    mov dword ptr [ebp - 514], 00h
    mov dword ptr [ebp - 513], 00h

Через 1 так как это Юникод. А вот нули и завершающий нуль видимо не обязательно, как сейчас сделал по аналогии с С.


Это сообщение отредактировал(а) bugmenot1 - 27.4.2010, 18:42
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2076 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.