Jeg har et problem jeg har jongleret lidt med, men har ikke kunne løse det.
Jeg sidder og laver et testprogram i Paradigm C++ til en AMD186ER. Det er et lille testprogram der skal teste 186'eres DMA.
Problemet er at jeg skal sætte nogle source og destination registre, og her skal jeg bruge adresserne på det array der skal overføres fra, til det array jeg vil overfører til. Der er 20 adressebits, det vil sige at jeg skal bruge 2 16-bits variabler til at holde adressen.
Hvis jeg har følgende array unsigned int testarr[10]; og de 2 variabler unsigned int highaddr, lowaddr;
Hvordan får jeg så de 4 øverste adresse-bits på testarr[0] til at ligge i highaddr, og de 16 laveste adresse-bits til at ligge i lowaddr?
Har prøvet med &testarr[0], men får fejl i alt det jeg har prøvet.
Dette oversætter: unsigned int testarr[10]; unsigned long T = (unsigned long )&testarr; unsigned int highaddr, lowaddr; lowaddr = (unsigned int )T; highaddr = (unsigned int )(T >> 16); printf("%p %X %X", &testarr[0], highaddr, lowaddr);
Men jeg tvivler på at det virker. Din compiler har sansynligvis en header fil med macro'er til at finde offset og segment fra en pointer.
Fordi en adresse på en 186'er er delt i et segment og et offset. Den fysiske adresse findes med: (segment << 4) + offset. Derfor er der kun 20 bit ud af en (tilsynladende) 32 bit værdi.
Gamle Borland compilere havde: MK_FP FP_SEG og FP_OFF til at oversætte mellem offset/segment og adresse og tilbage.
Jeps, det skal bruges til at finde ud af hvilken 20 bit adresse arrayet ligger på så den kan initialisere DMA overførsel.
Ovenstående virker ikke, det giver kun 0x410 og burde give noget over 0xE0000. Vil det sige at jeg med C++ ikke har nogen mulighed for at finde ud af hvilken adresse en variabel ligger på, for den skal som sagt bruge de 20 bits i source og destination-registre til DMA-overførslen.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.