/ 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
Interrupt og DS/BP
Fra : Preben Holm


Dato : 07-04-04 16:35

Hej alle

Vi (projekt gruppe) har et problem i vores programmering af
operativsystem systemkald (software interrupt).

Compiler: Borland C++ 1.01
Ingen standard-header's bruges!


Problemet består i, at vi skal have en lokalvariabel i en
interrupt-procedure, det er også fint nok, men når vi går ind i selve
interrupt-rutinen får vi flg. asm-kode:

_systemCall   proc   far
   push   ax
   push   bx
   push   cx
   push   dx
   push   es
   push   ds
   push   si
   push   di
   push   bp
   mov   bp,DGROUP
   mov   ds,bp
   mov   bp,sp
   sub   sp,24

Dvs.
DS = DGROUP <-- operativsystemets data-segment
BP = SP <-- user-processens stack-pointer

Men når lokale variable tilgås anvendes BP-pointeren jo selvfølgelig til
formålet, men desværre har vi jo lige skiftet DS ud til
operativsystemets pointer og nu vil adressen

DS*16 + BP + offset

blive anvendt som lokal variabel! Dvs. nu befinder vi os jo ikke længere
i datasegmentet/stacksegmentet for user-processen, men derimod i
operativsystemets data-område hvor globale variable ligger.

f.eks.

;    d = outregs->dx;
;   
   mov   ax,word ptr [di+6]
   mov   word ptr [bp-8],ax


Dette er ikke særlig smart da ethvert systemkald så vil lave rav i
variablene (og ja, vi er stødt ind i problemet)!

Værre er så, at vi faktisk ændrer AX, BX, CX og DX registrene ved udgang
af interruptet - mærkeligt nok returnerer disse værdier godt nok når vi
anvender flg. asm-kode:


;    asm {
;    mov ax,a;
;   
   mov    ax,[bp-2]
;   
;    mov bx,b;
;   
   mov    bx,[bp-4]
;   
;    mov cx,c;
;   
   mov    cx,[bp-6]
;   
;    mov dx,d;
;   
   mov    dx,[bp-8]
;   
;    mov [BP+16],ax;
;   
   mov    [BP+16],ax
;   
;    mov [BP+14],bx;
;   
   mov    [BP+14],bx
;   
;    mov [BP+12],cx;
;   
   mov    [BP+12],cx
;   
;    mov [BP+10],dx;
;   
   mov    [BP+10],dx
;   
;    }
;   
;   }
;   
   leave   
   pop   di
   pop   si
   pop   ds
   pop   es
   pop   dx
   pop   cx
   pop   bx
   pop   ax
   iret


Nogen der kan forklare hvordan vi skal lave programmet anderledes for at
vi kan anvende variable (lokale) i interrupt-routinen uden at den laver
rav i data-segmentet på operativsystemet!

Og hvorfor returnerer værdierne i registrene egentlig korrekt alligevel
- det forstår jeg slet ikke!

Noget er rigtigt, men et memory-dump viste os i hvert fald at antagelse
med at interruptet overskriver noget af memory giver os store problemer!


Håber på alt den hjælp i kan give

Postet i både dk.teknik.elektronik og dk.edb.programmering.c, da dette
har nær relevans for begge grupper i henhold til at ovenstående bruges
meget til embeddede løsninger!


Mvh / Preben


P.S. Skriv hvis i mangler noget information! Skal være til en fødselsdag
om en halv time så det er skrevet lidt hurtigt!

P.P.S. QuintOS.dk (dvs. indtil videre ligger siden på myservice.dk)
fortæller lidt om projektet, men desværre er den ikke så udviklet endnu,
men det kommer nok en dag!

 
 
Kim Johan Andersson (07-04-2004)
Kommentar
Fra : Kim Johan Andersson


Dato : 07-04-04 17:20


Jeg har lige kigget lidt i et gammelt projekt, jeg have glemt noget, jeg har
ikke roddet med x86 siden...

Preben Holm wrote:

> ... DS*16 + BP + offset

>
> blive anvendt som lokal variabel! Dvs. nu befinder vi os jo ikke længere
> i datasegmentet/stacksegmentet for user-processen, men derimod i
> operativsystemets data-område hvor globale variable ligger.
>

Det er jo også normalt det man vil, interruptet sørger for at alt er som
før...

Hvis i vil have fat i processens dataområde, så er det jo bare at simulere
'leave' ... det er vist noget med SP=BP og pop BP.

Husk at parkere SP til startværdien igen, ellers bliver det nok noget rod
når i går ud af rutinen 8)

Men det kan godt være jeg har glemt noget...

Mvh
Kimjand


Kim Johan Andersson (07-04-2004)
Kommentar
Fra : Kim Johan Andersson


