【问题标题】:parsing assembly code in perl在 perl 中解析汇编代码
【发布时间】:2011-03-26 09:21:26
【问题描述】:

0000000000033a1b subq $0x28,%rsp

我无法从上面的行中提取 0x28。我可以从一大串汇编代码中提取 subq,但我只想要 0x28,因为这给了我堆栈大小。我正在考虑使用 substr() 函数购买它有一些变化,另一个可能看起来像这样:

0000000000033a1c subq $0x000000b8,%rsp

在这种情况下,我只想要 0x000000b8。

我正在使用 perl。

谢谢。

【问题讨论】:

  • 要解析汇编程序,您可能需要一个有限状态机。

标签: perl parsing


【解决方案1】:

如果没有代码,我的猜测是您没有转义美元符号。因此,您要求它匹配行尾,然后 '0x28'

在任何正则表达式中,/\$0x(\p{XDigit}+)/ 应该从该字符串中捕获 '28'

【讨论】:

    【解决方案2】:

    如果您总是输入以下格式:

    instruction_address operand $stack_size,register
    

    你可以这样做:

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

    【讨论】:

    • 非常感谢,它成功了!你能向我解释发生了什么吗?我不只是想复制和粘贴代码,我想学习它。谢谢。
    • rashid,正则表达式读取: ^ from start of string 。任何字符 * 零次或多次?非贪婪修饰符 \$ 文字美元符号(开始捕获。任何字符 * 零次或多次?非贪婪修饰符)结束捕获组 1,文字逗号。* 直到字符串 \1 的 $ 结尾的所有其他内容被捕获组替换1 --- 请参阅“perl 食谱”中的 6.15 节以获得对贪婪修饰符的解释。
    猜你喜欢
    • 1970-01-01
    • 2019-01-12
    • 2014-09-30
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 2017-12-20
    相关资源
    最近更新 更多