2011-10-11 22 views
8

vorrei chiedere una cosa che sto pensando di provare con Visual Studio 2010.MS Visual Studio 2010 come utilizzare il file generato .asm

sto generando un file .asm da file the.cpp impostando l'opzione per "Assembler Output" nelle proprietà del progetto -> C/C++ -> Output Files (/ FAs).

La mia domanda è, come posso in un prossimo passo utilizzare quel file generato .asm per ricollegarlo da quello senza usare più il file .cpp, nel caso volessi apportare alcune modifiche all'interno del file .asm e poi link di nuovo mantenendo le modifiche che ho fatto a livello di assembly.

Sarebbe molto utile se fosse possibile fornire i passaggi esatti, inclusa la corretta configurazione necessaria nelle proprietà del progetto.

+0

Per prima cosa è necessario compilarlo con ML, quindi è possibile andare al linker. Guarda i parametri della riga di comando di ML.EXE, non l'ho mai provato in VS2010. –

+0

In alcuni casi è possibile utilizzare in linea asm – BlackBear

+0

Fare attenzione se si desidera utilizzarlo per scopi diversi dalla sperimentazione/apprendimento. L'output dell'assemblatore MSVC non funziona bene con C++ (gestione delle eccezioni in particolare), e MS non supporta elenchi di assiemi diversi da quelli "a scopo informativo". Vedi http://stackoverflow.com/questions/7488056/a-problem-with-cl-exe-and-ml-exe/7495413#7495413 –

risposta

1
+0

Grazie per il tuo tempo, ma sono già consapevole di quel tutorial che descrive un altro caso, diverso dal mio. Come già detto non voglio solo collegare una funzione scritta in asm. Posso farlo facilmente con in linea asm all'interno del file .cpp stesso. –

+0

Non hai più bisogno del file cpp dopo. I è compilato usando ml.exe con una fase di compilazione personalizzata. – MartyTPS

+0

Come ho detto, stavo davvero cercando una soluzione per utilizzare l'intero file generato .asm dopo aver compilato un sorgente C++ (file cpp), e quindi usare solo l'asm generato per compilare di nuovo senza usare più cpp. Grazie. Questo tutorial specifico descrive un caso in cui usa una funzione che ha scritto in asm insieme al file cpp, che è diverso da quello che voglio. Tuttavia, potrei usare questo tutorial per trovare una soluzione personalizzata per il mio caso poiché ho scritto molto del mio codice in .asm all'interno del file cpp. –

0

ho fatto di recente. Ecco una ripetizione della risposta che ho dato qui compile-assembly-output-generated-by-vc. Si scopre che è ancora possibile farlo in modalità a 32 bit in MSVC2012 ma penso che la modalità a 64 bit sia senza speranza.

Per la modalità a 32 bit ecco quello che fai.

Creare un progetto vuoto e un file di origine sorgente.cpp

#include <stdio.h> 
int main() { 
    printf("hello world\n"); 
    return 0; 
} 
  1. leccare destro sul progetto e selezionare "Build Personalizzazione" e
    selezionare MASM come descritto qui http://www.masm32.com/board/index.php?topic=9231.0
  2. Sotto C++/OutputFiles seleziona Assembly Output/FA
  3. Comipile in modalità 32 bit Modalità di rilascio
  4. Caricare il file Source.asm in MSVC in modo da poterlo visualizzare. Non funzionerà ancora. Alcuni cambiamenti sono ancora necessari.
  5. In C++/Ottimizzazione disattiva l'ottimizzazione di tutto il programma (rimuove /GL). Questo aggiunge la linea INCLUDELIB MSVCRT
  6. Nel Linker/Advanced impostare l'ultima opzione "immagine ha gestori di eccezioni sicuro" per No (/SAFESEH:NO)
  7. Ora si dovrebbe avere un file Source.asm che farà la stessa cosa che Source. file cpp ha fatto. Copia il Source.cpp dalla directory Release nella stessa directory di Source.cpp (quindi non viene eliminato quando si compila/si pulisce).
  8. Aggiungi Source.asm (come un file esistente) ai file di origine e rimuovere Source.cpp dalla compilazione.
  9. Ricostruisci e dovresti vedere "Hello World" senza dover modificare manualmente le linee di assemblaggio.

Ho usato questo per funzioni più complicate. Di solito lo faccio su un modulo separato e uso extern "C" sul nome della funzione per rimuovere il nome di manganing del C++.

Problemi correlati