/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Problem med C kombineret med Assembler
Fra : Kenneth Ahn Jensen


Dato : 18-02-01 13:20

Jeg er ny i C programmering, og har fået et lille problem som jeg ikke
kan få has på.
Programmet skal skrives til en x86 processor.

Jeg skal addere nogle 96 bit tal på en stak, ved at kombinere 3 tal på
hver 32 bit.
Når jeg så har lagt de første 32 bit sammen, kommer der måske en mente
(carry-out), som giver en overflow.
Jeg har læst mig frem til at der er et register i cpu'en som indeholder
nogtle statusbits, deriblandt en CF, carry flag.
Nu kan jeg bare ikke finde ud af hvordan jeg får denne bit lagt over i
en variabel, 'flg'?

Jeg tænkte at jeg ville skyde en linie ind i assembler koden, lige efter
addl operationen, hvor jeg bad den om at kopiere denne bit over i en
variabel, til senere brug...

Nogen gode ideer?

Mvh
Kenneth



 
 
Michael Rasmussen (18-02-2001)
Kommentar
Fra : Michael Rasmussen


Dato : 18-02-01 13:36

adc er din ven, den fungerer som en alm. add, men den lægger en til oveni,
hvis
carry flaget er sat.

--
Michael Rasmussen

"Kenneth Ahn Jensen" <kaj@itu.dk> wrote in message
news:3A8FBDF2.36430DBB@itu.dk...
> Jeg er ny i C programmering, og har fået et lille problem som jeg ikke
> kan få has på.
> Programmet skal skrives til en x86 processor.
>
> Jeg skal addere nogle 96 bit tal på en stak, ved at kombinere 3 tal på
> hver 32 bit.
> Når jeg så har lagt de første 32 bit sammen, kommer der måske en mente
> (carry-out), som giver en overflow.
> Jeg har læst mig frem til at der er et register i cpu'en som indeholder
> nogtle statusbits, deriblandt en CF, carry flag.
> Nu kan jeg bare ikke finde ud af hvordan jeg får denne bit lagt over i
> en variabel, 'flg'?
>
> Jeg tænkte at jeg ville skyde en linie ind i assembler koden, lige efter
> addl operationen, hvor jeg bad den om at kopiere denne bit over i en
> variabel, til senere brug...
>
> Nogen gode ideer?
>
> Mvh
> Kenneth
>
>



Bertel Lund Hansen (18-02-2001)
Kommentar
Fra : Bertel Lund Hansen


Dato : 18-02-01 15:43

Kenneth Ahn Jensen skrev:

>Jeg skal addere nogle 96 bit tal på en stak, ved at kombinere 3 tal på
>hver 32 bit.

Hvis du vil holde koden i C, er det nemmest at splitte tallene op
i 6 16-bits dele. Så kan du lave en C-algoritme med mente og det
hele.

De kan lægges i et array så det hele kan automatiseres.

--
Bertel   http://lundhansen.dk/bertel/
   FIDUSO: http://fiduso.dk/

Dansoft Denmark (19-02-2001)
Kommentar
Fra : Dansoft Denmark


Dato : 19-02-01 09:10


"Kenneth Ahn Jensen" <kaj@itu.dk> wrote in message
news:3A8FBDF2.36430DBB@itu.dk...

> Jeg har læst mig frem til at der er et register i cpu'en som indeholder
> nogtle statusbits, deriblandt en CF, carry flag.
> Nu kan jeg bare ikke finde ud af hvordan jeg får denne bit lagt over i
> en variabel, 'flg'?
>
> Jeg tænkte at jeg ville skyde en linie ind i assembler koden, lige efter
> addl operationen, hvor jeg bad den om at kopiere denne bit over i en
> variabel, til senere brug...

Hej
Med nedenstående assembler kode kan du på en enkel måde kopiere CPU'ens
flagregister, her i blandt Carry Flag, CF over i en variabel som du kan
bruge i dit C program.

void main()
{
char flg;
_asm{
LAHF //loads Flagsreg. into AH
MOV flg,AH
}
flg &= 0x01; // udmask Carry bit
}

Hilsen Torben

E-Mail: dansoft-denmark@dansoft-denmark

URL: http://www.dansoft-denmark.dk


Kenneth Ahn Jensen (20-02-2001)
Kommentar
Fra : Kenneth Ahn Jensen


Dato : 20-02-01 15:22

Dansoft Denmark wrote:

> Hej
> Med nedenstående assembler kode kan du på en enkel måde kopiere CPU'ens
> flagregister, her i blandt Carry Flag, CF over i en variabel som du kan
> bruge i dit C program.

Tak for det.
Jeg prøver om jeg magter det.
Kenneth


Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste