Size: a a a

Ассемблер

2020 October 05

N

Nrys in Ассемблер
Мозговой штурм, завтра продолжу, а то уже сил нет
источник

ST

Saenro T in Ассемблер
OUT OF MEMORY.
Не работает.
Хотя может где-то ошибка...
А ты не пробовал?
источник

DR

Dima Richev in Ассемблер
Там же в описании сурс
источник

ST

Saenro T in Ассемблер
То для 64
источник

ST

Saenro T in Ассемблер
Я оттуда только палитру взял
источник

ST

Saenro T in Ассемблер
источник

DR

Dima Richev in Ассемблер
Nrys
Мозговой штурм, завтра продолжу, а то уже сил нет
Вот, как я реализовал это на C++:

std::vector<std::string> get_all_files(std::string folder)
{
   std::vector<std::string> names;
   std::string search_path = folder + "/*";
   WIN32_FIND_DATA fd;
   HANDLE hFind = FindFirstFile(search_path.c_str(), &fd);

   int index = 0;
   if (hFind != INVALID_HANDLE_VALUE) {
       do {
           if (index <= 1) {
               index++;
               continue;
           }
           names.push_back(folder + "\\" + fd.cFileName);
           if (fd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) {
               std::vector<std::string> add_files = get_all_files(folder + "\\" + fd.cFileName);
               for (int i = 0; i < add_files.size(); i++) {
                   names.push_back(add_files[i]);
               }
           }
       } while (FindNextFile(hFind, &fd));
       FindClose(hFind);
   }
   return names;
}

Он получает абсолютно все файлы в директориях и поддиректориях.

После вызова функции - результат всех файлов в векторе.
источник

DR

Dima Richev in Ассемблер
... после чего можно будет пройтись по вектору и посмотреть, находится ли там нужный файл.
источник

DR

Dima Richev in Ассемблер
Dima Richev
Вот, как я реализовал это на C++:

std::vector<std::string> get_all_files(std::string folder)
{
   std::vector<std::string> names;
   std::string search_path = folder + "/*";
   WIN32_FIND_DATA fd;
   HANDLE hFind = FindFirstFile(search_path.c_str(), &fd);

   int index = 0;
   if (hFind != INVALID_HANDLE_VALUE) {
       do {
           if (index <= 1) {
               index++;
               continue;
           }
           names.push_back(folder + "\\" + fd.cFileName);
           if (fd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) {
               std::vector<std::string> add_files = get_all_files(folder + "\\" + fd.cFileName);
               for (int i = 0; i < add_files.size(); i++) {
                   names.push_back(add_files[i]);
               }
           }
       } while (FindNextFile(hFind, &fd));
       FindClose(hFind);
   }
   return names;
}

Он получает абсолютно все файлы в директориях и поддиректориях.

После вызова функции - результат всех файлов в векторе.
Переписать на ассемблер - не думаю, что будет сложно
источник

楽園松本 in Ассемблер
Nrys
Ну вот, так и делаю, проблема только в том, что при возвращении в предыдущую директорию мне надо как-то сохранить, что в такой-то я уже был, чтобы не заходить повторно и не было цикла
Твоя задача предполагает, что пока ты рекурсивно лазишь по папкам, какой-то другой процесс может создавать папки?
источник

楽園松本 in Ассемблер
Оставляй в папке фалик с меткой о проверке
источник

DR

Dima Richev in Ассемблер
楽園松本
Твоя задача предполагает, что пока ты рекурсивно лазишь по папкам, какой-то другой процесс может создавать папки?
Нет, просто ему нужно сделать проверку, был ли он уже в этой папке, что бы выбрать следующую, иначе будет цикл с одной папкой:
1. Обнаружена папка? 
2. Поиск файлов -> 1.

Но когда папки кончаются - нужно будет вернуться к той, где была последняя проверка файлов, и что бы к ней вернуться - нужно будет сохранить её в переменную.
источник

DR

Dima Richev in Ассемблер
Dima Richev
Нет, просто ему нужно сделать проверку, был ли он уже в этой папке, что бы выбрать следующую, иначе будет цикл с одной папкой:
1. Обнаружена папка? 
2. Поиск файлов -> 1.

Но когда папки кончаются - нужно будет вернуться к той, где была последняя проверка файлов, и что бы к ней вернуться - нужно будет сохранить её в переменную.
Тем самым - подпапок может быть неизвестное кол-во, и он о том, что нужно будет хранить неизвестное кол-во переменных или неизвестный размер, дабы возвращаться к последней.
источник

RS

Rusty Shackleford in Ассемблер
Dima Richev
Переписать на ассемблер - не думаю, что будет сложно
можно не особо и переписывать даже ) просто в отладчике открой скомпиленый под кресатми код и скопипастить
источник

DR

Dima Richev in Ассемблер
Rusty Shackleford
можно не особо и переписывать даже ) просто в отладчике открой скомпиленый под кресатми код и скопипастить
Во-во. Но всё же - нужно будет вместо vector поставить свой массив, или же придумать своё. Потому что копировать класс вектора из отладчика не особо разумно
источник

RS

Rusty Shackleford in Ассемблер
ну да, там минимум думаю изменений нужно будет сделать, в принципе компилятор должен оптимальный код собирать, зависет еще от опций оптимизации
источник

RS

Rusty Shackleford in Ассемблер
и зачастую не очевидные вещи встречаются в коде когда смотришь под отладчиком то, что накомпилировал си, но это оптимальные по времени выполнения комманды.
особенно с армифметикой насколько мне известно, где-то читал, уже не помню где, забавный пример, автор пытался добиться, что бы компилятор использовал mul при умножении чисел,
последовательно увеличивая операнды, тоесть 2*1, 2*2, 2*3...etc... что-то такое,
так вот, только примерно к 2*20 в коде реально появился mul ))) до этого как только не выкручивался компилятор, прибавлял, сдвиги делал побайтово, вычитал, но mull не использовал ))
источник

RS

Rusty Shackleford in Ассемблер
вобщем давольно забавный и наглядный пример на мой взгляд оптимизации, не помню уже откуда я это вычитал
источник

RS

Rusty Shackleford in Ассемблер
https://vk.com/doc-42890483_447409543?hash=56180803f25400fe1b
#книги #Жирков #ассемблер_в_linux_x64
источник

RS

Rusty Shackleford in Ассемблер
что-то не могу найти где я читал про приколы с компилятором и у множением, но зато вот книжку хорошую вспомнил, именно для x64 архитектуры асм под linux, еще и на русском, что большая редкость ) помойму вообще единственная в своем роде
источник