2011-09-13 22 views
14

C'è un modo per spostare un numero specifico di dimensioni di byte immediati in una posizione di memoria diretta? CioèEsiste un codice operativo x86 per spostare un byte immediato in una posizione di memoria diretta (senza utilizzare registri)?

MOV 10h,ffffh 

scrivere il valore 16 in indirizzo di memoria 65535? Se sì, quale opcode è questo, o dovrei memorizzare prima un indirizzo di memoria in un registro?

+2

Nella sintassi Intel, 'mov byte ptr [0ffffh], 10h'. Nella sintassi AT & T, 'movb $ 0x10, 0xffff'. Consultare la documentazione dell'assembler per ulteriori dettagli. –

risposta

13

Sì. L'opcode è C6. È necessario scaricare una copia dei documenti Intel ISA, che sono freely available.

Alla tua domanda di follow-up: la piena codifica del vostro esempio è:

c6  04  25 ff ff 00 00 10 
opcode modr/m sib  address  immediate 
+0

Grazie Stephen, tuttavia l'istruzione C6 non richiede un byte r/m? Se questo è il caso, l'istruzione risultante è lunga solo quattro byte, sicuramente non abbastanza per contenere un indirizzo di memoria completo? –

+1

@Nicholas Hill: l'istruzione risultante è * non * lunga solo 4 byte. –

4

Intel Manual Volume 2 Instruction Set Reference - 325383-056US September 2015 Sezione 3.2 "MOV-Move " ha una tabella che contiene:

Opcode   Instruction 
---------------- ---------------- 
C6 /0 ib   MOV r/m8, imm8 
C7 /0 iw   MOV r/m16, imm16 
C7 /0 id   MOV r/m32, imm32 
REX.W + C7 /0 io MOV r/m64, imm32 

Allora devi sapere che:

  • r/m significa registro o memoria di posizione
  • imm mezzo immediato

Quindi, queste sono le codifiche che stai cercando.

Più empiricamente si potrebbe anche avere appena provato fuori e decompilato:

mov byte [0x1234678], 0x9A 

Poi:

as --32 -o a.o a.S 
nasm -felf32 -o a.o a.asm 

Dà:

00000000 <.text>: 
    0: c6 05 78 56 34 12 9a movb $0x9a,0x12345678 

Quindi possiamo concludere che c6 è il codice operativo , con ModR/M 05 e immediatamente successivo.