Masz 256 różnych bajtów, więc będziesz zliczał zliczał wystąpienia właśnie tylu różnych znaków.
Zakładamy maksymalną liczbę wystąpień jednego znaku, np. 2^32
Deklarujemy tablicę o 256 elementach, każdy element po 32 bity.
tablica dd 256 dup (0)
Teraz jedziesz Roman, jedziesz.. wczytujesz bajt i robisz tak:
xor ebx,ebx
call WczytajBajtZPlikuDoBL ;jakaś funkcja.. ważne, abyś miał bajt w rejestrze BL
mov edx, offset tablica
lea dx, [edx+8*ebx]
inc dword ptr [dx]
I tak do końca pliku.
Można ewentualnie dodać zabezpieczenie gdyby w pliku miało być więcej niż 2^32 tego samego znaku, ale wątpliwe to [4GB to raczej wystarczająca ilość].
Teraz jak już masz histogram to czas na jego narysowanie.
Odpalenie trybu 13h
mov ax,13h
int 10h
I w pętli od 0 do 255 przeczesujesz tablicę w poszukiwaniu elementu maxymalnego i na jego podstawie obliczasz liczbę, przez którą będziesz dzielił każdą z wartości. Potrzebne jest to do skalowania, aby wykres zmieścił się na ekranie. Wartość musi być tak dobrana, aby max wielkość dzielona na wyznaczoną wielość dała max 200 [wysokość ekranu].
Teraz ponownie pętla od 0 do 255 po każdym elemencie tablicy i rysujesz słupki o wysokości {wartość z tablicy}/{skala}.
Rysowanie to mazanie po buforze, który znajduje się od adresu A000:0000 - jeden bajt == jeden pixel.
Z takimi informacjami już bez problemu sobie poradzisz.
Powodzenia