2012-03-22 14 views
12

Avere un dubbio sulla conversione del codice esadecimale dell'istruzione della macchina JMP. Ho l'indirizzo assoluto a cui voglio saltare, diciamo "JMP 0x400835". Prima di tutto, è permesso? Se sì, quale sarebbe il codice esadecimale corrispondente? In caso contrario, posso prima memorizzare l'indirizzo in qualche registro, dire EAX e quindi inserire "JMP EAX"? Sto lavorando su architettura x86 (64b).Istruzione JMP - Codice esadecimale

Ho provato a stampare il codice esadecimale dall'output del diassem in gdb, ma non c'è coerenza, cioè non vedo l'indirizzo di destinazione nel codice esadecimale.

Sono nuovo al codice esadecimale e alle istruzioni della macchina, quindi scusate la mia ignoranza.

risposta

23

Non c'è alcun salto del modulo JMP absaddr in un indirizzo assoluto in modalità 64 bit. L'operando di un salto è sempre uno spostamento relativo a 32 bit a rip, che ottiene un segno esteso a 64 bit.

Il motivo per cui non si vede una coerenza è possibilmente che l'offset dipende dal puntatore dell'istruzione corrente e non lo si è riconosciuto.

jmp eax non è consentito neanche, poiché gli indirizzi sono sempre sempre a 64 bit su un'architettura a 64 bit. Una sequenza mov rax, addr + jmp rax fosse possibile, sarebbe simile

48 c7 c0 35 08 40 00   mov rax, 0x00400835 
ff e0       jmp rax 

o

48 b8 35 08 40 00 00 00 00 00 mov rax, 0x0000000000400835 
ff e0       jmp rax 

Come facevo a sapere questi codici esadecimali? Bene, ho chiesto al mio compilatore. Ho compilato con gcc -c e disassemblato con objdump. Non mi sono preoccupato di usare la sintassi Intel, perché non ne ho bisogno. Quindi questo è nella sintassi AT & T.

echo 'asm("mov $400835, %rax\n jmp *%rax\n");' > test.c 
gcc -c test.c 
objdump -d test.o 
+0

Grazie per la risposta. Questo mi ha davvero aiutato. objdump è seriamente un buon strumento! –

+0

Ehi .. Ho segnato il tuo post come "utile" .. questo è ciò che è necessario, credo, giusto? –

+0

@DeepanjanMazumdar È necessario fare clic sul segno di spunta – hirschhornsalz