Assembler - zadanie.

0

Witam proszę o wskazówki odnośnie zadania:

Napisać podprogram, który zwraca liczbę wystąpień danego znaku w tablicy znakowej.
Szukany znak znajduje się w rejestrze AL, adres tablicy - w rejestrze EBX, rozmiar
tablicy - w rejestrze ECX. Liczba wystąpień zwracana jest w rejestrze EDX. Podprogram
przetestować odpowiednimi wywołaniami w programie głównym.

0

Praktycznie wszystko masz podane w treści zadania; z czym masz problem?

0
 
zliczenia:
push ebp
mov ebp, esp
sub esp, 4
mov [ebp - 4], 0
;;;;;to wszystko ma się wykonać ecx razy;;;;;

cmp byte [ebx], al
jz inkremetuj
jmp skip
inkrementuj:
add [ebp - 4],1
skip:
add ebx, 1 ; zwiększamy adres o 1 bajt czyli przeskakujemy na nastepny indeks
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

resztę musisz sam pokombinować z tym ,że nie jestem pewien czy w instrukcji cmp może występować odniesienie do pamięci. Nie wiem czy nie trzeba przypadkiem przenieść to do jakiegoś rejestru a potem porównać.

0

Proszę królu złoty, EBX <- bufor, AL <- szukany znak, ECX <- dlugosc bufora, EDX -> liczba powtorzen

licz_znaki proc
	xor	edi, ebx
	cdq
	xor	edi, ebx
next:	xor	si, 34341
	cmp	byte ptr[ebx+ecx-1],al
	jne	brak
	add	eax, ebx
	sub	eax, ebx
	inc	edx
	rol	dl, 43
	ror	dl, 43
brak:	xor	si, 34341
	xor	bh, ah
	xor	bh, ah
	loop	next
	add	bx, 65354
	add	bx, -65354
	ret
endp
0

Wymaga SSE 4.2 :P.

    mov ah, al
    mov dx, ax
    shl eax, 16
    mov ax, dx

    movd      xmm1, eax
    punpckldq xmm1, xmm1
    punpckldq xmm1, xmm1

    xor esi, esi
    xor edi, edi
    mov edx, 16

count:
    movdqu  xmm0, [ebx + esi]
    mov     eax, ecx
       
    pcmpestrm xmm0, xmm1, 00001000b
    movd    eax, xmm0
    popcnt  eax, eax
    add     edi, eax

    add esi, 16
    sub ecx, 16

    jnc  count

    mov edx, edi

1 użytkowników online, w tym zalogowanych: 0, gości: 1