PDA

Visualizza la versione completa : [ASSEMBLY] Tradurre COM in EXE


monkeyadventure
09-11-2005, 12:39
Qualcuno mi sa spiegare come tradurre questo sorgente di un file *.com in uno *.exe?

Schermo_colorato.COM:


MAIN SEGMENT
ASSUME CS:MAIN,DS:MAIN,SS:MAIN,ES:MAIN
ORG 100h
START:
MOV AX,0A000h
MOV ES,AX

MOV AX,0013h
INT 10h

MOV AL,03
XOR DI,DI
MOV CX,64000
REP STOSB

XOR AX,AX
INT 16h

MOV AX,0003h
INT 10h

INT 20h
MAIN ENDS
END START


IO ho provato così:

Schermo_colorato.EXE


.MODEL small
.STACK 100h

.CODE
START:
MOV AX,0A000h
MOV ES,AX

MOV AX,0013h
INT 10h

MOV AL,03
XOR DI,DI
MOV CX,64000
REP STOSB

XOR AX,AX
INT 16h

MOV AX,0003h
INT 10h

MOV AH,4CH
INT 21h
END START


Il file .com funziona perfettamente, cioè passa in modalità grafica, colora lo schermo, attende un tasto e torna alla modalità testo,il .exe invece non mi cambia modalità grafica e si limita a visualizzare il prompt per la pressione di un tasto.
Non so proprio che fare, forse è un problema di segmenti..? :bhò:

oregon
09-11-2005, 14:37
Il formato di un file Exe è piu' complesso perche' prevede delle informazioni in piu' dedicate alla possibilita' di rilocare in memoria il codice.

*Non puoi* rinominare semplicemente il file com, ma devi farlo fare ad un tool apposito.

da questa pagina

http://www.ericphelps.com/favorites/utilities.html

mi sembra che si possa scaricare un tool del genere (c2e) ma non l'ho mai provato ...

monkeyadventure
09-11-2005, 19:09
Ma io non ho mai parlato di RINOMINARE il file.com in file.exe! Chiedevo appunto che modifiche dovevo apporate al sorgente per poi compilare il tutto come eseguibile .exe con TASM. Mi interessava sapere come modificare le istruzioni per adattarle al formato .exe, ecco.

monkeyadventure
10-11-2005, 10:49
Mi correggo, anche il secondo listato in effetti funziona, almeno come l'ho scritto qui. Il problema è quando aggiungo all'inizio del sorgente la direttiva ".386" per poter utilizzare i registri a 32 bit(eax, ebx..): la compilazione e il linkaggio vano lisci, ma al momento dell'esecuzione non funziona correttamente, come ho detto nel primo post.
Eppure io sto proprio utilizzando un 386 portatile(no, non adesso!).. forse l'emulazione di un 386 non funziona se la si utilizza proprio su un 386? :) Mi servono proprio quei registri a 32 bit!

Paulin
10-11-2005, 13:15
.MODEL small
.STACK 100h

.CODE
START:
MOV AX,0A000h
MOV ES,AX

MOV AX,0013h
INT 10h

MOV AL,03
XOR DI,DI
MOV CX,64000
REP STOSB

XOR AX,AX
INT 16h

MOV AX,0003h
INT 10h

MOV AH,4CH
INT 21h
END START
Ho assemblato il tuo codice con tasm e l'applicativo.exe funziona perfettamente. colora lo schermo e ritorna dopo la pressione del tasto.

Perché ti servono i registri a 32 bit?

monkeyadventure
13-11-2005, 15:41
I 32bit mi servivano per una questione di velocità: utilizzando il registro eax posso per esempio caricare 4 byte in memoria video alla volta invece che 2 byte alla volta se utilizzo il registro ax, il che si traduce in una routine con velocità praticamente DOPPIA. Il sorgente che avevo allegato funzionava correttamente anche a me, il problema sorgeva quando aggiungevo all'inizio del listato la riga
.386
che da quello che ho capito serve per poter utilizzare i registri a 32bit tipo eax, che sono stati introdotti appunto a partire dalla serie di microprocessori 386(ed io ho proprio montato un 386 nel computer col quale faccio e avvio questo programmino). Il sorgente potrebbe essere riscritto così(ed è quello che appunto a me non funziona!)


.386
.MODEL small
.STACK 100h

.CODE
START:
MOV AX,0A000h
MOV ES,AX

MOV AX,0013h
INT 10h

MOV EAX,03030303h
XOR DI,DI
MOV CX,16000
REP STOSD

XOR AX,AX
INT 16h

MOV AX,0003h
INT 10h

MOV AH,4CH
INT 21h
END START

Come avevo detto all'inizio, quando avvio l'eseguibile il sistema non passa alla modalità grafica, non si colora lo schermo, ma si limita ad attendere la pressione del tasto ed esce. Mi chiedo cosa ci sia di sbagliato nel codice...

Paulin
14-11-2005, 11:18
Ho provato a compilarlo per la modalità protetta con tasm32, ma mi crea un conflitto al momento dell'esecuzione. Non ho avuto tempo di vederci chiaro, comunque ho inizializzato così:

.386
.MODEL FLAT, STDCALL

.CODE
START:
; ...eccetera, eccetera...
END START

Se trovi la solizione postala, potrebbe interessare.

monkeyadventure
14-11-2005, 14:54
Ehm.. io ho aperto questa discussione proprio perchè non la trovavo. :) Quindi:

Se QUALCUNO trova la soluzione la posti, potrebbe interessare(a me). :ciauz:

Io continuo a cercare..

oregon
14-11-2005, 15:10
A parte il fatto che mi sembra che il titolo di questo post debba essere cambiato (non devi tradurre nulla ... semmai devi utilizzare i registri a 32 bit nel tuo codice ...), vorrei capire in quale modalita' esegui il codice (che sia COM o EXE) ...

Lo fai in una finestra DOS ?

monkeyadventure
14-11-2005, 15:20
Sì, il titolo andrebbe cambiato.
Ti spiego: io sto utilizzando questi programmi su di un 386 portatile, avviato in modalità DOS da floppy(perchè l'hard disk non funziona). Utilizzo la versione del DOS contenuta in windows 98.
Il problema credo sia proprio nel codice, non nella configurazione.

Loading