Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. mordor2001

    mordor2001 New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2023
    Сообщения:
    1
  2. R81...

    R81... Active Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    153
  3. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    603
    В хеш МД5 есть таблица констант, целых 64 штуки. Использую С++, студия2010. Как в классе объявить массив констант внутри самого класса?
    const uint32_t T[64] = {...далее константы
    В общем, студия запрещает инициализировать данные в классе.
    Зачем константы помещены в таблицу не просто объявлены #define или просто const int T1 = ...?
    Это надо не только для х86, но и для АРМ процессоров, у них проблемы к большими константами, в результате компилятор нагородить такой огород, что код будет работать в несколько раз медленней. А так, оптимизатор на х86 создаст константу непосредственно в коде, а для АРМ создаст таблицу.
    Если это не возможно, то придётся объявить таблицу вне класса, да и всё, но это уже не ООП.
    --- Сообщение объединено, 13 ноя 2023 ---
    И ещё, а можно создать оператор >>> и <<< для циклического вращения в С++?
    --- Сообщение объединено, 13 ноя 2023 ---
    Хотя если сделать так: enum {T0 = , T1 = ... Возможно умный компилятор сумеет догадаться создать таблицу, но это надо экспериментировать с компиляторами ARM др. RISC процессорами. Правда это сложно, только с эмуляторами, или удалённо, в общем сложно.
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    ООП не значит, что все надо в класс запихать. Объявляй массив снаружи класса в cpp-файле, и не забудь static добавить, чтобы твой T наружу не торчал.
     
  5. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    603
    Тупанул! Надо объявлять прямо внутри метода md5_process: static const uint32_t T[64] = {...
    Тогда всё работает, и буква Т, имя таблицы, не забивает проект.
     
    Последнее редактирование: 13 ноя 2023
  6. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.460
    Адрес:
    Россия, Нижний Новгород
    Можно так:
    Код (C++):
    1.  
    2. class Klass
    3. {
    4.     static constexpr int k_consts[]
    5.     {
    6.         10, 20, 30, 40
    7.     };
    8. };
    9.  
     
  7. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    603
    HoShiMin, хорошо. Но у меня Т должно видно только методу Process, там где используется. А так, на будущие учтём.
    --- Сообщение объединено, 14 ноя 2023 ---
    HoShiMin, в VS2010 эта шняга не работает, у меня старая студия со старым стандартом.
     
  8. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    603
    Есть код:
    Код (C++):
    1. //Test MD5  v0.02
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <time.h>
    5. #include "md5.cpp"
    6. int main(int argc, const char *argv[])
    7. {
    8.     if (argc < 2){
    9.         printf("Usage: file_name [count_test]\n");
    10.         return 1;
    11.     }
    12.     FILE*   pFile = fopen(argv[1], "rb");
    13.     if (!pFile){
    14.         printf("Can't open this '%s' file.\n", argv[1]);
    15.         return 1;
    16.     }
    17.     fseek(pFile, 0, SEEK_END);
    18.     size_t  SizeFile = ftell(pFile);
    19.     fseek(pFile, 0, SEEK_SET);
    20.     printf("File '%s', size = %d\n", argv[1], SizeFile);
    21.     char*   pBuf = new char[SizeFile];
    22.     if (pBuf==NULL){
    23.         printf("Memory allocation error, the request was %u bytes.\n", SizeFile);
    24.         return 1;
    25.     }
    26.     size_t  res = fread(pBuf, 1, SizeFile, pFile);
    27.     if (res != SizeFile){
    28.         printf("Error reading the file. res = %u\n", res);
    29.         return 1;
    30.     }
    31.     fclose(pFile);
    32.     CHashMD5    hashMD5 = CHashMD5();
    33.     unsigned char   sHash[33];
    34.     int CntTest = 0;
    35.     if (argc>=3) CntTest = atoi(argv[2]);
    36.     if (CntTest>12) CntTest = 12;   //макс. количество тестов
    37.     double  LST[12];
    38.     for (int i=0; i<(CntTest<=0 ? 1 : CntTest); i++){
    39.         clock_t tm = clock();
    40.         hashMD5.Init();
    41.         hashMD5.Update(pBuf, SizeFile);
    42.         hashMD5.GetHashStr(sHash);
    43.         LST[i] = (double)(clock()-tm) / CLOCKS_PER_SEC;
    44.     }
    45.     printf("MD5: %s\n", sHash);
    46.     for (int i=0; i<CntTest; i++)
    47.         printf("[%02d] ExeTime: %.3f sec, Speed: %.0f bytes/sec\n", i+1, LST[i], SizeFile/LST[i]);
    48.     delete  []pBuf;
    49.     return 0;
    50. }
    Надо перегнать в питухоний 2.7 . Файл md5.cpp кое как сам перегнал(правда не знаю, правильно ли), точней конверторами, правда они лимитные, и это код я не успел перегнать.
    print("2+2=", 2+2) я ещё понимаю, но остальное меня загоняет в тупик. Я же говорю питухоний сложный ЯП, сложней С/С++.
     
  9. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    а чего на 2.7? оно же умерло 10 лет тому...
     
  10. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    603
    alex_dz, другого нет. Это автоматическая установка VS2010. Надо отдельно устанавливать, код вроде для 2.7 работает, наверное, но будет ли работать с 3.6? Проблема питухония это гемор с версиями. Работал код, работал, и вдруг эти критины всё поломали, да, только критины работают над питухонием, т.к. делают в основном для критинов.
    --- Сообщение объединено, 16 ноя 2023 ---
    Что-то не работает. Питухоний 3.12 не работает, вот код С++.
    Код (C++):
    1.  
    2.     __inline u32 ROL(u32 r, u8 n){
    3.         return (r << n) | (r >> (32 - n));
    4.     };
    5.     __inline void ROUND1(u32 *a, u32 b, u32 c, u32 d, u32 X, u8 s, u32 Ti){
    6.         *a = ROL(*a + ((b & c) | (~b & d)) + X + Ti, s) + b;
    7.     };
    8.  
    Код (Python):
    1.  
    2.     def ROL(r, n):
    3.         return (r << n) | (r >> (32 - n))
    4.     #end
    5.     def ROUND1(self, a, b, c, d, X, s, Ti):
    6.         a[0] = self.ROL(a[0] + ((b & c) | (~b & d)) + X + Ti, s) + b
    7.     #end
    8.  
    Ругается на:
    File "D:\assemblers\my_projects\md5\Pytuhon\MD5.py", line 22, in ROUND1
    a[0] = self.ROL(a[0] + ((b & c) | (~b & d)) + X + Ti, s) + b
    TypeError: 'int' object is not subscriptable
    Или по ссылке в питухонии нельзя данные возвращать? Надо типа так делать.
    def ROUND1(self, a, b, c, d, X, s, Ti):
    return self.ROL(a + ((b & c) | (~b & d)) + X + Ti, s) + b
    и далее так
    a = self.ROUND1(a, b, c, d, X[0], 7, T[0])
    Может и заработает.
     
  11. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.460
    Адрес:
    Россия, Нижний Новгород
    Intro,
    Код (Python):
    1.  
    2. import hashlib
    3.  
    4. def md5(fname):
    5.     hash_md5 = hashlib.md5()
    6.     with open(fname, "rb") as f:
    7.         for chunk in iter(lambda: f.read(4096), b""):
    8.             hash_md5.update(chunk)
    9.     return hash_md5.hexdigest()
    10.    
    11. print(md5("file.txt"))
    12.  
    --- Сообщение объединено, 16 ноя 2023 ---
    Лучше напиши пример твоих данных, которые надо прохэшировать. Так будет проще, чем переводить сишный код один к одному
     
  12. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    603
    По ссылке не получается данные передавать, ну и ладно, код переделал, этот баг устранён. Но вылезли новые баги, так что завтра.
    И да, я знаю что в питухонии хеш можно из библиотеки взять, но мне надо просто сложным кодом питухоний протестировать, + ещё ковыряя реальный код можно как-то освоить ЯП, просто чтение талмудов ничего не даст.
     
  13. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.460
    Адрес:
    Россия, Нижний Новгород
    Кстати, оцени, насколько короче вариант на питоне. У тебя одно только получение размера файла заняло три системных вызова на три строчки…
    А pBuf на NULL можно не проверять, поскольку new никогда его не вернёт. Он или вернёт память, или, если её не хватает, выбросит исключение. Чтобы вместо исключения возвращал NULL, делай так:
    Код (C++):
    1.  
    2. char* pBuf = new (std::nothrow) char[SizeFile];
    3.  
     
  14. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    603
    Выделяю память GlobalAlloc, и эта функция почему-то не выравнивает на 16, только на 8, а SSE требует на 16. Может какие-то флаги нужны, или другая функция?
     
  15. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    87
    Intro, можно _aligned_malloc для выравнивания на 16.
     
  16. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    VirtualAlloc2 () WinAPI еще можно подергать
     
  17. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    Выделить на 15 байт больше чем надо и применить на полученный указатель (ptr+15)&(~15).
     
  18. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    172
    Интереса ради, спросил у нейронки не знаю насколько правильна такая обертка
    Код (Text):
    1. #include <windows.h>
    2.  
    3. void* AlignedGlobalAlloc(SIZE_T size) {
    4.     // Выделяем память на 15 байт больше, чем нужно
    5.     void* ptr = GlobalAlloc(GMEM_FIXED, size + 15);
    6.     if (!ptr) {
    7.         return NULL; // Проверка на успешное выделение
    8.     }
    9.     // Выравниваем указатель
    10.     void* alignedPtr = (void*)(((uintptr_t)ptr + 15) & ~15);
    11.     return alignedPtr;
    12. }
    13.  
    14. // Не забывайте освобождать память
    15. void AlignedGlobalFree(void* ptr) {
    16.     if (ptr) {
    17.         // Освобождаем память, используя оригинальный указатель
    18.         GlobalFree((void*)((uintptr_t)ptr - 15));
    19.     }
    20. }
     
  19. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    603
    Код (ASM):
    1. ; v0.03
    2. ;
    3. xr_vector struct ; (sizeof=12, align=4)
    4.     _Myfirst            dword ?     ; 0     pointer to beginning of array       указатель на начало массива
    5.     _Mylast             dword ?     ; 4     pointer to current end of sequence  указатель на текущий конец последовательности
    6.     _Myend              dword ?     ; 8     pointer to end of array             указатель на конец массива
    7. xr_vector ends                      ; 12
    8. xr_vector@start_size        = 500
    9. xr_vector@@xr_vector MACRO vec:req
    10.     xor     eax, eax
    11.     mov     vec._Myfirst, eax
    12.     mov     vec._Mylast, eax
    13.     mov     vec._Myend, eax
    14.     EXITM <>
    15. ENDM
    16. xr_vector@@push MACRO vec:req, sizeof_class:req
    17.     .if (vec._Myfirst==0)
    18.         mov     vec._Myfirst, GlobalAlloc(GMEM_FIXED, xr_vector@start_size*sizeof_class)
    19.         lea     edx, [eax+1*sizeof_class]
    20.         mov     vec._Mylast, edx
    21.         lea     edx, [eax+xr_vector@start_size*sizeof_class]
    22.         mov     vec._Myend, edx
    23.     .else
    24.         mov     eax, vec._Mylast
    25.         lea     edx, [eax+1*sizeof_class]
    26.         .if (edx>vec._Myend)    ;;контейнер переполнился
    27.             ;;создадим новый массив с размером в полтора раза больше
    28.             mov     edx, xr_vector@@new_copy(&&vec, sizeof_class)
    29.             add     edx, sizeof_class
    30.         .endif
    31.         mov     vec._Mylast, edx
    32.     .endif
    33.     EXITM <eax>
    34. ENDM
    35. align_proc
    36. xr_vector@@new_copy proc (dword) uses esi edi thiz:ptr xr_vector, sizeof_class:dword
    37.     mov     esi, thiz
    38.     ASSUME  esi:ptr xr_vector
    39.     ;;создадим новый массив с размером в полтора раза больше
    40.     mov     eax, [esi]._Myend
    41.     sub     eax, [esi]._Myfirst
    42.     xor     edx, edx
    43.     div     sizeof_class    ;size=(_Myend-_Myfirst)/sizeof_class
    44.     mov     edx, eax
    45.     shr     edx, 1  ;/=2
    46.     add     eax, edx
    47.     mul     sizeof_class    ;size_byte = (size+size/2)*sizeof_class
    48.     mov     [esi]._Myend, eax
    49.     mov     ecx, GlobalAlloc(GMEM_FIXED, eax)
    50.     mov     edi, eax    ;new_Myfirst
    51.     add     [esi]._Myend, eax
    52.     ;;скопировать данные в новый контейнер
    53.     .for (edx=[esi]._Myfirst: edx<[esi]._Mylast: edx++, ecx++)
    54.         mov     al, [edx]
    55.         mov     [ecx], al
    56.     .endfor
    57.     mov     [esi]._Mylast, ecx
    58.     GlobalFree([esi]._Myfirst)
    59.     mov     [esi]._Myfirst, edi     ;=new_Myfirst
    60.     mov     eax, [esi]._Mylast
    61.     ASSUME  esi:nothing
    62.     ret
    63. xr_vector@@new_copy endp
    64. ;---------------------------------------------------------------------------------------------------
    65.  
     
  20. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    603
    Research, у меня получается конфликт, я ярый фанат ООП(Объективно Ориентировочно Программирования). Класс xr_vector это std::vector, я реализовал этот объект на ассме, выровненный указатель не равный... в общем нам надо хранить ещё дополнительно первичный указатель чтобы спокойно его удалить. Возможно надо использовать не указатель, а дескриптор, модернизировать указанный класс для хранения этого этого атрибута.