Когда-то кому-то помогал с решением задачи на ассемблере, формулировка задания была такая:
Дан массив из 5 байт. Рассматривая его как массив из восьми 5-битных слов, посчитать количество слов с четным числом единиц в слове.
Может быть готовое решение пригодится кому-нибудь еще. Комментарии не прописывал, код и так достаточно простой.
;---------------------------------------------------------------
; Задача на применение логических инструкций
;
; Дан массив из 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"
Исходник и скомпилированный файл прилагаются.