PDA

View Full Version : [Asm] Int10: dov'è l'errore?


DanieleC88
30-05-2004, 16:32
Sto provando ad usare una modalità VGA nel mio kernel, ma usando questo codice Assembler:
__setmode:
push %ebp
mov (%esp),%ebp
xorb %ah,%ah
movb 4(%ebp),%al /* selected video mode */
int $0x10
pop %ebp
ret
il computer mi si riavvia (o bochs si ferma, ovviamente...).

Dov'è l'errore?

Luc@s
28-06-2004, 20:20
risolto?

AnonimoVeneziano
28-06-2004, 21:47
Originariamente inviato da DanieleC88
Sto provando ad usare una modalità VGA nel mio kernel, ma usando questo codice Assembler:
__setmode:
push %ebp
mov (%esp),%ebp
xorb %ah,%ah
movb 4(%ebp),%al /* selected video mode */
int $0x10
pop %ebp
ret
il computer mi si riavvia (o bochs si ferma, ovviamente...).

Dov'è l'errore?


Mmm vediamo. Una domanda , ma stai tentando di usare la C calling convention??

allora questo :

mov (%esp),%ebp

deve diventare :
mov %esp,%ebp

Altrimenti sposti in EBP il valore puntato da ESP , e non l'indirizzo contenuto in ESP .

Usando :

movb 4(%ebp),%al

Ti non ti stai muovendo 4 byte in basso nello stack come credi , ma invece ti stai muovendo in una locazione a caso nella memoria puntata dal valore contenuto nello stack top nel momento in cui hai fatto :

mov (%esp),%ebp

.

Poi vedi di essere sicuro che in AL finisca proprio il valore riferito al video mode che desideri (quello devi controllarlo tu , dato che qua hai postato solo una piccola porzione di codice ) .

Una domanda .


Che assemblatore usi? GAS ? La sintassi AT&T è un po' sgradevole da vedere :asd:

Ciao e in bocca al lupo!

repne scasb
29-06-2004, 08:14

repne scasb
29-06-2004, 08:22

DanieleC88
29-06-2004, 11:37
Sto programmando in C++, con tutte le limitazioni del caso, e compilo in assembly con GAS (as).

Cmq, ho capito che era veramente il fatto di lavorare in modalità protetta.. dannazione, scrivere un OS è difficile...

Esiste un modo per passare alla modalità reale quando voglio io? È conveniente passare continuamente da una modalità all'altra?

DanieleC88
29-06-2004, 11:38
int386(0x10,&regs,&regs);

Eh... fidati, mi piacerebbe, ma credo che GCC non me lo permetta... :cry:

AnonimoVeneziano
29-06-2004, 11:41
mi ripeto :

prova a mettere

mov %esp,%ebp

al posto di :

mov (%esp),%ebp


