purebasic.info

PureBasic forum
Текущее время: Вс фев 25, 2018 1:15 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Re: Фасм
СообщениеДобавлено: Ср фев 15, 2017 8:08 pm 
Не в сети
док

Зарегистрирован: Сб окт 31, 2009 7:44 am
Сообщений: 146
Благодарил (а): 73 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
MrF
это моя же первая ссылка! :wink:
Цитата:
на странице:
http://www.purebasic.fr/english/viewtopic.php?f=35&t=47313&hilit=IMUL
представлен код для Murmur3_32, который считает аналогично одноименному от manhunter'a


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Фасм
СообщениеДобавлено: Ср фев 15, 2017 8:30 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
А, ну да. Но сути не меняет, что это модификация с дополнительным числом $e6546b64


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Фасм
СообщениеДобавлено: Ср фев 15, 2017 11:21 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 558
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
MrF писал(а):
А, ну да. Но сути не меняет, что это модификация с дополнительным числом $e6546b64

Основная наверное суть не в модификации кода а в том что если сменить последний символ ! на другой то хеш сумма одна и та же,такой алгоритм может дать сбой?
:roll:
Код:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
Procedure.l MurmurHash3(*key, len.l, seed.l = 0)
  EnableASM
  MOV eax, seed
  MOV ecx, len
 
    MOV edx, *key
    !push ebx
    !push ecx
 
  !mov ebx, eax
  !sub ecx, 4
  !js mh3_tail
  ; body
  !mh3_body_loop:
 
    !mov eax, [edx]
    !add edx, 4
 
  !imul eax, 0xcc9e2d51
  !rol eax, 15
  !imul eax, 0x1b873593
  !xor ebx, eax
  !rol ebx, 13
  !imul ebx, 5
  !add ebx, 0xe6546b64
  !sub ecx, 4
  !jns mh3_body_loop
  ; tail
  !mh3_tail:
 !xor eax, eax
  !add ecx, 3
  !js mh3_finalize
  !jz mh3_t1
  !dec ecx
  !jz mh3_t2
 
    !mov al, [edx + 2]
    !shl eax, 16
    !mh3_t2: mov ah, [edx + 1]
    !mh3_t1: mov al, [edx]
 
  !imul eax, 0xcc9e2d51
  !rol eax, 15
  !imul eax, 0x1b873593
  !xor ebx, eax
  ; finalization
  !mh3_finalize:
 
    !pop ecx
 
  !xor ebx, ecx
  !mov eax, ebx
  !shr ebx, 16
  !xor eax, ebx
  !imul eax, 0x85ebca6b
  !mov ebx, eax
  !shr ebx, 13
  !xor eax, ebx
  !imul eax, 0xc2b2ae35
  !mov ebx, eax
  !shr ebx, 16
  !xor eax, ebx
 
    !pop ebx
   
 
  ProcedureReturn
EndProcedure
 
          S$="Hello, World!"
          Debug MurmurHash3(@S$,Len(S$),10)
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Фасм
СообщениеДобавлено: Ср фев 15, 2017 11:43 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
Сергейчик писал(а):
если сменить последний символ ! на другой то хеш сумма одна и та же

Может потому что у тебя программа в юникод компилится, а ты используешь функцию len() вместо StringByteLength()?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Фасм
СообщениеДобавлено: Пт фев 17, 2017 12:57 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 558
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
MrF писал(а):
Сергейчик писал(а):
если сменить последний символ ! на другой то хеш сумма одна и та же

Может потому что у тебя программа в юникод компилится, а ты используешь функцию len() вместо StringByteLength()?

программа действительно в юникоде только вот явно это не с лен
сделал свой подсчёт и всё равно тоже самое.
Значит возможно само тело функции не в юникоде может быть или алгоритм брешет?
Код:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 
Procedure.l MurmurHash3(*key, seed.l = 0)
!MOV dword eax,DWORD PTR esp+4
!loc:        
!MOV word cx,word ptr eax
!add dword eax,2
!TEST cx,cx
!JNZ short loc
!SUB dword eax,DWORD PTR esp+4
!SAR eax,1
!DEC eax
!imul eax,2
 
  !MOV ecx,eax; len
  !MOV eax,DWORD PTR esp+8; seed
 
 
    !MOV edx,DWORD PTR esp+4; *key
    !push ebx
    !push ecx
 
  !mov ebx, eax
  !sub ecx, 4
  !js mh3_tail
  ; body
  !mh3_body_loop:
 
    !mov eax, [edx]
    !add edx, 4
 
  !imul eax, 0xcc9e2d51
  !rol eax, 15
  !imul eax, 0x1b873593
  !xor ebx, eax
  !rol ebx, 13
  !imul ebx, 5
  !add ebx, 0xe6546b64
  !sub ecx, 4
  !jns mh3_body_loop
  ; tail
  !mh3_tail:
 !xor eax, eax
  !add ecx, 3
  !js mh3_finalize
  !jz mh3_t1
  !dec ecx
  !jz mh3_t2
 
    !mov al, [edx + 2]
    !shl eax, 16
    !mh3_t2: mov ah, [edx + 1]
    !mh3_t1: mov al, [edx]
 
  !imul eax, 0xcc9e2d51
  !rol eax, 15
  !imul eax, 0x1b873593
  !xor ebx, eax
  ; finalization
  !mh3_finalize:
 
    !pop ecx
 
  !xor ebx, ecx
  !mov eax, ebx
  !shr ebx, 16
  !xor eax, ebx
  !imul eax, 0x85ebca6b
  !mov ebx, eax
  !shr ebx, 13
  !xor eax, ebx
  !imul eax, 0xc2b2ae35
  !mov ebx, eax
  !shr ebx, 16
  !xor eax, ebx
 
    !pop ebx
   
 
  ProcedureReturn
