|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
[C] GCC - generare un file object per nasm
come da titolo...
come si fa a generare un file object da linkare successivamente insieme ad un file .obj scritto in assembly-NASM? Grazie! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Il problema non è generare un file oggetto da un sorgente C e da un sorgente ASM (lo fai usando le apposite opzioni del gcc e del nasm). La questione importante è che se devi chiamare dal C delle funzioni scritte in assembly, devi preoccuparti di stabilire e rispettare le convenzioni di passaggio dei parametri.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
Quote:
il problema è che una volta generato il .o con gcc, poi scrivo da cmd: - link.exe S_ASS.OBJ source_c.o come risposta ho: source_c.o : fatal error L1101: invalid object module. a cosa è dovuto? (S_ASS.obj = object del sorgente assembly scritto con nasm; source.o = object del sorgente C; ) Ultima modifica di nico88desmo : 20-02-2007 alle 18:35. |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Se usi il gcc potresti usare il linker 'ld'. Comunque rimane il fatto che devi stabilire quale formato generare per l'oggetto del sorgente assembly. Se lavori in ambiente Windows, credo che possa andare bene l'opzione -f win32.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
per generare l'object del .asm ho fatto:
-> nasm -f obj s_ass.asm -l s_ass.lst poi ho fatto: -> bcc32 -3 source_c.c s_ass.obj ora la compilazione funziona...è il programma che non va ora. c'è un buon programma per fare il debug??? |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Esempio completo di programma Win32 console in C/ASM compilato con BCC 5.5 (Borland C++) e NASM
main.c Codice:
#include <stdio.h>
#include <stdlib.h>
int _cdecl Sum32 (int a, int b);
int main (int argc, char *argv[])
{
int a, b, s;
if (argc == 3)
{
a = atoi (argv[1]);
b = atoi (argv[2]);
s = Sum32 (a, b);
printf ("%d\n", s);
}
return 0;
}
bcc32 -c -tWC -omain.obj main.c func.asm Codice:
segment code use32 para
global _Sum32
;===============================================================================
; IN: [ebp+8] = operando 1
; [ebp+12] = operando 2
;
; OUT: eax = operando 1 + operando 2
;===============================================================================
_Sum32:
push ebp
mov ebp,esp
mov eax,[ebp+8]
add eax,[ebp+12]
mov esp,ebp
pop ebp
ret
nasmw -f obj -o func.obj func.asm Linkare con: ilink32 -c -C -Gn -x -ap -Tpe c0x32.obj main.obj func.obj,prova.exe,,cw32.lib kernel32.lib user32.lib Esempio di lancio: prova.exe 120 30
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
non potevo avere una risposta più completa!
Grazie mille! comunque se trovo qualche problema scrivo eh |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
eccomi di nuovo...
che programma mi consiglieresti per fare il debug di un .exe? |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Comunque in fase di compilazione/link bisogna specificare delle opzioni per generare le informazioni di debug. Nel mio esempio completo che ho postato non ho usato queste opzioni.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
ora provo ad utilizzarlo allora...intanto ti ringrazio per le risposte
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:24.




















