spingere su 64 bit intel osx

Voglio spingere l’indirizzo a 64 bit nello stack come di seguito,

__asm("pushq $0x1122334455667788"); 

Ma ottengo errore di compilazione e posso solo spingere in modo seguente,

 __asm("pushq $0x11223344"); 

Qualcuno può aiutarmi a capire il mio errore?

Sono nuovo all’assemblaggio, quindi per favore scusami se la mia domanda sembra stupida.

x86-64 ha alcune stranezze interessanti, che non sono ovvie anche se hai familiarità con x86 a 32 bit …

  1. La maggior parte delle istruzioni può assumere solo un valore immediato a 32 bit, che è esteso al segno a 64 bit se utilizzato in un contesto a 64 bit. (La codifica dell’istruzione memorizza solo 32 bit.)

    Ciò significa che è ansible utilizzare pushq per valori immediti nell’intervallo 0x00x7fffffff (ovvero valori a 32 bit con segno positivo estesi al segno con 0 bit) o 0xffffffff800000000xffffffffffffffff (ovvero valori a 32 bit con segno negativo che indicano esteso con 1 bit). Ma non puoi usare valori al di fuori di questo intervallo (poiché non possono essere rappresentati nella codifica delle istruzioni).

  2. mov è un caso speciale: esiste una codifica che prende un operando immediato a 64 bit. Da qui la risposta di Daniel (che è probabilmente la tua migliore scommessa).

  3. Se davvero non si vuole danneggiare un registro, è ansible utilizzare più push di valori più piccoli. Tuttavia, la cosa ovvia di spingere due valori a 32 bit non funzionerà. Nel mondo a 64 bit, push funzionerà con un operando a 64 bit (sobject al punto 1 sopra, se è una costante immediata) o un operando a 16 bit, ma non un operando a 32 bit (anche pushl %eax non è valido) . Quindi il meglio che puoi fare è 4 push a 16 bit:

    pushw $0x1122; pushw $0x3344; pushw $0x5566; pushw $0x7788

La tua migliore scommessa sarebbe quella di fare qualcosa di simile.

 movq $0x1122334455667788, %rax pushq %rax 

Sostituisci %rax con qualsiasi altro registro a 64 bit che ritieni appropriato.

Non esiste una singola istruzione in grado di prendere un valore immediato a 64 bit e di spingerlo nello stack.

da come utilizzare l’indirizzamento relativo rip

 pushq my_const(%rip) ... my_const: .quad 1122334455667788