/ 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
Opfølgning, men stadig nok et probl
Fra : Preben Holm


Dato : 11-03-04 20:27

Flg. afsnit viser et compiler output, men jeg har bare lidt svært ved at
forstå hvordan oversættelsen er lavet.

Der bruges som beskrevet tidligere BP til angivelse af private variable,
men hvad er logikken i BP og hvordan bliver den sat. C-output'et sætter
aldrig BP.

Det er jo en DOS-compiler, så går den ud fra DOS har angivet den til en
standard-værdi eller hvad?


Flg. er blot et kodeudsnit:


;   void initSched(struct sPD* pd) {
;   
   assume   cs:_TEXT
_initSched   proc   near
   enter   8,0
   push   si
   mov   si,word ptr [bp+4]
;   
;      short volatile osss, ossp;
;      short volatile sseg;
;      short volatile sptr;
;   
;      pd->ss = 0x0100;
;   
   mov   word ptr [si],256
;   
;      sseg = pd->ss;
;   
   mov   ax,word ptr [si]
   mov   word ptr [bp-6],ax
;   
;   
;      asm {
;       mov AX,SS
;   
   mov    AX,SS
;   
;       mov osss,AX
;   
   mov    [bp-2],AX
;   
;       mov AX,SP
;   
   mov    AX,SP
;   
;       mov ossp,AX
;   
   mov    [bp-4],AX
;   
;       }

 
 
Ivan Johansen (11-03-2004)
Kommentar
Fra : Ivan Johansen


Dato : 11-03-04 21:34

Preben Holm wrote:
> Flg. afsnit viser et compiler output, men jeg har bare lidt svært ved at
> forstå hvordan oversættelsen er lavet.
>
> Der bruges som beskrevet tidligere BP til angivelse af private variable,
> men hvad er logikken i BP og hvordan bliver den sat. C-output'et sætter
> aldrig BP.

Jo, det ses bare ikke så tydeligt. Bemærk instruktionen enter 8,0. Denne
instruktion svarer til følgende:
push BP
mov BP, SP
sub SP, 8

Så her har du skrivningen til BP. De 8 som trækkes fra SP afsætter plads
til dine 4 variabler på stakken.

Ivan Johansen


Ivan Johansen (11-03-2004)
Kommentar
Fra : Ivan Johansen


Dato : 11-03-04 21:38

For øvrigt svarer instruktionen leave til denne sekvens:
mov SP, BP
pop BP

Ivan Johansen

Preben Holm (12-03-2004)
Kommentar
Fra : Preben Holm


Dato : 12-03-04 20:37

> For øvrigt svarer instruktionen leave til denne sekvens:
> mov SP, BP
> pop BP

Ok, undrer mig over hvorfor man har implementeret denne løsning i
mikroprocessoren.. Hmm, jeg ville nu nok lade det være en
compiler-specifik løsning.

Nå, men tak for hjælpen!


Mvh / Preben Holm

Troels Thomsen (15-03-2004)
Kommentar
Fra : Troels Thomsen


Dato : 15-03-04 09:20

>
> Ok, undrer mig over hvorfor man har implementeret denne løsning i
> mikroprocessoren.. Hmm, jeg ville nu nok lade det være en
> compiler-specifik løsning.
>

Gæt : Måske er den single cycle ? Og da det bliver udført meget tit kunne
det have sin berettigelse.

tpt




Ivan Johansen (15-03-2004)
Kommentar
Fra : Ivan Johansen


Dato : 15-03-04 21:56

Troels Thomsen wrote:
> Gæt : Måske er den single cycle ? Og da det bliver udført meget tit kunne
> det have sin berettigelse.

Det er egentlig et udmærket gæt. Jeg har lige prøvet at slå timing for
de forskellige instruktioner op i HelpPC:
PUSH BP: 3 clock cycles
MOV BP,SP: 2 clock cycles
SUB SP,8: 3 clock cycles
ENTER 8,0: 11 clock cycles

Denne timing er for en 286, hvor det ses at der ikke er nogen fordel i
ENTER instruktionen (11 cycles i forhold til 8). Forskellen ser ud til
at bliver endnu større for nyere processorer. Jeg har ikke nogen timing
for 186 hvor der kan være en fordel. Ellers er den eneste fordel at den
fylder mindre i RAM. Jeg har heller aldrig før set ENTER instruktionen
blive brugt.

Ivan Johansen

Byrial Jensen (15-03-2004)
Kommentar
Fra : Byrial Jensen


Dato : 15-03-04 23:10

Ivan Johansen wrote:
> Troels Thomsen wrote:
>
>> Gæt : Måske er den single cycle ? Og da det bliver udført meget tit kunne
>> det have sin berettigelse.

"Leave" er hurtigere på 80186 end "mov sp, bp; pop bp". Forskellen er 8
cycler mod 2 + 10 = 12 cycler. (Læg 4 til værdierne hvis SP er ulige).
Dertil kommer at man sparer 2 instruktionbytes hvilket bl.a. øger
chancen for at kunne lave korte relative hop.

> Det er egentlig et udmærket gæt. Jeg har lige prøvet at slå timing for
> de forskellige instruktioner op i HelpPC:
> PUSH BP: 3 clock cycles
> MOV BP,SP: 2 clock cycles
> SUB SP,8: 3 clock cycles
> ENTER 8,0: 11 clock cycles
>
> Denne timing er for en 286, hvor det ses at der ikke er nogen fordel i
> ENTER instruktionen (11 cycles i forhold til 8). Forskellen ser ud til
> at bliver endnu større for nyere processorer. Jeg har ikke nogen timing
> for 186 hvor der kan være en fordel.

Tallene for 80186 er:

push bp: 10 (14 hvis ulige adresse)
mov bp, sp: 2
sub sp, 8: 4

enter 8,0: 15

Her er "enter" altså en smule hurtigere. Forskellen bliver større hvis
level-argumentet til enter er større end 0.

> Ellers er den eneste fordel at den
> fylder mindre i RAM.

Det er da en også en væsentlig fordel. RAM var dyrt for ca. 18 år siden
da 80186 kom frem.


Preben Holm (19-03-2004)
Kommentar
Fra : Preben Holm


Dato : 19-03-04 22:54

> "Leave" er hurtigere på 80186 end "mov sp, bp; pop bp". Forskellen er 8
> cycler mod 2 + 10 = 12 cycler. (Læg 4 til værdierne hvis SP er ulige).
> Dertil kommer at man sparer 2 instruktionbytes hvilket bl.a. øger
> chancen for at kunne lave korte relative hop.
>
>> Det er egentlig et udmærket gæt. Jeg har lige prøvet at slå timing for
>> de forskellige instruktioner op i HelpPC:
>> PUSH BP: 3 clock cycles
>> MOV BP,SP: 2 clock cycles
>> SUB SP,8: 3 clock cycles
>> ENTER 8,0: 11 clock cycles
>>
>> Denne timing er for en 286, hvor det ses at der ikke er nogen fordel i
>> ENTER instruktionen (11 cycles i forhold til 8). Forskellen ser ud til
>> at bliver endnu større for nyere processorer. Jeg har ikke nogen
>> timing for 186 hvor der kan være en fordel.
>
>
> Tallene for 80186 er:
>
> push bp: 10 (14 hvis ulige adresse)
> mov bp, sp: 2
> sub sp, 8: 4
>
> enter 8,0: 15
>
> Her er "enter" altså en smule hurtigere. Forskellen bliver større hvis
> level-argumentet til enter er større end 0.
>
>> Ellers er den eneste fordel at den fylder mindre i RAM.
>
>
> Det er da en også en væsentlig fordel. RAM var dyrt for ca. 18 år siden
> da 80186 kom frem.
>

Ok, men alting har jo så sin forklaring...

Mange tak for den gode opfølgning. Problemet er btw. løst!!!


Mvh / Preben Holm

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408921
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste