Newsgroup: it.comp.lang.c++
Titolo: Newline all'interno di una macro

Salve a tutto il NG,
stavo cercando di capire se era possibile inserire un newline
all'interno di una macro, mi spiego meglio, ho il seguente #define:
#define EAX(X)	__asm xor eax, eax; \
		__asm mov eax, X;
Che nel codice viene espanso in questo modo:
int main(...){
	__asm xor eax, eax; __asm mov eax, X;
}
Ho bisogno pero' che venga espanso inserendo un newline, ovvero cosi':
int main(...){
	__asm xor eax, eax;
	__asm mov eax, X;
}
Ed in effetti non so come si fa... Che voi sappiate: e' possibile 
inserire un newline all'interno di una macro?
Grazie tante a tutti!
F.

Uhm mi auto-rispondo: a quanto pare, almeno sui compilatori MS, non e' 
possibile inserire un newline nelle macro, quindi la soluzione (nel mio 
caso) e' di definire la macro in questo modo:
#define EAX(X){			\
			__asm xor eax, eax\
			__asm mov eax, X \
		}
oppure:
#define EAX(X) __asm { \
			__asm xor eax, eax \
			__asm mov eax, X   \
		}
:)))

 caso) e' di definire la macro in questo modo:
scusa ... mi intrometto penso a sproposito, ma mi è saltato 
l'occhio al codice della macro
c'è una ragione particolare per cui azzeri l'operando di 
registro prima di copiarci i dati ram con MOV ?
Ho pensato che potessi aver voluto evitare, che so, problemi di 
prefetch della pipeline o del genere, ma faccio prima a chiedere 
a te.
Il dubbio mi è sorto perché, se la memoria non m'inganna, in 
effetti l'ho già visto fare tanto tempo fa dal disassemblato 
prodotto da un vecchio BorlandC (Cristo ... era il 2.0 !), e non 
capivo a cosa potesse servire azzerare il registro, se tanto poi 
il contenuto era sovrascritto. Magari mi sveli tu quell'arcano 
mistero del passato !
ciao
Soviet


 mistero del passato !
Se il secondo fosse stato solo "mov ax, X" avrei capito... ma cosi'
no. Se BorlandC 2.0 produceva questa cosa, era senza senso,
probabilmente dovuto ad una scarsa ottimizzazione. 
--
Marco
 
-- 
I'm using an evaluation license of nemo since 221 days.
You should really try it!
http://www.malcom-mac.com/nemo

  precisazione
Nella mia riga non c'era un errore tipografico :)
Con "mov ax, X" scrivi solo nella parte bassa di EAX. Fare uno XOR
EAX, EAX e poi fare una mov sulla parte bassa e(ra) un modo economico
per fare l'estensione a 32 bit di un intero senza segno a 16 bit.
--*PaN!*
 
-- 
I'm using an evaluation license of nemo since 222 days.


Uhm non volendo ho alzato un polverone scusatemi :).
Ho messo quelle due istruzioni solo come esempio, in verita' la macro e' 
abbastanza piu' lunga, ma per rendere piu' immediato il problema ho 
inserito solo il numero necessario di righe :).
Comunque:
xor eax, eax
mov eax, valore
Non ha senso, la mov sovrascrive per intero il registro, una cosa del 
genere sarebbe utile soltanto quando si vuole sporcare parte del 
registro avendo comunque la sicurezza di avere il resto dei bit a 0.
xor eax, eax
mov eax, bl
La differenza tra fare xor/mov oppure mov e' che lo XOR comunque puo' 
modificare i carry/overflow/sign/zero e parity flags.
Esiste ad ogni modo un'alternativa decisamente semplice a:
xor eax, eax
mov eax, bl
Ovvero:
movzx eax, bl
che estende lo 0 a tutti i bit non interessati dalla mov.
Scusate l'OT spero di aver chiarito il dubbio iniziale :)
Ciao a tutti e grazie.