Dato : 07-04-04 17:26

Kim Johan Andersson wrote:

> Det er jo også normalt det man vil, interruptet sørger for at alt er som
> før...
>

Forresten, det er normalt at pass'e parametre til interrupts gennem
cpu-registre... dem kan du jo bare snuppe oppe fra stakken. Hvis du ændrer dem
på stakken bliver de jo spolet tilbage i registrene ved udgang af rutinen.

Mvh
Kimjand


Preben Holm (07-04-2004)
Kommentar
Fra : Preben Holm


Dato : 07-04-04 23:02

Hej


>>... DS*16 + BP + offset
>
>>blive anvendt som lokal variabel! Dvs. nu befinder vi os jo ikke længere
>>i datasegmentet/stacksegmentet for user-processen, men derimod i
>>operativsystemets data-område hvor globale variable ligger.
>>
>
>
> Det er jo også normalt det man vil, interruptet sørger for at alt er som
> før...

Ja, men det er netop det der er problemet. Interruptets lokal-variable
overskriver global-variable i OS'ets DS, og det er et stort problem for os.
Det er jo netop fordi den nupper jo netop user-processens stackpointer
men propper den ned i OS'ets datasegment, og det er jo en gang bæ!

Well, vi vil jo gerne have mulighed for at ændre variable i
styresystemet (helst uden brug af far-pointere), men også uden at fuske
for meget!


> Hvis i vil have fat i processens dataområde, så er det jo bare at simulere
> 'leave' ... det er vist noget med SP=BP og pop BP.

Hmm, ja, men det er bare lidt noget rod, for C-compilere gør jo en masse
mere helt af sig selv, og så er der jo væsentligt mere der skal pop'es
og det kan give en masse rod!


> Husk at parkere SP til startværdien igen, ellers bliver det nok noget rod
> når i går ud af rutinen 8)

Tak for hjælpen, vil overveje hvad der er bedst, men skriv endelig hvis
du/I finder på noget smart


Mvh / Preben

Ivan Johansen (07-04-2004)
Kommentar
Fra : Ivan Johansen


Dato : 07-04-04 17:56

Preben Holm wrote:
> Men når lokale variable tilgås anvendes BP-pointeren jo selvfølgelig til
> formålet, men desværre har vi jo lige skiftet DS ud til
> operativsystemets pointer og nu vil adressen
>
> DS*16 + BP + offset

Jeg tror der er noget i har misforstået. Som default anvendes
stacksegmentet (SS) i forbindelse med stack pointer (SP) og base pointer
(BP).

Det vil sige at for instruktionen
mov ax, [bp-2]
vil den fysiske adresse for den lokale variabel bliver udregnet som
SS*16+BP-2. Hvis man rent faktisk ønsker at bruge datasegmentet (DS)
skrives:
mov ax, ds:[bp-2]

Det samme kan også gøres med CS og ES.

Jeres brug af lokale variabler ser derfor fornuftig nok ud, og jeg kan
ikke se at det skulle overskrive noget forkert. Men det kan være fordi i
bruger et andet register som i tror også henviser til stacken. Alle
andre registre bruger DS som default, bort set fra DI som bruger ES som
default.

Ivan Johansen

Søren (07-04-2004)
Kommentar
Fra : Søren


Dato : 07-04-04 19:35

Hej Preben,


> Vi (projekt gruppe) har et problem i vores programmering af
> operativsystem systemkald (software interrupt).
>
> Compiler: Borland C++ 1.01

Gosh, bruges den stadig ? ;)


> Problemet består i, at vi skal have en lokalvariabel i en
> interrupt-procedure, [...]
>
> Nogen der kan forklare hvordan vi skal lave programmet anderledes for at
> vi kan anvende variable (lokale) i interrupt-routinen uden at den laver
> rav i data-segmentet på operativsystemet!

En prædefineret chunk afsat til en ekstra stack der så switches med kunne
være en løsning... Men "alting" er lettere når man skriver helt nede på
jernet og det er _alt_ for mange år siden, at Borlands C++ ver. 1. blev
smidt ud af min maskine til at jeg tør anvise en præcis metode. (Hvad med
at patche den kompilerede kode i debug ;)


> Og hvorfor returnerer værdierne i registrene egentlig korrekt alligevel
> - det forstår jeg slet ikke!

Magic ;)


> P.S. Skriv hvis i mangler noget information!

Jo tak, hører da gerne lottoresultaterne for de næste par uger :P


--
Venlig hilsen,
Søren
* If it puzzles you dear... Reverse engineer *
LM317-PSU-Designer v1,0b <http://www.ElektronikTeknolog.dk/cgi-bin/LM317/>

Preben Holm (07-04-2004)
Kommentar
Fra : Preben Holm


