Сейчас на форуме: jinoweb (+6 невидимых)

 eXeL@B —› Программирование —› Увеличение диапазона читаемых чисел
Посл.ответ Сообщение

Ранг: 12.4 (новичок)
Активность: 0.020.05
Статус: Участник

Создано: 02 января 2016 03:23
· Личное сообщение · #1

Здравствуйте. Помогите разобраться. Есть функция, читающая в отдельном файле коды вида s0-s15, t0-t15, u0-u15, v0-v15, w0-w15, x0-x15, y0-y15 и преобразующая их в числовые значения от 0 до 63 (0-3F). Само преобразование происходит начиная с адреса 004D9FAC, и там вроде бы все нормально. Но дальше идет чтение собственно числовых значений (004DA201) и тут уже стоит ограничение 0-3F. Каким образом мне расширить диапазон до 6F, чтобы коды w0-w15, x0-x15 и y0-y15 могли использоваться программой? Вроде-бы все перед глазами и должно быть легко и просто, но моих поверхностных гугл-знаний ассемблера нехватает. Пробовал добавить Case 9 в конце функции. Джампы все правильно прописал, обновил без ошибок. Но в результате этих экспериментов появлялись/исчезали только числа 8-9. Кстати, непонятно - почему Cases 0, 3, 8, 9, A, B, C, D, E, F..... в начале не показывает 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ведь фактически все эти числа читаются. AND EDX,0000003F тоже пробовал менять на, например, 4F (для w0-w15). В этом случае код портился окончательно. Извините за, скорее всего, глупый вопрос, но его решение мне сняло бы с шеи пару камней.

f00b_02.01.2016_EXELAB.rU.tgz - Cases.txt



Ранг: 397.0 (мудрец), 179thx
Активность: 0.170.1
Статус: Участник

Создано: 02 января 2016 08:41 · Поправил: BfoX
· Личное сообщение · #2

Switch (cases 0..3F, 8 exits)

их всего 3F, а но не больше 7 (CMP ECX,7) вот эти Cases 1,2,4,5,6,7,8

а эти Cases 0, 3, 9, A, B, C, D, E, F, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 1C, 1D, 1E, 1F, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2A, 2B, 2C, 2D, 2E, 2F, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 3A, 3B, 3C, 3D, 3E, 3F дефолтные

-----
...или ты работаешь хорошо, или ты работаешь много...




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 02 января 2016 11:49 · Поправил: dosprog
· Личное сообщение · #3

Code:
  1.  
  2. 004D9FB1  |.  83C0 9F       ADD EAX,-61   ;МИНУС 'a' ; Switch (cases 61..7A, 11. exits)
  3. 004D9FB4  |.  33F6          XOR ESI,ESI
  4. 004D9FB6  |.  83F8 19       CMP EAX,19 ;<--- СИМВОЛ БОЛЬШЕ 'z' ?
  5. 004D9FB9  |.  0F87 17010000 JA 004DA0D6  ;<--- ПРЫГ ЕСЛИ БОЛЬШЕ
  6. 004D9FBF  |.  0FB690 C4A24D MOVZX EDX,BYTE PTR DS:[EAX+4DA2C4] ;<-- ПО АДРЕСУ 4DA2C4 ТАБЛИЦА (19h BYTES) ИНДЕКСОВ для каждой из букв 'a'..'z'
  7. 004D9FC6  |.  FF2495 98A24D JMP DWORD PTR DS:[EDX*4+4DA298]  ;<--- ПО АДРЕСУ 4DA298 ТАБЛИЦА ПЕРЕХОДОВ, ИНДЕКСИРУЕМАЯ ЗНАЧЕНИЕМ ИЗ ТАБЛИЦЫ ИНДЕКСОВ для буковок 'a'..'z'.


Внимательно см.сюда:
004D9FBF |. 0FB690 C4A24D MOVZX EDX,BYTE PTR DS:[EAX+4DA2C4] ;<-- ПО АДРЕСУ 4DA2C4 ТАБЛИЦА (19h BYTES) ИНДЕКСОВ для каждой из букв 'a'..'z'

Нужно подредактировать эту таблицу для каждой из дополнительно желаемых буковок.
В общем, нужно пробовать





Ранг: 12.4 (новичок)
Активность: 0.020.05
Статус: Участник

Создано: 02 января 2016 16:53 · Поправил: gabryelle
· Личное сообщение · #4