EndProcedure
 
          S$="Hello, World3"
          Debug MurmurHash3(@S$,10)
 



Последний раз редактировалось Сергейчик Пт фев 17, 2017 5:04 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Фасм
СообщениеДобавлено: Пт фев 17, 2017 4:41 am 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
Сергейчик писал(а):
только вот явно это не с лен

У тебя какая версия пурика? У меня на 5.30 и выше нормально код(предпоследний который) работает, хеши разные у разных строк

Сергейчик писал(а):
сделал свой подсчёт и всё равно тоже самое.

Так у тебя в еах ложится количество символов, а не количество байт, а код с байтами работает, а не с символами. Начни менять символы с W и дальше, и хеш будет тот же.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Фасм
СообщениеДобавлено: Пт фев 17, 2017 5:20 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 558
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
MrF писал(а):
Сергейчик писал(а):
только вот явно это не с лен

У тебя какая версия пурика? У меня на 5.30 и выше нормально код(предпоследний который) работает, хеши разные у разных строк

Сергейчик писал(а):
сделал свой подсчёт и всё равно тоже самое.

Так у тебя в еах ложится количество символов, а не количество байт, а код с байтами работает, а не с символами. Начни менять символы с W и дальше, и хеш будет тот же.

А вон чего...
Подправил последний код,типа подсчёт байтов в юникодной строке(и действительно хеш стал разный) :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Фасм
СообщениеДобавлено: Чт мар 16, 2017 6:51 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
Код:
1
2
3
4
5
6
7
8
9
10
11
12
!Macro label addr{
! result =  addr - 4000000
! result =  result mod 3
!}
 
Procedure lbl()
  !label lbl  
  !mov eax, result
  ProcedureReturn
EndProcedure
 !lbl:
Debug Hex(lbl())


Почему отказывается работать этот код? Или почему кроме сложения и вычитания другие операторы не хотят работать?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Фасм
СообщениеДобавлено: Ср фев 07, 2018 10:27 am 
Не в сети
ассистент

Зарегистрирован: Сб янв 30, 2016 4:41 pm
Сообщений: 11
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Добрый день!
Не обзывайте некропостером, пишу сюда, чтобы не плодить темы.
Проблема такая: есть загрузочный сектор (loader) и маленькая программа (kernel), которые запускаются с флешки. Точнее, запускались, а теперь почему-то не хотят. Для проверки максимально кастрировал код, оставил только вывод 1 сообщения,что все ок. В Bochs все пучком, работает как надо. Пишу образ на флешку, первые 2 сектора, перегружаюсь и полный облом, вместо сообщений "Loader ok." и "Kernel ok." (тестовые сообщения) получаю "Loader ok. Loader ok."...
Пожалуйста, помогите разобраться!
Вот листинги загрузчика и программы.

Загрузчик
Код:
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
org     7C00H
                cli                             ; Запрет прерываний.
                mov     [drive], dl             ; Сохраняем номер привода (в DL), с которого грузимся.
                xor     ax, ax                  ; Обнуление регистра AX.
                mov     ds, ax                  ; Обнуление сегментного регистра данных DS.
                mov     es, ax                  ; Обнуление сегментного регистра ES (Extra Segment).
                mov     ss, ax                  ; Обнуление сегментного регистра стека SS.
                mov     sp, 7C00H               ; Установка указателя стека SP на текущий адрес.
                sti                             ; Разрешение прерываний.
                mov     bx, 600H                ; ES:BX - адрес буфера для чтения секторов (0000:0600H).
                mov     dl, [drive]             ; Восстанавливаем номер привода (в DL), с которого грузимся.
                mov     dh, 0                   ; Номер головки.
                mov     cl, 2                   ; Номер сектора.
                mov     ch, 0                   ; Номер дорожки (цилиндра).
                mov     al, 1                   ; Число секторов.
                mov     ah, 2                   ; Функция 2 - чтение секторов.
                int     13H                     ; Вызов прерывания.
 
                mov     si, msg
                call    printmsg
 
                jmp     0000:0600H              ; Передаем управление по адресу буфера.
 
