2009-04-08 7 views
8

Sto provando a portare alcuni codici assembly scritti in Visual Studio nell'assembly GNU inline su Linux. Il codice originale utilizza _emit che MSDN descrive come istruzione pseudo e spiega come:Qual è l'equivalente di _emit su Linux?

Il pseudoinstruction _emit è simile alla direttiva DB di MASM. Si utilizza _emit per definire un singolo byte immediato nella posizione corrente nel segmento di testo corrente. Tuttavia, _emit può definire solo un byte alla volta e può solo definire byte nel segmento di testo. Usa la stessa sintassi dell'istruzione INT.

Come posso fare la stessa cosa su Linux?

risposta

15

per emettere 0x12 byte (per esempio), fare:

asm __volatile__ (".byte 0x12"); 

Anche se, è possibile ottenere risultati sorprendenti con ottimizzazioni abilitate.

+0

+1, buon punto su ottimizzazioni. –

+0

Grazie! Questo ha funzionato bene. – samgrover

+0

Con '__volatile__' (o semplicemente' volatile' sui moderni compilatori) non dovresti avere alcun problema anche con le ottimizzazioni abilitate. Il compilatore deve emettere il byte nella posizione indicata (ovviamente, il codice circostante potrebbe essere pesantemente ottimizzato ...). – BeeOnRope