|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
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!
__________________
ho fatto affari con: na decina di anime |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
boh, prova a linkarlo con pragma comment
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
Quote:
cos'è pragma comment?
__________________
ho fatto affari con: na decina di anime |
|
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
non hai mai linkato un lib in un tuo programma? non hai presente quando fai
Codice:
#pragma comment(lib, "nomefile") |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
Quote:
in effetti però smanetto col vc++ da quasi un mese.... scusa, ma facendo così includo automaticamente il file obj, con tutte le funzioni incluse?
__________________
ho fatto affari con: na decina di anime |
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Apr 2005
Messaggi: 296
|
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 |
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: Apr 2005
Messaggi: 296
|
Quote:
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 |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
Quote:
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!
__________________
ho fatto affari con: na decina di anime |
|
|
|
|
|
|
#9 | |
|
Member
Iscritto dal: Apr 2005
Messaggi: 296
|
Quote:
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! |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
Quote:
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!
__________________
ho fatto affari con: na decina di anime |
|
|
|
|
|
|
#11 | |
|
Member
Iscritto dal: Apr 2005
Messaggi: 296
|
Quote:
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 |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
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
__________________
ho fatto affari con: na decina di anime |
|
|
|
|
|
#13 | |
|
Member
Iscritto dal: Apr 2005
Messaggi: 296
|
Quote:
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 |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
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
__________________
ho fatto affari con: na decina di anime Ultima modifica di swarm : 16-12-2005 alle 12:21. |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
.286c
; masm/mx this file DGROUP GROUP _DATA ASSUME DS _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
__________________
ho fatto affari con: na decina di anime |
|
|
|
|
|
#16 | |
|
Member
Iscritto dal: Apr 2005
Messaggi: 296
|
Quote:
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 Codice:
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
}
}
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 |
|
|
|
|
|
|
#17 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
GordonFreeman, se fai così però devi anche dichiararla come __declspec(naked)...
|
|
|
|
|
|
#18 | |
|
Member
Iscritto dal: Apr 2005
Messaggi: 296
|
Quote:
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? |
|
|
|
|
|
|
#19 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
giusto
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
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!
__________________
ho fatto affari con: na decina di anime |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:11.



















