Задача на применение логических инструкций
Когда-то кому-то помогал с решением задачи на ассемблере, формулировка задания была такая:
Дан массив из 5 байт. Рассматривая его как массив из восьми 5-битных слов, посчитать количество слов с четным числом единиц в слове.
Алгоритм хитровывернутый, комментарии специально не прописывал, чтобы тупая и ленивая школота не смогла объяснить преподу, откуда взялось такое решение и как оно работает.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------------------------
- ; Задача на применение логических инструкций
- ;
- ; Дан массив из 5 байт. Рассматривая его как массив из восьми
- ; 5-битных слов, посчитать количество слов с четным числом
- ; единиц в слове.
- ;
- ; Решение: ManHunter / PCL
- ;---------------------------------------------------------------
- format PE GUI 4.0
- entry start
- include 'win32a.inc'
- ;---------------------------------------------------------------
- section '.data' data readable writeable
- xbytes db 00111000b ; Данные для задачки, взяты с потолка :)
- db 11111110b
- db 01010101b
- db 00001001b
- db 00000110b
- mask db 'Count: %i',13,10,13,10
- db '%i%i%i%i%i - %i%i%i%i%i - %i%i%i%i%i - %i%i%i%i%i',13,10
- db '%i%i%i%i%i - %i%i%i%i%i - %i%i%i%i%i - %i%i%i%i%i',13,10
- db 0
- title db 'Solution',0
- tmp rb 100
- ;---------------------------------------------------------------
- section '.code' code readable executable
- start:
- mov esi,xbytes+4
- loc_1:
- lodsb
- mov ecx,8
- loc_2:
- xor edx,edx
- test al,00000001b
- jz loc_3
- inc edx
- loc_3:
- push edx
- shr al,1
- loop loc_2
- dec esi
- dec esi
- cmp esi,xbytes
- jnb loc_1
- xor eax,eax
- xor esi,esi
- loc_4:
- xor edi,edi
- mov ecx,5
- loc_5:
- add edi,[esp+eax*4]
- inc eax
- loop loc_5
- test edi,edi
- jz loc_6
- test edi,1
- jnz loc_6
- inc esi
- loc_6:
- cmp eax,40
- jb loc_4
- invoke wsprintf,tmp,mask,esi
- add esp,12+(8*5*4)
- invoke MessageBox,HWND_DESKTOP,tmp,title,MB_OK
- invoke ExitProcess,0
- ;---------------------------------------------------------------
- section '.idata' import data readable writeable
- library kernel32,"KERNEL32.DLL",\
- user32,"USER32.DLL"
- include "apia\kernel32.inc"
- include "apia\user32.inc"
Просмотров: 5835 | Комментариев: 3
Метки: Assembler
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(09.04.2014 в 17:01):
Специально для всякой криворукой и ленивой школоты: задачки из ваших лабораторных работ решаются ТОЛЬКО за деньги. Не нравится - валите нахер с этого сайта.
ManHunter
(20.03.2012 в 12:56):
Да, было дело. Старую школу сразу видно :)
Yoshida
(20.03.2012 в 12:55):
Странные метки loc_* - по-моему SOURCER похожие генерировал
Добавить комментарий
Заполните форму для добавления комментария
Комментарии отключены администратором сайта