|
| 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
| |
|
|