Вот эта таблица
Code:
  1. 004DA2C4   .  00            DB 00
  2. 004DA2C5   .  01            DB 01
  3. 004DA2C6   .  0A            DB 0A
  4. 004DA2C7   .  0A            DB 0A
  5. 004DA2C8   .  0A            DB 0A
  6. 004DA2C9   .  0A            DB 0A
  7. 004DA2CA   .  0A            DB 0A
  8. 004DA2CB   .  0A            DB 0A
  9. 004DA2CC   .  0A            DB 0A
  10. 004DA2CD   .  0A            DB 0A
  11. 004DA2CE   .  0A            DB 0A
  12. 004DA2CF   .  0A            DB 0A
  13. 004DA2D0   .  02            DB 02
  14. 004DA2D1   .  0A            DB 0A
  15. 004DA2D2   .  0A            DB 0A
  16. 004DA2D3   .  0A            DB 0A
  17. 004DA2D4   .  0A            DB 0A
  18. 004DA2D5   .  0A            DB 0A
  19. 004DA2D6   .  01            DB 01
  20. 004DA2D7   .  03            DB 03
  21. 004DA2D8   .  04            DB 04
  22. 004DA2D9   .  05            DB 05
  23. 004DA2DA   .  06            DB 06
  24. 004DA2DB   .  07            DB 07
  25. 004DA2DC   .  08            DB 08
  26. 004DA2DD   .  09            DB 09

Букв 11, а индексов 26. Даже не вижу, как они могут быть связаны. В таблице переходов все указано верно
Code:
  1. 004DA2B0   .  81A04D00      DD 004DA081 ;Прыгает к 'w'
  2.  
  3.  
  4. 004DA029  |> \8B8D E8000000 MOV ECX,DWORD PTR SS:[EBP+0E8]           ; Case 74 ('t') of switch test.4D9FB1
  5. 004DA02F  |.  81E1 FFF0FFFF AND ECX,FFFFF0FF
  6. 004DA035  |.  81C9 C0000000 OR ECX,000000C0
  7. 004DA03B  |.  898D E8000000 MOV DWORD PTR SS:[EBP+0E8],ECX
  8. 004DA041  |.  BE 10000000   MOV ESI,10                               ; t дает число(0-F) + 10h
  9. 004DA046  |.  E9 9C000000   JMP 004DA0E7                             ; Прыгает на 004DA0E7, буква 't' работает
  10. 004DA04B  |>  8B95 E8000000 MOV EDX,DWORD PTR SS:[EBP+0E8]           ; Case 75 ('u') of switch test.4D9FB1
  11. 004DA051  |.  81E2 FFF0FFFF AND EDX,FFFFF0FF
  12. 004DA057  |.  81CA C0000000 OR EDX,000000C0
  13. 004DA05D  |.  8995 E8000000 MOV DWORD PTR SS:[EBP+0E8],EDX
  14. 004DA063  |.  BE 20000000   MOV ESI,20                               ; u дает число(0-F) + 20h
  15. 004DA068  |.  EB 7D         JMP SHORT 004DA0E7                       ; Прыгает на 004DA0E7, буква 'u' работает
  16. 004DA06A  |>  8B85 E8000000 MOV EAX,DWORD PTR SS:[EBP+0E8]           ; Case 76 ('v') of switch test.4D9FB1
  17. 004DA070  |.  25 FFF0FFFF   AND EAX,FFFFF0FF
  18. 004DA075  |.  0D C0000000   OR EAX,000000C0
  19. 004DA07A  |.  BE 30000000   MOV ESI,30                               ; v дает число(0-F) + 30h
  20. 004DA07F  |.  EB 60         JMP SHORT 004DA0E1                       ; В отличие от предыдущих, прыгает на 004DA0E1, буква 'v' работает
  21. 004DA081  |>  8B8D E8000000 MOV ECX,DWORD PTR SS:[EBP+0E8]           ; Case 77 ('w') of switch test.4D9FB1
  22. 004DA087  |.  81E1 FFF0FFFF AND ECX,FFFFF0FF
  23. 004DA08D  |.  81C9 C0000000 OR ECX,000000C0
  24. 004DA093  |.  898D E8000000 MOV DWORD PTR SS:[EBP+0E8],ECX
  25. 004DA099  |.  BE 40000000   MOV ESI,40                               ; w дает число(0-F) + 40h, но это значение программа уже не видит. 3F максимум
  26. 004DA09E  |.  EB 47         JMP SHORT 004DA0E7                       ; Прыгает на 004DA0E7, буква 'w' не работает, я думаю это из-за ограничения в максимальном числовом индексе, а не из-за буквы
  27. 004DA0A0  |>  8B95 E8000000 MOV EDX,DWORD PTR SS:[EBP+0E8]           ; Case 78 ('x') of switch test.4D9FB1
  28. 004DA0A6  |.  81E2 FFF0FFFF AND EDX,FFFFF0FF
  29. 004DA0AC  |.  81CA C0000000 OR EDX,000000C0
  30. 004DA0B2  |.  8995 E8000000 MOV DWORD PTR SS:[EBP+0E8],EDX
  31. 004DA0B8  |.  BE 50000000   MOV ESI,50                               ; x дает число(0-F) + 50h, также не работает
  32. 004DA0BD  |.  EB 28         JMP SHORT 004DA0E7
  33. 004DA0BF  |>  8B85 E8000000 MOV EAX,DWORD PTR SS:[EBP+0E8]           ; Case 79 ('y') of switch test.4D9FB1
  34. 004DA0C5  |.  25 FFF0FFFF   AND EAX,FFFFF0FF
  35. 004DA0CA  |.  0D C0000000   OR EAX,000000C0
  36. 004DA0CF  |.  BE 60000000   MOV ESI,60                               ; y дает число(0-F) + 60h, не работает
  37. 004DA0D4  |.  EB 0B         JMP SHORT 004DA0E1
  38. 004DA0D6  |>  8B85 E8000000 MOV EAX,DWORD PTR SS:[EBP+0E8]           ; Default case of switch test.4D9FB1
  39. 004DA0DC  |.  0D C00F0000   OR EAX,00000FC0
  40. 004DA0E1  |>  8985 E8000000 MOV DWORD PTR SS:[EBP+0E8],EAX
  41. 004DA0E7  |>  8D4424 28     LEA EAX,[LOCAL.3]                        ;LEA EAX,[ESP+28]
  42. 004DA0EB  |.  8D50 01       LEA EDX,[EAX+1]
  43. 004DA0EE  |.  8BFF          MOV EDI,EDI
  44.  


