Форум программистов, компьютерный форум, киберфорум
Наши страницы

Assembler, MASM, TASM

Войти
Регистрация
Восстановить пароль
 
assch
2 / 2 / 0
Регистрация: 13.09.2010
Сообщений: 46
#1

Как резервируется память для переменной? - Assembler

22.12.2010, 01:00. Просмотров 942. Ответов 4
Метки нет (Все метки)

Конструкция для сбора списка файлов в данной директории и последующей записи этих данных из переменной string в текстовый файл
Но переменная имеет обьявленные параметры string dd 260 dup (0) и поэтому информацию больше 260 байт туда не запишешь
То есть если список файлов большой то функция выдаст ошибку Можно конечно увеличить не 260 а например 26000 но это хоть и увеличивает
память переменной но по большому счёту не спасает (не говоря уже о том что пропорционально увеличивается размер экзешника)
Я не давно пересел на ассемблер раньше работал на языке Autoit там таких проблем нет при обьявлении переменной туда можно загнать
любое количество данных в ассемблере видимо по другому я конечно пытаюсь разобратся но надеюсь может быть кто нибудь подскажет
как резервируется память для переменной Чтобы туда без проблем влезла вся информация
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
.386
.model flat, stdcall
option casemap :none   
 
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
 
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
 
.data
 
maska    db "*.*",0
find     WIN32_FIND_DATA <0>       
handl    dd 0
string   dd 260 dup (0)
fName    db "a.txt",0
fHandle  dd 0
buf      dd 0
 
.code
start:
 
lea esi,string
invoke FindFirstFile,ADDR maska,ADDR find
MOV handl,eax
LF:
CMP find.cFileName,"."
JE SD
invoke  lstrcat, esi, ADDR find.cFileName
invoke  lstrlen, ADDR find.cFileName
add esi, eax
mov dword ptr [esi], 000000da0h
add esi, 2
SD:
invoke FindNextFile,handl,ADDR find
CMP eax,0
JNE LF
invoke FindClose,handl
invoke CreateFile,ADDR fName,GENERIC_READ+GENERIC_WRITE,0,0,2,0,0
mov fHandle, eax
invoke  lstrlen, ADDR string
invoke WriteFile,fHandle,ADDR string,eax,ADDR buf,0
invoke CloseHandle,fHandle
invoke ExitProcess,0
 
end start
Добавлено через 23 минуты
На языке Autoit это делается без проблем Скажем сбор информации всех файлов
на диске С занимает около 10 секунд программа загоняет список файлов в переменую и потом записывает эти данные в текстовый файл получается около 30000 строк и размер файла около 3 мегабайт Я специально пробую написать это на ассемблере с надеждой что вместо 10 секунд получится быстрее (хотя может быть я и ошибаюсь) но как говорится надежда умирает последней
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2010, 01:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как резервируется память для переменной? (Assembler):

Память для приложения - Assembler
Откуда лучше выделять память и как. Обычно пользуюсь: GlobalAlloc GlobalLock GlobalHandle GlobalFree Во время выполнения размер...

Почему в TASM нельзя сравнивать память-память? - Assembler
То есть я понимаю, что можно либо регистр-память, либо память-регистр, либо регистр-регистр. Но почему так? И существуют ли методы, как это...

Используя указатели, выделите память для действительной переменной, заполните ее случайным числом - C (СИ)
Используя указатели, выделите память для действительной переменной, заполните ее случайным числом, выведите результат на экран, не...

На 1000 байт HDD резервируется 24 байта на файловую систему? - Жесткие диски
Наткнулся на &quot;Ответах Мэйл Ру&quot;. Человек спросил, почему его 320 Гб жесткий жиск винда в свойствах диска видит как 297 Гб. Один из...

Как выделить память для класса - C++
Привет, я пишу библиотеку управления памятью. На данный момент я выделяю память вот так void * __cdecl MyAlloc(size_t size) { void *...

Как выделить динамическую память для матрицы? - C (СИ)
Как выделить динамическую память для матрицы?

4
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
22.12.2010, 01:06 #2
Есть winapi для выделения памяти:
http://msdn.microsoft.com/en-us/library/aa909240.aspx
Как пример: http://win32assembly.online.fr/w32_01.txt
0
assch
2 / 2 / 0
Регистрация: 13.09.2010
Сообщений: 46
22.12.2010, 01:11  [ТС] #3
Спасибо Vourhey
Попробую разобратся
0
Mikl___
Заблокирован
Автор FAQ
22.12.2010, 08:36 #4
assch, проблема в том что при выделении памяти ты используешь конструкцию string dd 260 dup (0) а нужно string dd 260 dup (?) вот в этом случае на размер твоего экзешника ни как не повлияет выделишь ты 260 dword или 26000 dword
0
assch
2 / 2 / 0
Регистрация: 13.09.2010
Сообщений: 46
22.12.2010, 15:37  [ТС] #5
Добавлено через 2 часа 35 минут
Из примера понял что вроде бы как то надо работать с функцией GlobalAlloc
Но вот как её приделать именно к своему примеру пока не получается
0
22.12.2010, 15:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2010, 15:37
Привет! Вот еще темы с ответами:

как на телефоне NOKIA увеличить память для Т9 ?? - Мобильный софт
как на телефоне NOKIA увеличить память для Т9 ??.когда добовляешь новый слова другие исчезают,,это вообще возможно сделать?

Как выделить память для динамического массива? - C++
Как выделить память для динамического массива? typedef TPrimitives *TPrimitive; //... TPrimitives Primitives; Мне нужно выделить...

Как выделить память для массива структур? - C (СИ)
выделить пямять для такой структуры на n элементов typedef struct coordinates { float x; float y; float z;}line_segment;

Как выделить память для двухмерного массива? - C++
Как выделить память для двухмерного массива в С++ a=new int???


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru