Einfache Überprüfung von Intel Assembly Opcodes unter Linux
Ich habe nach einem praktischen Tool gesucht, mit dem die Opcodes von 64-Bit- oder 32-Bit-Befehlen von Intel unter Linux gedruckt werden können, z. so etwas wieHiew's
Assembler unter DOS. Ein webbasierter Dienst wäre auch eine Option.
Da ich keine finden konnte, habe ich meine eigene gemachtbash
Skript, das eine Assembly-Quelldatei aus Befehlszeilenparametern (Anweisung [en] und <32/64>) erstellt, kompiliert, verknüpft und zerlegt und die korrekten Zeilen für die Zerlegung anzeigt. Aber gibt es schon ein Programm, das zeigen würdealles die möglichen Kodierungen für einen gegebenen Befehl, z. zummov eax,ebx
? Mein Ansatz mitnasm
, ld
undndisasm
offensichtlich gibt es nur eine mögliche Kodierung für jeden Befehl.
Mit diesem Skript kann ich die Kodierungen abrufen, die von verwendet werdennasm
für 64- und 32-Bit-Code, zB:
/home/user/code/asm$ showop 'nop;add eax,ebx;cpuid' 64
00000000 90 nop
00000001 01D8 add eax,ebx
00000003 0FA2 cpuid
Aber wie könnte ich einfach alle möglichen Opcode-Codierungen bekommen? Gibt es dafür schon ein Programm?
Hier ist der Code:
#!/bin/bash
# usage: showop instructions bits
asminstr=$1
bits=$2
# asminstr="nop;nop;nop;nop;add eax,ebx;nop;nop;nop"
# bits=64
numberofinstr=`echo $asminstr | grep -o ";" | wc -l`
((numberofinstr++))
if [ -f tempasmfile.asm ]
then
rm tempasmfile.asm
fi
if [ -f tempobjfile.o ]
then
rm tempobjfile.o
fi
if [ -f tempexefile ]
then
rm tempexefile
fi
printf "[bits $bits]\nsection .text\nglobal _start\n\n_start:\n`echo $asminstr | sed 's/;/\\n/g'`\n" >tempasmfile.asm
nasm -f elf$bits tempasmfile.asm -o tempobjfile.o
ld tempobjfile.o -o tempexefile
if [ $bits -eq 32 ]
then
ndisasm -b $bits -e 0x60 tempexefile | head -n $numberofinstr
elif [ $bits -eq 64 ]
then
ndisasm -b $bits -e 0x80 tempexefile | head -n $numberofinstr
fi
rm tempasmfile.asm
rm tempobjfile.o
rm tempexefile