Буква z используется, но там немного другой рассчет и она мне не нужна. Нужны именно w,x,y.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 02 января 2016 16:56 · Поправил: dosprog
· Личное сообщение · #5

gabryelle пишет:
Букв 11,


Букв 19h+1 = 25+1, вместе с нулевым - 26 (1Ah).
Столько же байтов и в таблице типов-индексов.
(004DA2DEh - 004DA2С4h = 1Ah = 26)

А 11 (0Ah+1) - это обработчиков различных типов символов. Этих типов да, 11 (00..0Ah).

Code:
  1.     004DA2C4   .  00    DB 00   ;'a'
  2.     004DA2C5   .  01    DB 01   ;'b'
  3.     004DA2C6   .  0A    DB 0A   ;'c'
  4.     004DA2C7   .  0A    DB 0A   ;'d'
  5.     004DA2C8   .  0A    DB 0A   ;'e'
  6.     004DA2C9   .  0A    DB 0A   ;'f'
  7.     004DA2CA   .  0A    DB 0A   ;'g'
  8.     004DA2CB   .  0A    DB 0A   ;'h'
  9.     004DA2CC   .  0A    DB 0A   ;'i'
  10.     004DA2CD   .  0A    DB 0A   ;'j'
  11.     004DA2CE   .  0A    DB 0A   ;'k'
  12.     004DA2CF   .  0A    DB 0A   ;'l'
  13.     004DA2D0   .  02    DB 02   ;'m'
  14.     004DA2D1   .  0A    DB 0A   ;'n'
  15.     004DA2D2   .  0A    DB 0A   ;'o'
  16.     004DA2D3   .  0A    DB 0A   ;'p'
  17.     004DA2D4   .  0A    DB 0A   ;'q'
  18.     004DA2D5   .  0A    DB 0A   ;'r'
  19.     004DA2D6   .  01    DB 01   ;'s'
  20.     004DA2D7   .  03    DB 03   ;'t'
  21.     004DA2D8   .  04    DB 04   ;'u'
  22.     004DA2D9   .  05    DB 05   ;'v'
  23.     004DA2DA   .  06    DB 06   ;'w'
  24.     004DA2DB   .  07    DB 07   ;'x'
  25.     004DA2DC   .  08    DB 08   ;'y'
  26.     004DA2DD   .  09    DB 09   ;'z'
  27.  
  28.  




Ранг: 12.4 (новичок)
Активность: 0.020.05
Статус: Участник

Создано: 02 января 2016 17:11 · Поправил: gabryelle
· Личное сообщение · #6

Тоесть получается, что в таблице идет перечисление от 00 до 0A и снова дает 11 используемых букв? Остальные значения повторяют 0A. Получается, что буквы w-y используются. Но числовой результат ограничен числом 3F.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 02 января 2016 17:16 · Поправил: dosprog
· Личное сообщение · #7

