простенькая задачка. на входе дан массив байтов "data9", подсчитать количество одинаковых байтов в "pdata". сократить массив "data9", чтобы остались исключительно разные байты. Код (Text): mov esi, data9 ; in data mov ebp, pdata ; out data mov edx, esi ; save esi @next_data9: mov bl, [esi] xor ecx, ecx test bl, bl jz @exit ; no more data9 mov edi, esi add cl, 1 @loop: mov al, [esi + ecx] cmp bl, al jne @ne ; data9[0] = current data ? add cl, 1 jmp @loop @ne: stc adc esi, ecx add byte [ebp], cl ; add edi, 1 ; xor cl, cl mov [edi], al ; cmp al, 0 jnz @loop add edx, 1 add ebp, 1 mov esi, edx jmp @next_data9 ; next @exit: align 8 data9 db 1, 1, 1, 4, 5, 1, 3, 5, 7, 0 align 8 pdata db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 P.S. оптимизация по скорости, и хорошо бы, количеству итераций P.P.S. освобождение регистра тоже полезно будет )
t00xЧуть изменю условие: на выходе будет массив rdata со структурой символ:сколько раз встретился Код (Text): .data data9 db 1, 1, 1, 4, 5, 1, 3, 5, 7, 0 pdata db 512 dup (0) rdata db 512 dup (0) .code xor eax,eax mov edi,offset pdata mov esi,offset data9 mov ebx,offset rdata a1: mov al,[esi] add esi,1 test al,al jz exit add byte ptr[edi+eax*2+1],1 mov [edi+eax*2],al jmp a1 exit: mov ecx,256 a2: mov ax,[edi] add edi,2 test al,al jz a3 mov [ebx],ax add ebx,2 a3: sub ecx,1 jnz a2
Novi4ek Напрасно смеетесь, полученный массив это транспонированная матрица (Nx2) привести ее к нормальному (требуемому) виду т.е. (2xN) не сложно: Код (Text): .data mas db dup (N*2); исходная матрица _mas db dup (N*2); транспонированная матрица .code mov esi,N m1: mov ax,mas[esi*2] mov _mas[esi],al mov _mas[esi+N],ah sub esi,1 jnz m1 P.S. в зависимости от N цикл можно развернуть