PDA

View Full Version : File .obj con Visual C++


swarm
12-12-2005, 11:37
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!

71104
12-12-2005, 11:54
boh, prova a linkarlo con pragma comment :p

swarm
12-12-2005, 13:04
boh, prova a linkarlo con pragma comment :p

ops, scusa l'ignoranza.....

cos'è pragma comment?

71104
12-12-2005, 16:50
non hai mai linkato un lib in un tuo programma? non hai presente quando fai
#pragma comment(lib, "nomefile")
?

swarm
12-12-2005, 21:18
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 :)

swarm
13-12-2005, 06:14
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

swarm
13-12-2005, 20:07
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

swarm
14-12-2005, 08:54
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

swarm
16-12-2005, 10:48
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

swarm
16-12-2005, 10:49
.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

71104
16-12-2005, 20:39
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?

71104
16-12-2005, 21:14
giusto ;)

swarm
17-12-2005, 10:32
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:

swarm
17-12-2005, 10:35
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?