gabryelle пишет:
и снова дает 11 используемых букв?


Даёт 11 типов используемых символов.

У символов 'c','d','e' etc. тип 0A,
У символa 'b' тип 01,
И так далее.

Трудно об остальном судить, поскольку неясна сама задача, из которой это выдрано.
Но сам процесс разбора организован вполне стандартно.



Ранг: 12.4 (новичок)
Активность: 0.020.05
Статус: Участник

Создано: 02 января 2016 17:26
· Личное сообщение · #8

dosprog дело в том, что с разбором все понятно, проблема начинается ниже, именно в месте
BfoX пишет:
Cases 0, 3, 9, A, B, C, D, E, F, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 1C, 1D, 1E, 1F, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2A, 2B, 2C, 2D, 2E, 2F, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 3A, 3B, 3C, 3D, 3E, 3F дефолтные


Хотя буква 'w' рассчитывается как нужно (w0=40h), число 40h и выше уже не читается. Если вам не трудно посмотреть, могу кинуть сам файл. Или в лс договоримся.

Добавлено спустя 3 часа 52 минуты
Мне кажется загвоздка в AND EDX,0000003F - если я правильно понимаю, выделяются первые 6 битов из EDX, в то время, как 40h - это уже 7 битов. В результате 40h (0100 0000) обрезается до 0h.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 02 января 2016 22:08
· Личное сообщение · #9

gabryelle пишет:
буква 'w' рассчитывается как нужно (w0=40h), число 40h и выше уже не читается.


gabryelle пишет:
Мне кажется загвоздка в AND EDX,0000003F


Попробуйте заменить на 7Fh, раз так.



Ранг: 12.4 (новичок)
Активность: 0.020.05
Статус: Участник

Создано: 02 января 2016 22:22
· Личное сообщение · #10

Code:
  1. 004DA1FC  |.  8BD0               MOV EDX,EAX
  2. 004DA1FE  |.  C1EA 12            SHR EDX,12
  3. 004DA201  |.  83E2 3F            AND EDX,0000003F                             ; Switch (cases 0..3F, 8 exits)
  4. 004DA204  |.  8D4A FF            LEA ECX,[EDX-1]
  5. 004DA207  |.  83F9 07            CMP ECX,7

Пробовал менять здесь - не работает.
Получается
Code:
  1. 004DA201  |.  83E2 7F            AND EDX,0000007F                             ; Switch (cases 1..8, 8 exits)

а тут вообще пусто
Code:
  1. 004DA26D  |> \8B5424 10          MOV EDX,DWORD PTR SS:[LOCAL.9]               ; Default case of switch test.4DA201


Выше по коду тоже много таких значений, но их замена никак не влияет



Ранг: 397.0 (мудрец), 179thx
Активность: 0.170.1
Статус: Участник

Создано: 03 января 2016 11:22
· Личное сообщение · #11

dosprog пишет:
Попробуйте заменить на 7Fh, раз так.


тогда будет вылетать за диапазон cases

-----
...или ты работаешь хорошо, или ты работаешь много...




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 03 января 2016 14:02 · Поправил: dosprog
· Личное сообщение · #12

BfoX пишет:
тогда будет вылетать за диапазон cases

Да, это не выход.

Что-то в таком формате обсуждение может длиться годами, и всё бестолку.
Я вот так и не понял, к каким последствиям привело редактирование вот этих байтов? :

Code:
  1. 004DA2DA   .  06    DB 06   ;'w'
  2. 004DA2DB   .  07    DB 07   ;'x'
  3. 004DA2DC   .  08    DB 08   ;'y'
  4. 004DA2DD   .  09    DB 09   ;'z'




Ранг: 12.4 (новичок)
Активность: 0.020.05
Статус: Участник

Создано: 03 января 2016 19:09
· Личное сообщение · #13

dosprog попробовал поменять индексы местами или заменить 06 на 0B. Никакой разницы. А к чему это должно привести? С буквами ведь всё нормально, это числа не читаются. Кстати, на практике проверял - из w0 и в самом деле получается 0
gabryelle пишет:
В результате 40h (0100 0000) обрезается до 0h





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 06 января 2016 18:01
· Личное сообщение · #14

BfoX пишет:
тогда будет вылетать за диапазон cases

ну так и таблицу нужно расширять соответственно... иначе по любому будет вылетать

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh



 eXeL@B —› Программирование —› Увеличение диапазона читаемых чисел
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати