Задача на применение логических инструкций

Когда-то кому-то помогал с решением задачи на ассемблере, формулировка задания была такая:
Дан массив из 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"

Исходник и скомпилированный файл прилагаются.
Теги:
логические инструкции
Добавлено: 10 Апреля 2018 20:37:55 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...