2010-08-06 4 views
1

0000000000033a1b subq $0x28,%rspcode d'assembly d'analyse en perl

Je rencontre des problèmes pour extraire 0x28 de la ligne ci-dessus. Je suis capable d'extraire subq d'une grande liste de code d'assemblage mais je veux seulement 0x28 puisque cela me donne la taille de la pile. Je pensais à l'aide de la fonction substr() acheter des variations à elle, un autre pourrait ressembler à ceci:

0000000000033a1c subq $0x000000b8,%rsp

dans ce cas, je ne veux que 0x000000B8.

J'utilise perl.

Merci.

+0

Pour analyser l'assembleur, vous voulez probablement un automate à états finis. –

Répondre

1

Si votre entrée du format suivant toujours:

instruction_address operand $stack_size,register 

vous pouvez faire:

$a = '0000000000033a1b subq $0x28,%rsp'; 
$a =~s/^.*?\$(.*?),.*$/\1/; 
print $a; # prints 0x28 
+0

Merci beaucoup, ça a marché! Pourriez-vous s'il vous plaît m'expliquer ce qui se passe? Je ne veux pas simplement copier et coller le code, je veux l'apprendre. Je vous remercie. – infinitloop

+0

@rashid, il fuit le dollar-signe pour un ... – Axeman

+2

rashid, l'expression rationnelle lit:^à partir du début de la chaîne. un caractère * zéro ou plusieurs fois? modificateur non glouton $ $ un signe dollar littéral (début de la capture.n'importe quel caractère * zéro ou plusieurs fois? modificateur non glouton) fin capture groupe 1, une virgule littérale. * tout le reste jusqu'à la fin $ de la chaîne \ 1 substitué par groupe de capture 1 --- voir la recette 6.15 dans le "livre de recettes perl" pour une explication des modificateurs gourmands. – zen

3

Sans code, je suppose que vous n'êtes pas échapper le signe dollar. Ainsi, vous demandez à ce qu'il corresponde à la fin de la ligne, , puis'0x28'. Dans toute regex, /\$0x(\p{XDigit}+)/ doit capturer '28' dans cette chaîne.