我有一个从编译器生成的汇编文件。它声明所有字符串如下:
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
有人可以帮助我吗? 问候
答案 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