View Full Version : File .obj con Visual C++
Salve a tutti
in un progetto che sto portando avanti per la tesi di laurea, ho bisogno di utilizzare delle routines per pilotare una vecchia scheda DSP (Dalanco Spry Model 250 ISA, basata su DSP TMS320C25, qualcuno la conosce?)
Queste routines sono presenti, come file forniti con la scheda, sottoforma di file.ASM (asselmber), oppure come file .obj.
Come faccio " a dire" al compilatore di visual c++ che le funzioni sono definite nei file .obj?
Ovviamente se le aggiungo al progetto in corso, allega i file sotto la voce risorse.
Help!
boh, prova a linkarlo con pragma comment :p
boh, prova a linkarlo con pragma comment :p
ops, scusa l'ignoranza.....
cos'è pragma comment?
non hai mai linkato un lib in un tuo programma? non hai presente quando fai
#pragma comment(lib, "nomefile")
?
non hai mai linkato un lib in un tuo programma? non hai presente quando fai
#pragma comment(lib, "nomefile")
?
hai ragione, forse ho dato l'impressione di essere un veterano della programmazione....
in effetti però smanetto col vc++ da quasi un mese.... :cry:
scusa, ma facendo così includo automaticamente il file obj, con tutte le funzioni incluse?
GordonFreeman
12-12-2005, 21:32
scusate ma perchè non gli spiegate il modo più semplice? :)
invece di usare i pragma comment vai nel menù
Project/Add to Project/Files...
e scegli il file .obj
in questo modo,quando compili, il linker troverà le funzioni nel file .obj che sono dichiarate nel file header associato al file obj
EDIT : questo funziona di sicuro con i file LIB,non ho mai provato con gli OBJ,ma suppongo funzi
GordonFreeman
12-12-2005, 21:42
hai ragione, forse ho dato l'impressione di essere un veterano della programmazione....
in effetti però smanetto col vc++ da quasi un mese.... :cry:
scusa, ma facendo così includo automaticamente il file obj, con tutte le funzioni incluse?
scusa,forse non sai che nel file obj ci sono le DEFINIZIONI delle funzioni,ma se includi solo quel file non puoi usare le funzioni,perchè devi averle DICHIARATE nel sorgente che tu scrivi,come in tutti i programmi :)
deve esserci un file header (.h) da usare insieme al file .obj,e che si chiamerà,suppongo,con lo stesso nome
ecco,allora includi nel progetto anche quel file header dal menù come ho detto sopra,e poi nel file .c del tuo programma usi #include "nomefileheader" per includerlo
quindi riassumendo,includi nel progetto,dal menu,il file .obj e il file .h,poi nel file .c scrivi #include nomedelfileheader , così puoi usare le funzioni
scusa se ti spiego cose che magari già sai,ma mi hai dato l'impressione di non saperle :)
scusa,forse non sai che nel file obj ci sono le DEFINIZIONI delle funzioni,ma se includi solo quel file non puoi usare le funzioni,perchè devi averle DICHIARATE nel sorgente che tu scrivi,come in tutti i programmi :)
deve esserci un file header (.h) da usare insieme al file .obj,e che si chiamerà,suppongo,con lo stesso nome
ecco,allora includi nel progetto anche quel file header dal menù come ho detto sopra,e poi nel file .c del tuo programma usi #include "nomefileheader" per includerlo
quindi riassumendo,includi nel progetto,dal menu,il file .obj e il file .h,poi nel file .c scrivi #include nomedelfileheader , così puoi usare le funzioni
scusa se ti spiego cose che magari già sai,ma mi hai dato l'impressione di non saperle :)
figurati, hai fatto + che bene a chiarirmi le idee!
il fatto è che per il file che mi interessa ne ho una versione .c e un'altra .obj, me ntre per un altro file (che pure mi serve) ne ho la versione .obj e la versione .asm!
Mi toccherà generare da solo il file header?
il fatto è che su un vecchio compilatore, bastava che ci fosse il file .obj e il gioco era fatto!
GordonFreeman
13-12-2005, 18:44
figurati, hai fatto + che bene a chiarirmi le idee!
il fatto è che per il file che mi interessa ne ho una versione .c e un'altra .obj, me ntre per un altro file (che pure mi serve) ne ho la versione .obj e la versione .asm!
Mi toccherà generare da solo il file header?
il fatto è che su un vecchio compilatore, bastava che ci fosse il file .obj e il gioco era fatto!
senti,quello che ti serve sono due cose:
le DICHIARAZIONI delle funzioni,cioè i prototipi
le DEFINIZIONI delle funzioni
forse nel file .c che dici,ci sono sia i prototipi che le definizioni delle funzioni,cioè ad esempio
int sum(int i1,int i2);
questo era solo un prototipo della funzione,invece
int sum(int i1,int i2){
return i1+i2;
}
questo era la definizione della funzione,anzi,era prototipo + definizione
se tu hai disponibile solo il prototipo nel file .c o .h...ti serve anche la definizione,devi averla da qualche parte,e se non ce l'hai scritta nel file .c,che va in input al compilatore,devi averla in un file .OBJ oppure .LIB,che è già compilata e va in input al linker
per quanto riguarda il file .ASM,esso contiene i prototipi,ma non per il linguaggio C,ma per il linguaggio assemblatore
nel file .obj ad esso associato,c'è la definizione della funzione,cioè in questo caso la funzione già compilata
se quelle funzioni le vuoi usare dal C,dovresti costruirti da solo il loro prototipo,devi sapere quali sono i suoi parametri,e il tipo di dato di ritorno
e poi linki con il file .obj
suggerimento : prova a capire i prototipi delle funzioni in linguaggio assemblatore,e poi tradurli in C,oppure fattelo fare da qualcuno ;)
uè ma pagami il cinema dopo tutto questo! :D
senti,quello che ti serve sono due cose:
le DICHIARAZIONI delle funzioni,cioè i prototipi
le DEFINIZIONI delle funzioni
forse nel file .c che dici,ci sono sia i prototipi che le definizioni delle funzioni,cioè ad esempio
int sum(int i1,int i2);
questo era solo un prototipo della funzione,invece
int sum(int i1,int i2){
return i1+i2;
}
questo era la definizione della funzione,anzi,era prototipo + definizione
se tu hai disponibile solo il prototipo nel file .c o .h...ti serve anche la definizione,devi averla da qualche parte,e se non ce l'hai scritta nel file .c,che va in input al compilatore,devi averla in un file .OBJ oppure .LIB,che è già compilata e va in input al linker
per quanto riguarda il file .ASM,esso contiene i prototipi,ma non per il linguaggio C,ma per il linguaggio assemblatore
nel file .obj ad esso associato,c'è la definizione della funzione,cioè in questo caso la funzione già compilata
se quelle funzioni le vuoi usare dal C,dovresti costruirti da solo il loro prototipo,devi sapere quali sono i suoi parametri,e il tipo di dato di ritorno
e poi linki con il file .obj
suggerimento : prova a capire i prototipi delle funzioni in linguaggio assemblatore,e poi tradurli in C,oppure fattelo fare da qualcuno ;)
uè ma pagami il cinema dopo tutto questo! :D
quello che scrivi per me è oro colato!
ma purtroppo io credo di essere alle prese con qualcosa di molto + grande di me...
Devo sviluppare un probramma che pilota una vecchia scheda DSP (basata su TMS320C25), con la quale ho avuto anche i suddetti file (.c, .obj e .asm) scritti in Turbo C.
ad esempio, scrivo qui il file che si occupa dell'io (si chiama m250io.c, di questo ho anche il file m250io.obj):
#include <stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <dos.h>
/* io + setupadr routines are for Model 250 */
setupadr(address,Pd,PC12,iobase)
unsigned address,Pd,PC12,iobase;
{
unsigned add,steps,i;
add = address & 0xfffc;
steps = address - add;
add = add | Pd |(PC12<<1);
outport(iobase+2,add);
if (steps != 0)
for(i=0;i<steps;i++)
inport(iobase);
}
recvio(xs, len, adr320, iobase, bankpd, bank12pc)
unsigned xs[],len,adr320,iobase,bankpd,bank12pc;
{
unsigned int i;
setupadr(adr320,bankpd,bank12pc,iobase);
peekio(iobase,xs,len);
}
sendio(xs, len, adr320, iobase, bankpd, bank12pc)
unsigned xs[],len,adr320,iobase,bankpd,bank12pc;
{
unsigned int i;
setupadr(adr320,bankpd,bank12pc,iobase);
pokeio(iobase,xs,len);
}
a parte le funzioni outport e inport (che oggi mi pare siano outpw e inpw nella libreria conio.h), vi sono due funzioni qui nn definite, peekio e pokeio, che credo siano nel file .asm.
ho provato a definire le funzioni che mi servivano nel file header del progetto, e ad allegare i due file obj, ma mi dà molti errori!
me tapino!
grazie per il tuo tempo cmq!
GordonFreeman
13-12-2005, 21:33
quello che scrivi per me è oro colato!
ma purtroppo io credo di essere alle prese con qualcosa di molto + grande di me...
Devo sviluppare un probramma che pilota una vecchia scheda DSP (basata su TMS320C25), con la quale ho avuto anche i suddetti file (.c, .obj e .asm) scritti in Turbo C.
ad esempio, scrivo qui il file che si occupa dell'io (si chiama m250io.c, di questo ho anche il file m250io.obj):
#include <stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <dos.h>
/* io + setupadr routines are for Model 250 */
setupadr(address,Pd,PC12,iobase)
unsigned address,Pd,PC12,iobase;
{
unsigned add,steps,i;
add = address & 0xfffc;
steps = address - add;
add = add | Pd |(PC12<<1);
outport(iobase+2,add);
if (steps != 0)
for(i=0;i<steps;i++)
inport(iobase);
}
recvio(xs, len, adr320, iobase, bankpd, bank12pc)
unsigned xs[],len,adr320,iobase,bankpd,bank12pc;
{
unsigned int i;
setupadr(adr320,bankpd,bank12pc,iobase);
peekio(iobase,xs,len);
}
sendio(xs, len, adr320, iobase, bankpd, bank12pc)
unsigned xs[],len,adr320,iobase,bankpd,bank12pc;
{
unsigned int i;
setupadr(adr320,bankpd,bank12pc,iobase);
pokeio(iobase,xs,len);
}
a parte le funzioni outport e inport (che oggi mi pare siano outpw e inpw nella libreria conio.h), vi sono due funzioni qui nn definite, peekio e pokeio, che credo siano nel file .asm.
ho provato a definire le funzioni che mi servivano nel file header del progetto, e ad allegare i due file obj, ma mi dà molti errori!
me tapino!
grazie per il tuo tempo cmq!
allora,scusa basta guardare nel codice che hai scritto sopra come vengono usate quelle due funzioni peekio e pokeio
guarda i tipi di parametri che prendono,e poi scrivi il loro prototipo all'inizio del file,ma dopo gli #include
ad esempio pokeio dev'essere così
void pokeio(unsigned,unsigned,unsigned);
bastava guardare come viene usata,infatti le vengono passati 3 unsigned come parametri
oppure il suo valore di ritorno è un int,o un byte...una delle tre deve essere
infatti, ma come vedi, mentre per le funzioni recvio e sendvio (e pure go500 e hlt500) ho anche l'implementazione nel file che vedi sopra, per le funzioni peekio e pokeio l'implementazione ce l'ho solo in assembler!
devo imparare anche l'assembler insomma :cry:
GordonFreeman
14-12-2005, 19:29
infatti, ma come vedi, mentre per le funzioni recvio e sendvio (e pure go500 e hlt500) ho anche l'implementazione nel file che vedi sopra, per le funzioni peekio e pokeio l'implementazione ce l'ho solo in assembler!
devo imparare anche l'assembler insomma :cry:
ma no! :)
ti basta IL PROTOTIPO,che devi dedurre come ho detto sopra,guardando come viene usata la funzione nel codice che hai scritto
solo i prototipi devi scrivere
la definizione ce l'hai GIA' COMPILATA nel file .obj associato al file .asm,e quindi devi solo linkare il file .obj,cioè dal menu devi aggiungerlo al progetto come ho detto all'inizio
ciao
innanzitutto grazie per il tuo aiuto, i tuoi consigli sono stati preziosi :)
purtroppo il problema per me nn finisce qui
infatti quando costruisco il programma e il linker va a leggere il file obj corrispettivo di quello asm, mi dice che c'è un errore di questo tipo
"segment reference fixup record"
credo che alcune azioni intraprese da quelle funzioni non siano permesse da Windows.
Secondo uno dei prof con cui lavoro, si dovrebbe scrivere un driver per questa scheda.
A tal proposito h scaricato WinDriver, ma ne sto ancora leggendo il manuale.....
Cmq, se tu (o qualunque anima pia) capisca di assembler, provo a postare il listato del file asm che mi serve
le funzioni di cui ho assoluta necessità sono :
hlt320 , go320 , int320, peekio, pokeio.
grazie
.286c
; masm/mx this file
DGROUP GROUP _DATA
ASSUME DS:DGROUP
_DATA SEGMENT WORD PUBLIC 'DATA'
tutu dw 0
table dw 1024 dup (0)
tabl2 dw 1024 dup (0)
_DATA ENDS
TCL320_TEXT SEGMENT BYTE PUBLIC 'CODE'
ASSUME CS:TCL320_TEXT
public _hlt320,_go320
public _sigpts,_int320,_hres320,_co80320
public _pokeio,_peekio ; Model 250
;
; SET THE COLOR CARD IN HI-RES GRAPHICS MODE : 640 * 200
;
_hres320 PROC FAR ;
PUSH BP ; save frame ptr on stack
MOV BP,SP
MOV AH,0 ; hi-res mode
MOV AL,6
INT 10H ; video int
POP BP ; restore frame ptr
RET ; Return
_hres320 ENDP
;
; SET THE COLOR CARD IN 80 COLUMN TEXT MODE
;
_co80320 PROC FAR ;
PUSH BP ; save frame ptr on stack
MOV BP,SP
MOV AH,0 ; set mode
MOV AL,3 ; color 80 = 3, bw80 = 2
INT 10H ; video int
POP BP ; restore frame ptr
RET ; Return
_co80320 ENDP
;
;
; INTERRUPT THE TMS 320
;
_int320 PROC FAR ; (BASEIO)
PUSH BP ; save frame ptr on stack
MOV BP,SP
MOV DX,[BP+6] ; DX = BASEIO
ADD DX,5 ;
IN AL,DX ; INT 320 command
MOV SP,BP
POP BP ; restore frame ptr
RET ; Return, pop 4 bytes
_int320 ENDP
; START 320
_go320 PROC FAR ; (BASEIO)
PUSH BP ; save frame ptr on stack
MOV BP,SP
MOV DX,[BP+6] ; DX = BASEIO
ADD DX,6 ; offset for GO
IN AL,DX ; GO command
MOV SP,BP
POP BP ; restore frame ptr
RET ; Return, pop 4 bytes
_go320 ENDP
; HALT 320
_hlt320 PROC FAR ; (BASEIO)
PUSH BP ; save frame ptr on stack
MOV BP,SP
MOV DX,[BP+6] ; DX = BASEIO
ADD DX,7 ; offset for HALT
IN AL,DX ; HALT command
MOV SP,BP
POP BP ; restore frame ptr
RET ; Return, pop 4 bytes
_hlt320 ENDP
; for Model 250 ... 286 & up only
_peekio PROC FAR ;(ioaddr,&x[0],len)
PUSH BP
MOV BP,SP
PUSH ES
PUSH DI
MOV DX,[BP+6] ; io address to read from
MOV AX,[BP+10] ; seg addr of dest string
MOV ES,AX ; DEST SEG
MOV DI,[BP+8] ; offset addr of dest str (arg 2)
MOV CX,[BP+12] ; string length (arg 3)
CLD
REP INSW
POP DI
POP ES
POP BP
RET
_peekio ENDP
; for Model 250 ... 286 & up only
_pokeio PROC FAR ;(ioaddr,&x[0],len)
PUSH BP
MOV BP,SP
PUSH DS
PUSH SI
MOV DX,[BP+6] ; io address to read from
MOV AX,[BP+10] ; seg addr of dest string
MOV DS,AX ; DEST SEG
MOV SI,[BP+8] ; offset addr of dest str (arg 2)
MOV CX,[BP+12] ; string length (arg 3)
CLD
REP OUTSW
POP SI
POP DS
POP BP
RET
_pokeio ENDP
; DISPLAY SIGNAL ON COLOR CARD
_sigpts PROC FAR ; (&Y[0],LEN)
PUSH BP ; save frame ptr on stack
MOV BP,SP
PUSH SI
PUSH DI
PUSH DS ; save DS on stack
PUSH ES ; save ES on stack
LDS BX,[BP+6]
MOV CX,[BP+6+4]
; dec cx
mov ax,0b800h
mov es,ax
mov ax,cx
shl ax,1
add bx,ax
siger: mov ax,[bx] ; might have some problems with the ds 's
cmp ax,0 ;added 12/13
mov tutu,0
jge doobee
mov tutu,1
doobee: nop
cmp ax,199
jle doit
mov tutu,1
doit: jmp sigpoint_; call sigpoint_
next:
dec bx
dec bx
loop siger
POP ES ; restore ES
POP DS ; restore DS
POP DI
POP SI
; MOV SP,BP
POP BP ; restore frame ptr
RET ; Return, pop 8 bytes
_sigpts ENDP
sigpoint_:
push di
push si
push bx
push cx
push ax
push cx
push ax
and ax,0feh
sal ax,1
sal ax,1
sal ax,1
mov bx,ax
sal ax,1
sal ax,1
add ax,bx
pop bx
sar bx,1
jnb sigven
add ax,2000h
sigven: sar cx,1
sar cx,1
sar cx,1
add ax,cx
mov si,ax
pop cx
mov bx,cx
shl bx,1 ; tabl2[2x]=old video bit info
push ax ; table[2x]=old video addr
mov ax,tabl2[bx] ; bx has x value * 2
mov di,table[bx]
not al ; eg: change 00100000 to 11011111
and al,es:[di]
mov es:[di],al ; previous value nullified here
pop ax
mov table[bx],ax ; ax has final address
and cx,7h ; bx has x value * 2
mov al,80h
shr al,cl
mov tabl2[bx],ax
cmp tutu,1
jne dubo
mov al,0
dubo: or al,es:[si]
mov es:[si],al
pop ax
pop cx
pop bx
pop si
pop di
jmp next ; ret
TCL320_TEXT ENDS
END
GordonFreeman
16-12-2005, 20:37
ciao
innanzitutto grazie per il tuo aiuto, i tuoi consigli sono stati preziosi :)
purtroppo il problema per me nn finisce qui
infatti quando costruisco il programma e il linker va a leggere il file obj corrispettivo di quello asm, mi dice che c'è un errore di questo tipo
"segment reference fixup record"
credo che alcune azioni intraprese da quelle funzioni non siano permesse da Windows.
Secondo uno dei prof con cui lavoro, si dovrebbe scrivere un driver per questa scheda.
A tal proposito h scaricato WinDriver, ma ne sto ancora leggendo il manuale.....
Cmq, se tu (o qualunque anima pia) capisca di assembler, provo a postare il listato del file asm che mi serve
le funzioni di cui ho assoluta necessità sono :
hlt320 , go320 , int320, peekio, pokeio.
grazie
cacchio ma quello è codice a 16 bit per il vecchio DOS,e contiene istruzioni di I/O,mi sa che dal modo utente non si può fare dell'I/O sotto Windows a 32 bit,lo potevi fare sotto DOS...adesso l'I/O si può fare solo in modalità kernel,quindi dovresti scrivere un driver per Windows di quella scheda
fai una prova, nel visual c++ che stai usando definisci le funzioni in questo modo: scrivi un blocco _asm e ci copi e incolli le istruzioni assembler dal file .asm
ad esempio la funzione int320
void int320(...non lo so che parametri prende....){
// copio e incollo il codice assembler della funzione,
// dal file .asm a questo file .c,in un blocco __asm
__asm {
PUSH BP
MOV BP,SP
MOV DX,[BP+6]
ADD DX,5
IN AL,DX
MOV SP,BP
POP BP
RET
}
}
e la funzione int320 la puoi usare perchè è definita nel codice C che ho scritto sopra,però ho paura che Windows si arrabbi e ti mandi un MessageBox con scritto "operazione privilegiata non consentita all'applicazione" o una cosa
del genere
perchè la tua applicazione ovviamente non è un driver,è in modo utente...cmq prova e dimmi
p.s. però ricordati che devi scoprire che parametri prendono le funzioni
GordonFreeman, se fai così però devi anche dichiararla come __declspec(naked)... ;)
GordonFreeman
16-12-2005, 20:51
GordonFreeman, se fai così però devi anche dichiararla come __declspec(naked)... ;)
ah non sapevo,ho visto adesso su msdn :D grazie
comunque da quanto ho capito serve a dire al compilatore di non aggiungere codice macchina all'inizio (prologo) e alla fine (epilogo) della funzione,ma di compilare solo quello che ho scritto io,giusto?
raga, io ormai sono sull'orlo della disperazione....
proverò ad eseguire il codice assembler come dite voi, ma il fatto che il tentativo di linkare il file precompilato (.obj) mi dia quell'errore (segment reference in fixup record) non è già un segnale del fatto che windows nn mi farà fare nulla?
ecco perchè stavo provando a scrivere un driver con WinDriver (lo conoscete?), ma anche se dice che sia semplice, non so ancora dove mettere le mani nel codice che lui costruisce (scheletro del driver)
grazie del vostro aiuto....
se potete, non mi abbandonate! :cry:
me tapino!
ho trovato sul forum "softwareforumsintel.com" una discussione che riprende proprio il mio caso.
Una persona che ha il mio stesso problema e dice....
"I have a fortran program that needs to call an assembly subroutine; this worked using IBM Professional Fortran and Ryan McFarland Fortran;
I did not write the assembly and do not know how it was assembled.
I have dispsub.asm and dispsub.obj files;
I have added the fortran source to the project and added the dispsub.obj file to the project; I have compiled the fortran program without errors;
when I build the exe, I get the following error message:
LINK : error : Segment reference in fixup record
.\dispsub.obj : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt
Error executing link.exe.
how can I fix this? "
e la risposta è stata: :cry: :cry: :cry: :cry:
"You can't fix it - you have a 16-bit DOS module that can't be linked to 32-bit Windows code."
ovvero non c'è speranza?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.