Dato : 07-04-04 23:07

Hej igen

>>Compiler: Borland C++ 1.01
>
>
> Gosh, bruges den stadig ? ;)

Ja da - den er jo gratis nu om dage

Og sammen med en tasm 1.01 kører skidtet sq godt nok *s* (den er dog
ikke ligefrem gratis selvom den godt kunne være det *gg*)



>>Problemet består i, at vi skal have en lokalvariabel i en
>>interrupt-procedure, [...]
>>
>>Nogen der kan forklare hvordan vi skal lave programmet anderledes for at
>>vi kan anvende variable (lokale) i interrupt-routinen uden at den laver
>>rav i data-segmentet på operativsystemet!
>
>
> En prædefineret chunk afsat til en ekstra stack der så switches med kunne
> være en løsning... Men "alting" er lettere når man skriver helt nede på
> jernet og det er _alt_ for mange år siden, at Borlands C++ ver. 1. blev
> smidt ud af min maskine til at jeg tør anvise en præcis metode. (Hvad med
> at patche den kompilerede kode i debug ;)

Well, jeg synes vi ændrer for meget på koden hele tiden til at patching
vil være en fornuftig løsning, men en specifik stack til interrupt's
kunne måske være en løsning - synes bare det er lidt underligt, at
compileren fucker op i interruptets lokal-variable - mærkeligt at der er
ikke er fundet noget smart der - specielt når den automatisk sørger for
skift af data-segment, så virker det nu noget mærkeligere!


>>Og hvorfor returnerer værdierne i registrene egentlig korrekt alligevel
>>- det forstår jeg slet ikke!
>
> Magic ;)

Hehe, ja, det må det være, for det giver ikke meget mening!


>>P.S. Skriv hvis i mangler noget information!
>
>
> Jo tak, hører da gerne lottoresultaterne for de næste par uger :P

7,9,14,15,18,24,32

Og hvis det er vindertallene for næste uges lotto, kunne det godt ske
jeg blev MEGET negativ over ikke at have spillet *hehe*

Søren (08-04-2004)
Kommentar
Fra : Søren


Dato : 08-04-04 09:04

Hej Preben,


> Ja da - den er jo gratis nu om dage

Der er i hvert fald ingen der vil betale for den ;)


> Og sammen med en tasm 1.01 kører skidtet sq godt nok *s* (den er dog
> ikke ligefrem gratis selvom den godt kunne være det *gg*)

I har da rigtig gang i antikviteterne ;)
Hvorfor ikke bruge MASM så, den _er_ vist gratis (i nogle versioner) ?
Eller en af open source assemblerne ?


> Well, jeg synes vi ændrer for meget på koden hele tiden til at
> patching vil være en fornuftig løsning,

Det var nu heller ikke ment alvorligt.


> men en specifik stack til
> interrupt's kunne måske være en løsning - synes bare det er lidt
> underligt, at compileren fucker op i interruptets lokal-variable -
> mærkeligt at der er ikke er fundet noget smart der - specielt når den
> automatisk sørger for skift af data-segment, så virker det nu noget
> mærkeligere!

Tjaa, måske en "feature" - Ver.1 blev jo heller ikke Den Endelige Lløsning
;P


> 7,9,14,15,18,24,32
>
> Og hvis det er vindertallene for næste uges lotto, kunne det godt ske
> jeg blev MEGET negativ over ikke at have spillet *hehe*

Mee too, for jeg er alt for meget skeptiker til at spille, endda så meget
at jeg tager mig til hovedet når kæresten af og til hiver et skrabelod
frem (men OK, de har vist ikke sandsynlighedsregning på humanoira ;)


--
Venlig hilsen,
Søren
* If it puzzles you dear... Reverse engineer *
LM317-PSU-Designer v1,0b <http://www.ElektronikTeknolog.dk/cgi-bin/LM317/>

Preben Holm (08-04-2004)
Kommentar
Fra : Preben Holm


Dato : 08-04-04 15:53

>Der er i hvert fald ingen der vil
>betale for den ;)
Nej, det er da rigtigt nok!

>> Og sammen med en tasm 1.01 kører
>>skidtet sq godt nok *s* (den er dog
>> ikke ligefrem gratis selvom den
>>godt kunne være det *gg*)
>
>I har da rigtig gang i antikviteterne ;)
>Hvorfor ikke bruge MASM så, den _er_
>vist gratis (i nogle versioner) ?
>Eller en af open source assemblerne ?

Tja, vi skulle i så tilfælde omdøbe filen til tasm for ellers tror
jeg
ikke borland c++ 1.01 vil arbejde sammen med den - men det kan da
godt
være det vil virke? Eller kan man indstille det til sin egen
assembler
på nogen måde?


