/ 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
Variable i C og inline assembly!!!
Fra : Preben Holm


Dato : 10-03-04 18:32

Hej

hvordan anvendes variable direkte i inline assembler-kode.

F.eks. har vi flg. kode:

short osss, ossp;


asm {
mov AX, osss
mov SS, AX

mov AX, 100h
mov SS, AX
mov AX, 0FFh
mov SP, AX

....

mov AX, SS
mov osss, AX
}


der går helt klart noget galt i ovenstående eksempel, men hvad det egentlig
er der er galt tør vi da ikke sige.

Vi har diskuteret lidt om det skyldes, at variablene er lokaliseret på
stakken og ved ændring af dette stack-segment så ikke kan referere til disse
variable igen, men for at sige det mildt er vi lidt blanke her.

Hvordan kan vi ændre stack-segmentet i assembler-koden men stadig kunne
referere til variablene. (data-segment ønskes også ændret senere...)


Mvh / Preben Holm (QuintOS teamet)

 
 
Niels Dybdahl (10-03-2004)
Kommentar
Fra : Niels Dybdahl


Dato : 10-03-04 21:48

> Vi har diskuteret lidt om det skyldes, at variablene er lokaliseret på
> stakken og ved ændring af dette stack-segment så ikke kan referere til
disse
> variable igen

Sandsynligvis korrekt. Det fremgår dog ikke klart at variablerne ligger på
stakken.
Der skal være meget tungtvejende grunde til at ændre SS og SP

> Hvordan kan vi ændre stack-segmentet i assembler-koden men stadig kunne
> referere til variablene. (data-segment ønskes også ændret senere...)

En mulighed er at placere alle relevante variable i datasegmentet (globalt)
og sætte ES til at pege på det samme som DS stod på. Men om det kan laves
inline i C ved jeg ikke.

Niels Dybdahl



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


Dato : 11-03-04 18:54

>>Vi har diskuteret lidt om det skyldes, at variablene er lokaliseret på
>>stakken og ved ændring af dette stack-segment så ikke kan referere til
>
> disse
>
>>variable igen
>
>
> Sandsynligvis korrekt. Det fremgår dog ikke klart at variablerne ligger på
> stakken.
> Der skal være meget tungtvejende grunde til at ændre SS og SP

Er Context-switch ved kodning af mini-operativsystem en god nok grund!

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


Dato : 11-03-04 18:59

Hej igen,

lige et tillægsspørgsmål:

Så vidt vi kan se sættes BP aldrig i program-koden, men alligevel bruger
C basepointeren til at referere til lokale variable (Borland Turbo C++
1.01).

Dvs. [BP-2] er f.eks. sådan en variabel bliver oversat til assembler!
Men hvis BP aldrig sættes må processoren vel selv sætte den. Sættes den
når der bruges f.eks. call-instruktioner?


Mvh / Preben Holm

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


Dato : 11-03-04 19:24

Preben Holm wrote:
> Så vidt vi kan se sættes BP aldrig i program-koden, men alligevel bruger
> C basepointeren til at referere til lokale variable (Borland Turbo C++
> 1.01).

Det lyder underligt og jeg tror at du skal kontrollere det en ekstra
gang. Normalt starter en funktion med:
push BP
mov BP, SP

Og den slutter med:
pop BP

Ivan Johansen

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


Dato : 11-03-04 22:31

>> Så vidt vi kan se sættes BP aldrig i program-koden, men alligevel
>> bruger C basepointeren til at referere til lokale variable (Borland
>> Turbo C++ 1.01).
>
>
> Det lyder underligt og jeg tror at du skal kontrollere det en ekstra
> gang. Normalt starter en funktion med:
> push BP
> mov BP, SP
>
> Og den slutter med:
> pop BP

Jeg har kørt

tcc -1 -2- -ms -S quintos.c

hvorefter jeg har en fil indeholden (copy-paste):
-----------------------------------------------------------------

;   
;   void initSched(struct sPD* pd) {
;   
   assume   cs:_TEXT
_initSched   proc   near
   enter   14,0
   push   si
   mov   si,word ptr [bp+4]
;   
;    volatile short *segments;
;    volatile short segm[4];
;    volatile short osss, ossp; //volatile
;    volatile short sseg;
;    volatile short sptr;
;   
;    segments = &segm;
;   
   lea   ax,word ptr [bp-10]
   mov   word ptr [bp-2],ax
;   
;   
;    pd->ss = 0x0100;
;   
   mov   word ptr [si],256


......


;   
;    pd->sp = sptr;
;   
   mov   ax,word ptr [bp-14]
   mov   word ptr [si+2],ax
;   
;   }
;   
   pop   si
   leave   
   ret   
_initSched   endp

------------------------------------------------------------------

(BEMÆRK: Filen er ændret siden sidste post, derfor andre "BP +/-" værdier)



Funktionen bliver kaldt fra:

;    initSched(&que);
;   
   lea   ax,word ptr [bp-6]
   push   ax
   call   near ptr _initSched
   pop   cx





og toppen af hele asm-filen ser således ud:

-----------------------------------------------------------------
   .286p
   ifndef   ??version
?debug   macro
   endm
$comm   macro   name,dist,size,count
   comm   dist name:BYTE:count*size
   endm
   else
$comm   macro   name,dist,size,count
   comm   dist name[size]:BYTE:count
   endm
   endif
   ?debug   S "quintos.c"
   ?debug   C E90EB26B30097175696E746F732E63
_TEXT   segment byte public 'CODE'
_TEXT   ends
DGROUP   group   _DATA,_BSS
   assume   cs:_TEXT,ds:DGROUP
_DATA   segment word public 'DATA'
d@   label   byte
d@w   label   word
_DATA   ends
_BSS   segment word public 'BSS'
b@   label   byte
b@w   label   word
_BSS   ends
_DATA   segment word public 'DATA'
___BRKLVL   label   word
   db   0
   db   16
   db   0
   db   0
   db   0
   db   0
   db   0
   db   0
_DATA   ends
_TEXT   segment byte public 'CODE'
----------------------------------------------------------------


men en anden ting er så om jeg kan stole på dette output, for angiveligt
beder jeg jo om 186-output og ikke 286p output, men det er hvad der er
angivet i asm-filen :(


Håber du kan hjælpe :)

Det underlige er, at det er den eneste funktion, hvor BP ikke bliver
push'et på stack'en (udover main-funktionen)

Funktionen installTimer startes som du også skriver:
_installTimer   proc   near
   push   bp
   mov   bp,sp


det samme med setvect:
_setvect   proc   near
   push   bp
   mov   bp,sp

og alle de andre ... men ikke lige der hvor problemet er.


Mvh / Preben

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

Månedens bedste
Årets bedste
Sidste års bedste