Per quanto riguarda il problema del Protected Mode dato che tu stai facendo un kernel dubito che il tuo kernel sia già pronto per settare il Protected Mode , e credo anzi che funzioni ancora il Real Mode (che è la modalità base all' avvio del sistema) , per questo non ci dovrebbero essere particolari problemi (comunque potrei sbagliarmi)

Ciao

AnonimoVeneziano
29-06-2004, 11:47
Originariamente inviato da DanieleC88
Sto programmando in C++, con tutte le limitazioni del caso, e compilo in assembly con GAS (as).

Per Luc@s: ehm, volevo dire 4(%esp), non (%esp)...

Cmq, ho capito che era veramente il fatto di lavorare in modalità protetta.. dannazione, scrivere un OS è difficile...

Esiste un modo per passare alla modalità reale quando voglio io? È conveniente passare continuamente da una modalità all'altra?


La modalità protetta è una modalità particolare , che deve essere setuppata all'avvio dal kernel del sistema operativo.

All' avvio il sistema parte in modalità reale , la modalità reale prevede al massimo un accesso diretto a 1 MB di memoria al massimo tramite indirizzi da 20bit divisi in 2 da 16 bit , ossia SEGMENTO e OFFSET . La modalità protetta del 386 d'altronde permette un accesso fino a 4GB di memoria tramite indirizzi a 32bit , ma necessita , appunto, che il sistema operativo prepari la modalità protetta prima che i programmi siano in grado di utilizzarla .

E' appunto per via di questa preparazione (che credo il tuo kernel ancora non implementi) che presumo che il tuo kernel giri ancora in modalità reale .

Ciao

DanieleC88
29-06-2004, 11:58
Originariamente inviato da AnonimoVeneziano
mi ripeto :

prova a mettere

mov %esp,%ebp

al posto di :

mov (%esp),%ebp


Per quanto riguarda il problema del Protected Mode dato che tu stai facendo un kernel dubito che il tuo kernel sia già pronto per settare il Protected Mode , e credo anzi che funzioni ancora il Real Mode (che è la modalità base all' avvio del sistema) , per questo non ci dovrebbero essere particolari problemi (comunque potrei sbagliarmi)

Ciao

Infatti ti sbagli, il bootloader l'ho copiato e perciò è abbastanza buono: fa tutto lui, abilitazione dell'A20 e PMode. Per questo sto provando a tradurlo in GAS togliendo quello che non mi serve... (nel pmode ci voglio entrare solo *dopo* l'avvio, io...)

Per quanto riguarda quella linea, se noti l'ho già cancellata dal messaggio, visto che avevo sbagliato a scrivere, volevo dire che ora accedo direttamente ad %esp senza nessun altro mov.

P.S.: prima mi sembra tu abbia detto che lo stile AT&T è brutto. Forse si, ma è molto più preciso di quello Intel, a mio parere.

DanieleC88
29-06-2004, 12:02
Originariamente inviato da AnonimoVeneziano
La modalità protetta è una modalità particolare , che deve essere setuppata all'avvio dal kernel del sistema operativo.

All' avvio il sistema parte in modalità reale , la modalità reale prevede al massimo un accesso diretto a 1 MB di memoria al massimo tramite indirizzi da 20bit divisi in 2 da 16 bit , ossia SEGMENTO e OFFSET . La modalità protetta del 386 d'altronde permette un accesso fino a 4GB di memoria tramite indirizzi a 32bit , ma necessita , appunto, che il sistema operativo prepari la modalità protetta prima che i programmi siano in grado di utilizzarla .

E' appunto per via di questa preparazione (che credo il tuo kernel ancora non implementi) che presumo che il tuo kernel giri ancora in modalità reale .

Ciao

Come ho già detto ad AnonimoVeneziano, fa tutto il bootloader, quindi sono già in protected mode.
Dannazione, mi sta venendo il mal di testa...

AVVISO: visto che le informazioni che vi sto dando sono un po' vaghe, se volete potete controllare il bootloader dalla discussione "Un kernel in C++". Presto, infatti, inserirò il codice completo del mio sistema. Naturalmente la parte cruciale è il bootloader, quindi il resto non sarà necessario controllarlo.

AnonimoVeneziano
29-06-2004, 12:03
Ah, pensavo avevi scritto tu tutto , quindi pensavo che la modalità protetta non la implementassi .


La sintassi AT&T sinceramente non la vedo + precisa , quella INTEL a mio parere è + pulita , comunque sono gusti :p

repne scasb
29-06-2004, 12:17

DanieleC88
29-06-2004, 12:28
Hmm, meglio evitare, allora.

a vedere dal tuo nome e dalla tua firma, credo che tu ne capisca di assembler, no? :D

DanieleC88
29-06-2004, 12:35
Originariamente inviato da AnonimoVeneziano
comunque sono gusti :p

Giusto, i gusti so' gusti. Io sono uno GNU dalla testa ai piedi (ma non nel senso che sono un grosso animale peloso con zoccoli e corna). L'unica cosa che uso che non sia GNU è VIM. EMacs è troppo difficile da usare! Apri un file: C-x f. Salva un file: C-x s Chiudi un file: C-x c. È meglio usare semplicemente ":e", ":w" e ":q".

Scusate l'OT.

Luc@s
29-06-2004, 14:56
have a look there (http://www.uv.tietgen.dk/staff/mlha/PC/Prog/asm/int/INT10.htm)

AnonimoVeneziano
29-06-2004, 15:26
Originariamente inviato da DanieleC88
Giusto, i gusti so' gusti. Io sono uno GNU dalla testa ai piedi (ma non nel senso che sono un grosso animale peloso con zoccoli e corna). L'unica cosa che uso che non sia GNU è VIM. EMacs è troppo difficile da usare! Apri un file: C-x f. Salva un file: C-x s Chiudi un file: C-x c. È meglio usare semplicemente ":e", ":w" e ":q".

Scusate l'OT.

IHMO GAS non è un assemblatore adatto per fare programmi direttamente in assembly . NASM è la risposta a questa esigenza , gira su molte piattaforme diverse , ha un controllo degli errori ottimo e supporta parecchi formati di output differenti .

GAS è stato progettato per assemblare l'assembly prodotto dai compilatori, perciò usato in concomitanza con GCC è ottimo (il tuo caso) ma va poco bene per creare progetti completamente in assembly , gira solo sotto UNIX , supporta solo OBJ come output e ha un controllo degli errori abbastanza infimo e criptico (si presume che un compilatore scriva assembly in maniera corretta, quindi perciò non c'è bisogno di un controllo degli errori specifico )

Questo è quello che penso :)

Ciao

DanieleC88
30-06-2004, 22:10
Bel link, Luc@s, sicuramente più chiaro di Ralph Brown... Thanks!

AnonimoVeneziano: ho detto che preferisco GAS, ma è solo perchè quel che faccio io è molto limitato e GAS mi permette di farlo senza problemi. Certamente non disprezzo NASM (fino a poco tempo fa usavo solo quello, fai un po' tu), soprattutto visto che è veramente NetWide come dici tu: c'è dappertutto! E la sintassi Intel è supportata da parecchi compilatori, quindi a volte basta qualche ritocco. Ripeto: non dico che sia inferiore, anzi, ma in questo momento preferisco GAS.