Voisiko joku muokata ton koodiin niin ettei se laskisi noista laskurin arvoista erotusta.
Erotuksen sijaan sen pitäisi vain tallentaa kohdissa "LUE LASKURI" laskurin arvo tauluun ja samalla tietenkin siirtyä seuraavaan taulun indeksiin.
Eli laskurin lukemia tallennettaisiin taulukkoon niin kauan kun tuo silmukka on täyttynyt.
Kiitos etukäteen.
var silmukka : dword; taulukko : array [0..2000] of int64; //********************************* procedure TForm1.ASSY; begin asm pushf push edi push edx push ecx push ebx mov ecx,[silmukka] cmp ecx,0 jne @xxx inc ecx //********************************** @xxx: TEE JOTAIN jc @xxx //********************************** mov ebx,edx LUE LASKURI PUSH EDX PUSH EAX mov edx,ebx //********************************** @sss: TEE JOTAIN jc @sss //********************************** mov ebx,edx LUE LASKURI stosd mov eax,edx stosd pop eax pop edx sub dword [edi-8],eax sbb dword [edi-4],edx mov edx,ebx //------------------ loop @XXX pop ebx pop ecx pop edx pop edi popf end; //*************************************** end;
Tässä hieman täsmennystä ja mitä sain jo aikaiseksi,mutta vielä pikku probleema :
Miten koodi pitäisi muokata jotta se kasvattaisi joka kierrolla tuon m_sek taulukon indeksiä ???
Nyt tuo pyörähtää kerran ja jää jumiin....
asm pushf push ecx mov dx,$3f8 //COM1 COM2 COM3 COM4 ? add dx,6 mov ecx,[silmukka] cmp ecx,0 jne @xxx inc ecx //MMMMMMMMMMMMMMMMMMMMMMMMMMMM //MMMMMMMMMMMMMMMMMMMMMMMMMMMM //============================ 1 tila @xxx: Odota ESC painoa jc @xxx //============================ lue laskuri (tämä tallentaa lukeman eax:ään) mov dword[m_sek],eax //============================ 0 tila @sss: Odota ESC painoa jnc @sss //============================ 1 tila loop @xxx @ende: pop ecx popf end; end;
Oletko debugannut koodiasi rivi riviltä huomataksesi missä se jumittaa? Sen verran sekavan näköistä soosia ettei kiinnosta alkaa tuota sen tarkemmin tutkailemaan... :-)
Tässä yksinkertaistettuna mitä haen....
Timerlo on dword taulukko. Delphi Inline ASM:a.
@sss2:
mov dword[timerlo],eax
Millä tässä kasvatettaisiin timerlo indeksiä ?
jmp @sss2
Suurinpiirtein seuraavanlainen tarvis ASM:lla saada aikaiseksi :
Repeat TimerLo := value ; i := i + 1; // tämä pitäis saada tohon ASM koodiin Until keypressed ;
Heh, tämäpäs hassua. Ensin postasit tuon saman pätkän mureakuhaan ilman kooditageja ja se luuli tuon koodisi [ i ] kohtaa kursivoinnin aloitustagiksi. Sitten kopsasit tuon pätkän suoraan mureakuhasta ja nyt siinä ei tietenkään ole sitä [ i ]:tä ollenkaan...
Mutta tuo indeksointi kannattaisi kyllä tehdä ihan rekisteriä käyttäen, ei muistissa olevaa muuttujaa. Eli siis jotenkin näin (en tiedä Delphin inline asmin tarkasta syntaksista):
xor ebx, ebx ; nollataan ebx @sss2: mov timerlo[ebx], eax add ebx, 4 ; dword on nelitavuinen jmp @sss2
Tuollaisenaan tuo koodi looppaa tietysti loputtomasti.
Oho, niinpäs kävikin.
No sain homman pelaa vihdoinkin. Kiitos.
Aihe on jo aika vanha, joten et voi enää vastata siihen.