使用perl

时间:2018-10-29 18:12:42

标签: perl

我有一个从编译器生成的汇编文件。它声明所有字符串如下:

LC0:
   .string "Testing...\r\n"

LC1:
   .string "HelloWorld...\r\n"

我想用相应的ascii值替换这些可变长度的字符串,但是在32位宽的单词(如第一个字符串)中,应替换为3个连续的32位宽的单词,即0x54657374、0x696e672e和0x2e2e0d0a。然后将十进制转换为:

LC0:
    .data.32 1415934836
    .data.32 1768843054
    .data.32 774769930

,类似地,LC1到0x48656c6c,0x6f576f72、0x6c642e2e和0x2e0d0a00也是如此:

LC1:
    .data.32 1214606444
    .data.32 1868001138
    .data.32 1818504750
    .data.32 772606464

有人可以帮助我吗? 问候

1 个答案:

答案 0 :(得分:5)

pack / unpack最适合此类转化。使用String::Interpolate安全插入反斜杠字符(它可能不支持与编译器相同的语法,因此请正确测试)。

#!/usr/bin/perl
use warnings;
use strict;

use String::Interpolate;

my $interpolate = 'String::Interpolate'->new;

while (<>) {
    if (my ($string) = /^\s+\.string\s+"(.*)"/) {
        $string = $interpolate->($string);
        print map "    .data.32 $_\n", unpack 'N*', "$string\0\0\0";
    } else {
        print;
    }
}

输出:

LC0:
    .data.32 1415934836
    .data.32 1768843054
    .data.32 774769930

LC1:
    .data.32 1214606444
    .data.32 1868001138
    .data.32 1818504750
    .data.32 772606464