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