drive:          db      ?
msg:            db      'Loader ok. ', 0
 
printmsg:       push    ax
                push    si
                mov     ah, 0EH
                cld
printmsg1:      lodsb
                cmp     al, 0
                jz      printmsg2
                int     10H
                jmp     printmsg1
printmsg2:      pop     si
                pop     ax
                ret
 
times(512-2-($-07C00H)) db 0
 
end_of_sector:  db 055H, 0AAH



А это типа программа...
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
                org     600H
                mov     si, k_msg
                call    printmsg
 
endless:        jmp     endless
 
k_msg:          db      'Kernel ok.', 0
 
printmsg:       push    ax
                push    si
                mov     ah, 0EH
                cld
printmsg1:      lodsb
                cmp     al, 0
                jz      printmsg2
                int     10H
                jmp     printmsg1
printmsg2:      pop     si
                pop     ax
                ret



UPD: Указанный ниже код (он не делает ничего, кроме записи в видеопамять всякой фигни) компилирую и пишу образ, с флешки запускает нормально. В чем проблема, никак не пойму.

Код:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
                use16                           ; 16-битный код, realmode.
                org     7C00H                   ; Адрес программы в ОЗУ.
                cli                             ; Запрет прерываний.
                xor     ax, ax                  ; Обнуление регистра AX.
                mov     ds, ax                  ; Обнуление сегментного регистра данных DS.
                mov     es, ax                  ; Обнуление сегментного регистра ES (Extra Segment).
                mov     ss, ax                  ; Обнуление сегментного регистра стека SS.
                mov     sp, 7C00H               ; Установка указателя стека SP на текущий адрес.
                sti                             ; Разрешение прерываний.
                mov     ah, 0                   ; Очистка экрана, установка видеорежима.
                mov     al, 2                   ; Режим текстовый, 80х25, 16/8
                int     10H                     ; Вызов прерывания.
 
                mov     ah, 0                   ; Задаем начальный цвет символов.
                mov     al, 1                   ; Код символа.
                mov     ch, 1                   ; Строка. Используем регистр CX, потому что в процессе работы
                mov     cl, 1                   ; Колонка.       подпрограммы значения BX (BH и BL) изменяются.
 
t1:             mov     bh, ch
                mov     bl, cl
                call    print_xy
 
                inc     al
                inc     ah
                inc     cl
                cmp     cl, 80
                jle     t1
 
                inc     ch
                mov     cl, 0
                cmp     ch, 26
                jl      t1
 
                mov     ch, 1
 
                jmp     t1
 
print_xy:       push    0B800H
                pop     es
                push    ax
                dec     bh
                mov     al, 160
                mul     bh
                mov     di, ax
                dec     bl
                mov     al, 2
                mul     bl
                add     di, ax
                pop     ax
                cmp     al, 0
                jz      print_xy_1
                stosw
                ret
print_xy_1:     lodsb
                cmp     al, 0
                jz      end_print_xy
                stosw
                cmp     di, 0F9FH
                jl      print_xy_1
end_print_xy:   ret
 
times(512-2-($-07C00H)) db 0
db 055H, 0AAH



UPD2. Проблема решена. Надо было просто явно указать привод, с которого идет загрузка. Переписал в минималистичном варианте, теперь все нормально.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
                org     7C00H
                cli                             ; Запрет прерываний.
                xor     ax, ax                  ; Обнуление регистра AX.
                mov     ds, ax                  ; Обнуление сегментного регистра данных DS.
                mov     es, ax                  ; Обнуление сегментного регистра ES (Extra Segment).
                mov     ss, ax                  ; Обнуление сегментного регистра стека SS.
                mov     sp, 7C00H               ; Установка указателя стека SP на текущий адрес.
                sti                             ; Разрешение прерываний.
                mov     bx, 500H                ; ES:BX - адрес буфера для чтения секторов (0000:0500H).
                mov     dl, 80H                 ; Номер привода, с которого грузимся.
                mov     dh, 0                   ; Номер головки.
                mov     cl, 2                   ; Номер сектора.
                mov     ch, 0                   ; Номер дорожки (цилиндра).
                mov     al, 2                   ; Число секторов.
                mov     ah, 2                   ; Функция 2 - чтение секторов.
                int     13H                     ; Вызов прерывания.
                jmp     0000:0500H              ; Передаем управление по адресу буфера.
 
times(510-($-07C00H))   db 0                    ; Выравниваем занятое пространство до 510 байт.
 
end_of_sector:  db      055H, 0AAH              ; Последние 2 байта, сигнатура загрузочного сектора.



Вложения:
Комментарий к файлу: Скрин Bochs.
screen.jpg [97.34 KiB]
Скачиваний: 0
Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB