Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Assembly: ASM taulukko ropleemi

hsimola [13.02.2004 10:30:28]

#

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;

hsimola [14.02.2004 22:20:14]

#

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;

thefox [21.02.2004 00:31:51]

#

Oletko debugannut koodiasi rivi riviltä huomataksesi missä se jumittaa? Sen verran sekavan näköistä soosia ettei kiinnosta alkaa tuota sen tarkemmin tutkailemaan... :-)

hsimola [15.03.2004 11:28:50]

#

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 ;

thefox [21.03.2004 23:38:09]

#

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.

hsimola [22.03.2004 05:51:19]

#

Oho, niinpäs kävikin.

No sain homman pelaa vihdoinkin. Kiitos.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta