Есть битовая матрица Код (Text): ABCDE FGHIJ KLMNO PQRST UVWXY которая хранится в регистре в виде 0000000ABCDEFGHIJKLMNOPQRSTUVWXY. Необходимо повернуть эту матрицу вокруг диагонали AY, то есть получить матрицу Код (Text): AFKPU BGLQV CHMRW DINSX EJOTY которая в регистре хранится как 0000000AFKPUBGLQVCHMRWDINSXEJOTY. 1) оптимизировать по размеру. 2) оптимизировать по размеру не используя команд переходов. Подсказка: нужно поискать по форуму константу 8040201, хотя может со сдвигами и короче будет. Регистр, в котором будет матрица, выбираете по своему вкусу, результат записываете в него же.
Black_mirror не знаю насколько красиво и коротко, но мне пришло в голову такое решение: Код (Text): .code start: invoke MessageBox, 0,addr text1,addr text3,0 mov ebx,6 mov ecx,25 xor esi,esi a1: mov eax,esi xor edx,edx div ebx test edx,edx setz al sub max,al lea edi,text2[esi+edx*4] cmp dl,max setb dl dec edx and edx,24 sub edi,edx mov al,text1[esi] stosb inc esi loop a1 invoke MessageBox,0,addr text2,addr text3,0 retn .data max db 6 text1 db 'ABCDEFGHIJKLMNOPQRSTUVWXY',0 text2 db 26 dup (0) text3 db 'matrix',0
Mikl__ Здесь не байты нужно переставлять, а биты внутри 32х разрядного регистра. Есть в регистре находится 0000000 11110 00000 11100 00000 01111, то после перестановки должно быть 0000000 10100 10101 10101 10001 00001
Black_mirror извини, я думал, требуется транспонировать матрицу вокруг оси AY ABCDE AFKPU FGHIJ BGLQV KLMNO в CHMRW PQRST DINSX UVWXY EJOTY
Учим матчасть, это называется транспонировать. В общем случае решается элементарно, типа Swap(A[i,j], A[j.i]). Специфика тут только в том, что элементы матрицы - биты. Я решал похожую задачу просто, по черному, написал две подпрограммы типа GetBit(i,j) и SetBit(i,j) и вызывал их вместо операторов присваивания.
Black_mirror "Мелкие задачки для крупных мозгов 2" ? Сдвигами. Размер 0x5b Код (Text): push eax push eax push eax push eax push eax push eax push eax push eax mov esi,1000001000001000001000001b and eax,esi shr esi,5 pop edx and edx,esi rol edx,4 or eax,edx pop edx ror edx,4 and edx,esi or eax,edx shr esi,5 pop edx and edx,esi rol edx,8 or eax,edx pop edx ror edx,8 and edx,esi or eax,edx shr esi,5 pop edx and edx,esi rol edx,12 or eax,edx pop edx ror edx,12 and edx,esi or eax,edx shr esi,5 pop edx and edx,esi rol edx,16 or eax,edx pop edx ror edx,16 and edx,esi or eax,edx
Код (Text): 00000000 B9 01084210 mov ecx,1000010000100001000010000b 00000005 BA 00011111 mov edx,10001000100010001b 0000000A 33 DB xor ebx,ebx 0000000C B3 1F mov bl,11111b 0000000E C1 E3 14 shl ebx,5*4 ;1 00000011 8B F0 mov esi,eax 00000013 23 C1 and eax,ecx 00000015 0F AF C2 imul eax,edx 00000018 23 C3 and eax,ebx 0000001A 8B F8 mov edi,eax 0000001C D1 E9 shr ecx,1 0000001E D1 E2 shl edx,1 ;2 00000020 8B C6 mov eax,esi 00000022 23 C1 and eax,ecx 00000024 0F AF C2 imul eax,edx 00000027 23 C3 and eax,ebx 00000029 C1 E8 05 shr eax,5*1 0000002C 0B F8 or edi,eax 0000002E D1 E9 shr ecx,1 00000030 D1 E2 shl edx,1 ;3 00000032 8B C6 mov eax,esi 00000034 23 C1 and eax,ecx 00000036 0F AF C2 imul eax,edx 00000039 23 C3 and eax,ebx 0000003B C1 E8 0A shr eax,5*2 0000003E 0B F8 or edi,eax 00000040 D1 E9 shr ecx,1 00000042 D1 E2 shl edx,1 ;4 00000044 8B C6 mov eax,esi 00000046 23 C1 and eax,ecx 00000048 0F AF C2 imul eax,edx 0000004B 23 C3 and eax,ebx 0000004D C1 E8 0F shr eax,5*3 00000050 0B C7 or eax,edi 00000052 D1 E9 shr ecx,1 00000054 D1 E2 shl edx,1 ;5 00000056 23 F1 and esi,ecx 00000058 0F AF F2 imul esi,edx 0000005B 23 F3 and esi,ebx 0000005D C1 EE 14 shr esi,5*4 00000060 0B C6 or eax,esi 00000062 Задачу выгодно решать в цикле, но в условии - никаких переходов. Адд: Иcправил ошибку.
_basmp_ Тут две задачки 1) оптимизировать по размеру. 2) оптимизировать по размеру не используя команд переходов. В задаче нужно обменять биты 23-19, 17-13, 11-7, 5-1 (разность - 4) 22-14, 16-8,10-2 (разность - 8) 21-9,15-3 (разность - 12) 20-4 (разность - 16) Вот код(неоптимизировался) который обменивает биты по принципу T=A^B A^=T B^=T: Код (Text): 00402000 6BD810 imul ebx,eax,00000010 00402003 6BCB10 imul ecx,ebx,00000010 00402006 6BD110 imul edx,ecx,00000010 00402009 6BF210 imul esi,edx,00000010 0040200C 31C3 xor ebx,eax 0040200E 31C1 xor ecx,eax 00402010 31C2 xor edx,eax 00402012 31C6 xor esi,eax 00402014 81E320088200 and ebx,00820820 0040201A 81E100044100 and ecx,00410400 00402020 81E200802000 and edx,00208000 00402026 81E600001000 and esi,00100000 0040202C 31D8 xor eax,ebx 0040202E 31C8 xor eax,ecx 00402030 31D0 xor eax,edx 00402032 31F0 xor eax,esi 00402034 C1EB04 shr ebx,04 00402037 C1E908 shr ecx,08 0040203A C1EA0C shr edx,0C 0040203D C1EE10 shr esi,10 00402040 31D8 xor eax,ebx 00402042 31C8 xor eax,ecx 00402044 31D0 xor eax,edx 00402046 31F0 xor eax,esi
Для 4x4 Вариант 1 Код (Text): mov ax,????????????????b mov cx,16 mov bx,1 mov di,bx xor dx,dx CYCLE: shr ax,1 jnc CONT or dx,bx CONT: shl bx,4 jnz CONT2 shl di,1 or bx,di CONT2: loop cycle Вариант 2 Код (Text): mov ax,????????????????b mov bx,1 mov cx,bx xor dx,dx CYCLE: shr ax,1 jnc CONT or dx,bx CONT: jz END shl bx,4 jnz CYCLE shl cx,1 or bx,cx jmp CYCLE END: