Witam

Chcial bym sie doswiedziec jak to jest z ta kolejka rozkazow tzw. prefech queue, kiedy jest napelniana,kiedy oprozniana. Czytalem cos na ten temat i dowiedzialem sie ze kolejka jest oprozniana podczas skokow tylko teraz nie wiema jaki to ma byc skok czy wystarczy krotki, a moze powinien byc bliski, lub daleki, czy ma to byc skok w przod czy w tyl, a moze jest to bez znaczenia? Gdyby wystarczajacym okazal sie skok korki, to czy odpowiednia bedzie konstrukcja typu jmp +0 a moze raczej skok w przypadku kolejki dlugosci 16 bajtow powinien byc jmp +17 tak by nie trafil na instrukcje w kolejce? (nie wiem czy to tak dziala, to tylko moje przypusczenie).

Teraz napelnianie wyczytalem ze kolejka jest dopelniana gdy aktualnie wykonywany rozkaz nie wymaga dostepu do magistral wowczas uklad zarzadzania magistralami BIU majac "chwile wolnego" dopelnia kolejke automatycznie jesli sa w niej wolne chocby 2 bajty.
Zalozmy ze kolejka jest niemal pusta a dokladniej znajduje sie w niej tylko jeden jedyny rozkaz ktory nie wymaga dostepu do magistral np. niech bedzie to 'mul eax'
Czy w takim przypadku kolejka zostanie napelniona do pelna? Czy ilosc bajtow doczytywanych do kolejki zalezy od dlugosci trwania aktualnie wykonywanego rozkazu tu 'mul eax'?

Zadaje wszystkie te pytania bo mam problem z takim kawalkiem kodu

		(...)
                  mov ecx, count
                  nop
                  nop
                  nop
                  jmp flush				;uniewaznianie kolejki rozkazow
           flush:
                  rep movsw
                  push word ptr eax
                  push ebx
                 retf 
 

instrukcja rep movsw nadpisuje w pamieci caly kod przed soba, nadpisuje sama siebie, wkoncu nadpisuje rozkazy push i instrukcje dalekiego powrotu retf.
Prosil bym o rade jak to zmodyfikowac powyzszy kod aby instrukcja powrotu wykonywala sie zawsze. Teraz kod dziala poprawnie tylko jesli dobiore doswiadczalnie ilosc rozkazow 'nop' przed skokiem 'jmp flush' oraz typ rozkazu movsb, movsw, movsd (jak sie okazalo to tez ma znaczenie, aczkolwiek sumaryczna ilosc bajtow kopiowanych przez rozkaz MOVSx jest zawsze taka sama - dokonuje odpowiednich modyfikacji ecx, adekwatnie do rozkazu).

Wszystko zachowuje sie tak jak gdyby chodzilo o wyrowanie rozkazow w pamieci do wielokrotnosci pewnjej liczby.

Prosze o rady, spostrzezenia
(W miedzyczasie bede eksperymentowal na wlasna reke, jesli czegos sie dowiem to na pewno umieszcze odpowiedz na forum, barzo zalezy mi na czasie dlatego rownolegle postanowilem zadac to pytanie w tym miejscu)

Pozdrawiam