2011-09-03 15 views
8

Mentre si passava attraverso un codice C con un assembly inline, mi sono imbattuto nella direttiva .byte (con un punto all'inizio).Qual è l'uso della direttiva .byte assembler nell'assembly di GNU?

Durante il controllo del riferimento di assieme su Web ho scoperto che è utilizzato per riservare un byte in memoria.

Ma nel codice non c'era alcuna etichetta prima della dichiarazione. Quindi mi chiedevo che cosa sia l'uso di una direttiva .byte senza etichetta o di qualsiasi altra direttiva di archiviazione dei dati.

Ad es. se codice .byte 0x0a, come posso usarlo?

risposta

5

Ci sono poche possibilità ... qui ci sono un paio mi viene in mente la parte superiore della mia testa:

  1. Si potrebbe accedervi rispetto ad un'etichetta che viene dopo direttiva .byte . Esempio:

    .byte 0x0a 
    label: 
        mov (label - 1), %eax 
    
  2. Sulla base del layout finale legato del programma, forse le direttive .byte otterrà eseguito come codice. Normalmente avresti anche un'etichetta in questo caso,

  3. Alcuni assemblatori non supportano la generazione di prefissi di istruzioni x86 per le dimensioni degli operandi, ecc. Nel codice scritto per quegli assemblatori, vedrai spesso qualcosa come:

    .byte 0x66 
        mov $12, %eax 
    

    Per fare in modo che l'assemblatore emetta il codice che si desidera avere.

+1

Questo assemblatore da 3) ha bisogno di una patch, urgentemente :-) –

+0

Qual è la differenza tra '.byte' e [' d * 'pseudo-ops] (http://stackoverflow.com/questions/10168743/x86 ASSEMBLAGGIO-che-di dimensione variabile da usare-db-DW-dd)? –

+0

Mi aspetto che siano uguali. –

0

Il .byte è una direttiva che permette di dichiarare un byte costante solo conosciuto attraverso l'ispezione senza alcun contesto.

Dalla Guida GNU Assembler:

.byte 74, 0112, 092, 0x4A, 0X4a, 'J, '\J # All the same value. 
2

Ecco un esempio con assembly inline: (. Vedere compiler asm output and also disassembly of the final binary on the Godbolt compiler explorer)

#include <stdio.h> 
void main() { 
    int dst; 
    // .byte 0xb8 0x01 0x00 0x00 0x00 = mov $1, %%eax 
    asm (".byte 0xb8, 0x01, 0x00, 0x00, 0x00\n\t" 
    "mov %%eax, %0" 
    : "=r" (dst) 
    : : "eax" // tell the compiler we clobber eax 
    ); 
    printf ("dst value : %d\n", dst); 
return; 
} 

È possibile sostituire .byte 0xb8, 0x01, 0x00, 0x00, 0x00 con mov $1, %%eax il risultato corsa sarà lo stesso. Ciò indica che può essere un byte che può rappresentare alcune istruzioni, ad esempio muovere o altro.

1

.byte sputa fuori byte ovunque tu sia. Non importa se c'è un'etichetta o non punta al byte.

Se vi capita di essere nel segmento di testo, quel byte potrebbe essere eseguito come un codice.

Carl ne ha parlato, ma ecco un esempio completo di lasciarlo affondare in più: un'implementazione Linux x86_64 di true con un nop gettato in:

.global _start 
_start: 
    mov $60, %rax 
    nop 
    mov $0, %rdi 
    syscall 

produce esattamente lo stesso eseguibile come:

.global _start 
_start: 
    mov $60, %rax 
    .byte 0x90 
    mov $0, %rdi 
    syscall 

poiché nop è codificato come il byte 0x90.

Problemi correlati