L'istruzione x86 più lunga

0

Ho letto il recente articolo "Istruzioni x86 più lunghe"

link

Ho tentato di riprodurre il curioso problema di disassemblaggio su una piattaforma di sviluppo Win7x86 usando masm e come suggerito dall'articolo, i prefissi dei redunants.

Parlare è economico, quindi ecco un programma giocattolo (masm32):

.386 .model flat, stdcall

option casemap:none

includelib \x\x\kernel32.lib
includelib \x\x\user32.lib

include \x\x\kernel32.inc
include \x\x\user32.inc
include \x\x\windows.inc

.code

start:

db 0F3h
db 0F3h
db 0F3h
db 0F3h
db 0F3h
db 0F3h
db 0F3h
;...6 more bytes later
db 089h
db 0E5h

end start

invoke ExitProcess, NULL

Dopo il collegamento e il montaggio, ho aperto il file eseguibile risultante in windbg.

Con mia delusione, quando faccio un solo passo, smonta il $ exentry, ecc. windbg semplicemente vede i prefissi / byte come istruzioni individuali, dice "al diavolo con esso" ed esegue solo le istruzioni valide.

C'è qualcosa che mi manca?

    
posta grepNstepN 09.03.2015 - 15:52
fonte

1 risposta

1

Ero confuso dall'implementazione del disassemblatore ... il processore esegue istruzioni che sono (i.cache < = 15B) come afferma l'artcle.

Verificato quando faccio un passo, dato che l'IP aumenta di 15B.

Quindi, tratta accuratamente i prefissi dei byte come parte di una singola istruzione.

Tuttavia, ho provato dumpbin /disasm e windbg finora, che disassemblano i prefissi byte come singole istruzioni invece di contiguo con l'istruzione "reale", ad es.

F3
F3
;...
89 ; start of 'real' instruction: mov ebp, esp
E5 

... avendo già pensieri malvagi.

Le scuse per aver dimenticato l'implementazione del disassemblatore del sistema operativo / software non stanno sfruttando appieno le capacità del processore (come Windows che non implementa Ring2, ecc.).

Grazie!

    
risposta data 09.03.2015 - 20:01
fonte

Leggi altre domande sui tag