Сейчас на форуме: zds, UniSoft (+5 невидимых)

 eXeL@B —› Программирование —› БЫСТРО СРЕЗАТЬ БАЙТЫ
Посл.ответ Сообщение

Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 10 декабря 2011 14:26
· Личное сообщение · #1

Обьясню просто:
Допустим есть EAX = 00ABCDEF и ECX = 0000YYZZ. Какими логическими операциями можно срезать байты в EAX, чтобы вышло равным по количеству ненулевых байт в регистре ECX, т.е. результат EAX = 0000CDEF.



Ранг: 456.3 (мудрец), 340thx
Активность: 0.280.02
Статус: Участник
Android Reverser

Создано: 10 декабря 2011 14:34 · Поправил: SaNX
· Личное сообщение · #2

and eax, 0000FFFFh
или вопрос о другом?

-----
SaNX




Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 10 декабря 2011 14:38
· Личное сообщение · #3

Проблема в том, что конфигурация может быть любая. Т.е. имея только количество нулевых байт(или их отсутсвие) в ECX, требуется срезать эти байты в EAX.
Если не ошибаюсь (где-то видел, но давно) что-то было типа:
XOR EAX, 11111111h
...
XOR ECX, 11111111h



Ранг: 456.3 (мудрец), 340thx
Активность: 0.280.02
Статус: Участник
Android Reverser

Создано: 10 декабря 2011 14:49
· Личное сообщение · #4

Ну тогда юзай BSR

-----
SaNX





Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 10 декабря 2011 14:59
· Личное сообщение · #5

/*407D54*/ MOV EAX,12345678
/*407D59*/ BSWAP EAX
/*407D5B*/ XOR AX,AX
/*407D5E*/ BSWAP EAX=======>00005678

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 10 декабря 2011 15:02
· Личное сообщение · #6

ClockMan
Если я правильно понял, нужно привести EAX к виду маски в зависимости от ненулевых байт.
А так можно и цикл организовать и ror+and

-----
старый пень




Ранг: 456.3 (мудрец), 340thx
Активность: 0.280.02
Статус: Участник
Android Reverser

Создано: 10 декабря 2011 15:14
· Личное сообщение · #7

ClockMan,r_e
ога, надо чтоб если
ECX = 000YYYZZ, то EAX = 000BCDEF
ECX = 00000YZZ, то EAX = 00000DEF
ну и т.д.

Я бы через БСР сделал и свитчом выбирал бы маску для AND.
Ну типа
BSR edx, ecx
и в зависимости от байта в edx делать маску.

-----
SaNX





Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 10 декабря 2011 15:34
· Личное сообщение · #8

SaNX пишет:
ога, надо чтоб если ECX = 000YYYZZ, то EAX = 000BCDEFECX = 00000YZZ, то EAX = 00000DEF

А ему надо было по условию, а нетупо обрезать тогда сории недопонял вопрос.

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 10 декабря 2011 15:50
· Личное сообщение · #9

Насколько я понял, то нужно что-то такое
Code:
  1. mov ebx, -1
  2. bsr ecx, edx
  3. mov ecx, 31
  4. sub ecx, edx
  5. shr ebx, cl
  6. and eax, ebx


-----
Лучше быть одиноким, но свободным © $me




Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 10 декабря 2011 16:42
· Личное сообщение · #10

В BSR операнды идут в другом порядке:
BSR DEST_REG, WHAT_TO_SCAN_R_M
Если в маске (ECX) будет 0 - поведение не определено.
И даже если закрыть на всё это глаза, всё равно не прокатит:
EAX = 00ABCDEF
ECX = 00000020

Code:
  1. mov ebx, -1 ; EAX=00ABCDEF EBX=FFFFFFFF ECX=00000020 EDX=?
  2. bsr edx, ecx ; EAX=00ABCDEF EBX=FFFFFFFF ECX=00000020 EDX=00000005
  3. mov ecx, 31 ; EAX=00ABCDEF EBX=FFFFFFFF ECX=0000001F EDX=0000005
  4. sub ecx, edx ; EAX=00ABCDEF EBX=FFFFFFFF ECX=0000001A EDX=0000005
  5. shr ebx, cl ; EAX=00ABCDEF EBX=0000003F ECX=0000001A EDX=0000005
  6. and eax, ebx ; EAX=0000002F EBX=0000003F ECX=0000001A EDX=0000005