>> men en specifik stack til
>> interrupt´s kunne måske være en
>>løsning - synes bare det er lidt
>> underligt, at compileren fucker op
>>i interruptets lokal-variable -
>> mærkeligt at der er ikke er fundet
>>noget smart der - specielt når den
>> automatisk sørger for skift af
>>data-segment, så virker det nu noget
>> mærkeligere!
>
>Tjaa, måske en "feature" - Ver.1 blev
>jo heller ikke Den Endelige Lløsning
>;P



>> 7,9,14,15,18,24,32
>>
>> Og hvis det er vindertallene for
>>næste uges lotto, kunne det godt ske
>> jeg blev MEGET negativ over ikke at
>>have spillet *hehe*
>
>Mee too, for jeg er alt for meget
>skeptiker til at spille, endda så meget
>at jeg tager mig til hovedet når
>kæresten af og til hiver et skrabelod
>frem (men OK, de har vist ikke
>sandsynlighedsregning på humanoira ;)

Næh, det er jo ikke ligefrem det der præger dem derude *gg*

Heldigvis er SDU opdelt (groft sagt) i to afdelinger - humaniora og
naturvidenskabelige uddannelser - og det er det jo mere eller mindre
også fysisk: humaniora mod nord og naturvidenskab mod syd *gg*


Mvh / Preben

Søren (08-04-2004)
Kommentar
Fra : Søren


Dato : 08-04-04 18:35

Hej Preben,


> Tja, vi skulle i så tilfælde omdøbe filen til tasm for ellers tror
> jeg
> ikke borland c++ 1.01 vil arbejde sammen med den - men det kan da
> godt
> være det vil virke? Eller kan man indstille det til sin egen
> assembler
> på nogen måde?

Det har jeg aldrig leget med (skidt for sig og snot for sig), men jeg
kunne forestille mig at det ikke lader sig gøre alt for let (om
overhovedet).


> Næh, det er jo ikke ligefrem det der præger dem derude *gg*

Nej, men heldigvis har de andre gode egenskaber at leve på :)


> Heldigvis er SDU opdelt (groft sagt) i to afdelinger - humaniora og
> naturvidenskabelige uddannelser - og det er det jo mere eller mindre
> også fysisk: humaniora mod nord og naturvidenskab mod syd *gg*

Heldigvis ?
Det er da på humanoira at alle sildene flokkes ;)


--
Venlig hilsen,
Søren
* If it puzzles you dear... Reverse engineer *
LM317-PSU-Designer v1,0b <http://www.ElektronikTeknolog.dk/cgi-bin/LM317/>

Preben Holm (08-04-2004)
Kommentar
Fra : Preben Holm


Dato : 08-04-04 19:51

> Det har jeg aldrig leget med (skidt for sig og snot for sig), men jeg
> kunne forestille mig at det ikke lader sig gøre alt for let (om
> overhovedet).

Næh, men det kunne selvfølgelig være lidt sjovt alligevel *gg*


>>Næh, det er jo ikke ligefrem det der præger dem derude *gg*
>
>
> Nej, men heldigvis har de andre gode egenskaber at leve på :)

Jep! Nogle af dem i hvert fald *gg*


>>Heldigvis er SDU opdelt (groft sagt) i to afdelinger - humaniora og
>>naturvidenskabelige uddannelser - og det er det jo mere eller mindre
>>også fysisk: humaniora mod nord og naturvidenskab mod syd *gg*
>
>
> Heldigvis ?
> Det er da på humanoira at alle sildene flokkes ;)

Tjaaa, men medicinerne/biologerne er nu heller ikke ligefrem værst, hvis
jeg nu skal give min ærlige mening til kende!
Mange humaniora'er er da godt nok ikke altid lige helt normale - eller
dvs. man ved jo ikke om de normale humaniora'er er det ene eller det
andet - de afviger jo ikke *gg*!

Søren (13-04-2004)
Kommentar
Fra : Søren


Dato : 13-04-04 22:29

Hej Preben,


> Tjaaa, men medicinerne/biologerne er nu heller ikke ligefrem værst,
> hvis jeg nu skal give min ærlige mening til kende!

Især hvis man vil lege doktor ;) og de burde da have lært
sandsynlighedsregning.


> Mange humaniora'er er da godt nok ikke altid lige helt normale -
> eller dvs. man ved jo ikke om de normale humaniora'er er det ene
> eller det andet - de afviger jo ikke *gg*!

Hmmm, det unormale er nu også mere underholdene at observere :)


--
Venlig hilsen,
Søren
* If it puzzles you dear... Reverse engineer *
LM317-PSU-Designer v1,0b <http://www.ElektronikTeknolog.dk/cgi-bin/LM317/>

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

Månedens bedste
Årets bedste
Sidste års bedste