На входе имеем количество двойных слов в массиве,сам массив и количество бит для каждого числа. Надо: положить в другой массив разкомпрессированые числа. пример, где в массиве два двойных слова, количество бит для каждого числа 4. на входе: 10001010 10101111 на выходе: 00001000 00001010 00001010 00001111 количество бит может быть любым в пределе от 1 до 31. приоритет - размер кода.
dead_body - ну ты загнул... Тебе надо было тему здесь создавать http://www.wasm.ru/forum/viewforum.php?id=26
не ну вдруг у кого-то есть оптимизированый вариант, или кто-то из спортивного интереса захочет написать. просто я щас свой вариант пишу, так вот интересно, мой будет хуже или лучше. а так задачка вроде простенькая, так что расценю твой пост как шутку.
Код (Text): .386 .model flat,STDCALL include C:\temp\tasm\include\windows.inc extrn ExitProcess:PROC .data size_of_InMassiv dd 2 size_in_bits dd 16 in_massiv db 1,2,4,3 out_massiv dd 4 DUP(?) .code Start: mov esi,[size_of_InMassiv] lea ebx,in_massiv lea edi,out_massiv mov ebp,[size_in_bits] work_on_dword: xor edx,edx mov ecx,32 sub ecx,ebp mov eax,[ebx] repeat_: shr eax,cl mov [edi],eax add edi,4 add edx,ebp cmp edx,32 jz next mov eax,[ebx] push ecx mov ecx,edx shl eax,cl pop ecx jmp repeat_ next: add ebx,4 dec esi jnz work_on_dword push 0 call ExitProcess end Start ;Комментарии ;Пока, нельза давать в качестве размера числа, биты на которые не делиться 32. ;то есть можно давать 2,4,8,16. ;проверок никаких не делаеться, так что если что получаем исключение. ;данная программа изменяет все регистры. ;что надо сделать?: ;вынести всё в отдельную процедуру, проверку параметров ;изменить диапазон вводимых значений размера битов(от 1 до 31). ;оптимизировать.
Код (Text): lea esi,in_massiv lea edi, out_massiv xor edx,edx xor ebx,ebx get_next_dword: mov ecx,size_in_bits get_next_bit: or edx,edx jne @f lodsd dec size_of_InMassiv js exit mov edx,32 @@: sar eax,1 sal ebx,1 dec ecx je get_next_bit xor eax,eax xchg eax,ebx stosb jmp get_next_dword exit: Не проверял, но что-то вроде этого.
asd спасибо, твой пример мне помог. вот код работающий, который у меня получился. Код (Text): .386 .model flat,STDCALL extrn ExitProcess:PROC .data size_of_InMassiv dd 2 in_massiv dd 0FF020403h dd 0EE000911h size_in_bits dd 8 out_massiv dd 80 DUP(?) .code Start: lea esi,in_massiv lea edi,out_massiv xor ecx,ecx mov eax,[esi] process_next_number: mov ebp,[size_in_bits] dec esi xor edx,edx process_next_bit_in_this_dword: shl eax,1 jnc not_set bts edx,ebp not_set: inc ecx cmp ecx,32 jz load_next_dword dword_ready: dec ebp jns process_next_bit_in_this_dword mov [edi],edx add edi,4 jmp process_next_number load_next_dword: dec [size_of_InMassiv] jz end_all add esi,4 mov eax,[esi] xor ecx,ecx jmp dword_ready end_all: mov [edi],edx int 3 call ExitProcess,0 end Start ;Исходный размер получаеться 15373 килобайт.(дебаг) ;размер релиза 8192. ;просто ради интереса, в FASMе размер 2500 килобайт. кто может, переписать это на С?(С++) по идее тут нс С, пару строчек.