И того получили EAX=2F, а должны были получить EAX=E0

Вот как вариант:
Code:
  1.   xor edx, edx ; DEST
  2.   mov ebx, 0Fh ; MASK
  3. @@loop:
  4.   test ecx, ebx
  5.   jz @@skip
  6.   mov edi, eax
  7.   and edi, ebx
  8.   or edx, edi
  9. @@skip:
  10.   shl ebx, 4
  11.   test ebx,ebx
  12.   jnz @@loop
  13.   mov eax, edx




Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 10 декабря 2011 16:57
· Личное сообщение · #11

Выходит без цикла никак ?! Кул-хакерское решение not present ?



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 10 декабря 2011 17:01
· Личное сообщение · #12

Ну цикл развернуть можно.
Чисто логическими операциями вроди никак.




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 10 декабря 2011 17:05
· Личное сообщение · #13

ELF_7719116 пишет:
Выходит без цикла никак ?! Кул-хакерское решение not present ?

Выложи наконец прогу.. Если тебе это надо... На конкретном примере (вопросе) будет дан конкретный ответ.. Что ты стебаешся?
ELF_7719116 пишет:
Кул-хакерское решение not present ?
Я б тебе его озвучил, да боюсь за мат забанят...

-----
aLL rIGHTS rEVERSED!





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 10 декабря 2011 19:47 · Поправил: PE_Kill
· Личное сообщение · #14

Для байтов:
Code:
  1. MOV EAX,00ABCDEF
  2. MOV ECX,00001234
  3. OR CL,CL
  4. SETNE DL
  5. NEG DL
  6. AND AL,DL
  7. OR CH,CH
  8. SETNE DL
  9. NEG DL
  10. AND AH,DL
  11. BSWAP EAX
  12. BSWAP ECX
  13. OR CL,CL
  14. SETNE DL
  15. NEG DL
  16. AND AL,DL
  17. OR CH,CH
  18. SETNE DL
  19. NEG DL
  20. AND AH,DL
  21. BSWAP EAX
  22. BSWAP ECX

Для полубайтов добавить сдвиги.

-----
Yann Tiersen best and do not fuck





Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 10 декабря 2011 19:59 · Поправил: Dart Sergius
· Личное сообщение · #15

удалено
сори PE_kill поздно заметил ошибку(тестил не на тех числах)




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 10 декабря 2011 20:13
· Личное сообщение · #16

Dart Sergius

eax = 00ABCDEF
ecx = 00001234
Code:
  1.     not eax ; eax: FF543210
  2.     not ecx ; ecx: FFFFEDCB
  3.     xor eax,ecx ; eax: 00ABDFDB
  4.     shr eax,1 ; eax: 0055EFED
  5.     shl eax,1 ; eax: 00ABDFDA
  6.     not eax ; FF542025


-----
Yann Tiersen best and do not fuck




Ранг: 50.0 (постоянный), 31thx
Активность: 0.090.1
Статус: Участник

Создано: 13 декабря 2011 02:27
· Личное сообщение · #17

кодес для полубайтов
Code:
  1. mov ebx,ecx
  2. and ebx,F0F0F0F0
  3. shr ebx,4
  4. add ebx,0F0F0F0F
  5. and ebx,10101010
  6. xchg eax,ebx
  7. mov edi,F
  8. mul edi
  9. and ecx,0F0F0F0F
  10. add ecx,0F0F0F0F
  11. and ecx,10101010
  12. xchg eax,ecx
  13. mul edi
  14. shr eax,4
  15. or eax,ecx
  16. and eax,ebx



 eXeL@B —› Программирование —› БЫСТРО СРЕЗАТЬ БАЙТЫ
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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