[perl script] print the assembly instruction and count the occurence


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting [perl script] print the assembly instruction and count the occurence
# 1  
Old 01-22-2015
[perl script] print the assembly instruction and count the occurence

Hi,

I have a input file(text file) with the following lines.

Code:
0x000000 0x5a80 0x0060 BRA.l 0x60 ;file:UserCall.s ;function:_user_call_table ;C_sourceLine:24
0x000002 0x1bc5 RETI ;file:UserCall.s ;function:_user_call_table ;C_sourceLine:30
0x000003 0x6840 MOV R0L,R0L ;file:UserCall.s ;function:_user_call_table ;C_sourceLine:31
0x000004 0x1bc5 RETI ;file:UserCall.s ;function:_user_call_table ;C_sourceLine:35
0x000005 0x6840 MOV R0L,R0L ;file:UserCall.s ;function:_user_call_table ;C_sourceLine:36

Expected output is some thing like this :

Code:
BRA.l 0x60
RETI
MOV R0L,R0L
RETI
MOV R0L,R0L


and it should count the occurence too like
MOV R0L,R0L occured 2 times
RETI occured 1
BRA.l 0x60 occured 1

So far I have developed code and need help here

Code:
#!/usr/local/bin/perl -w


my $filename = 'C:\data1.txt';
my @opcode_var = 0;
my @s_words = 0;
my $fun_name = 0;
my $file_name = 0;
my $output_var = 0;
my $remove_hex = 0;
open(FILE,$filename) or die "Could not read from filename";
my @lines = <FILE>;
chop @lines;
my $word = 0;

foreach my $line(@lines) 
{
	if ($line =~ /0x*/)
	{
		chop ($line);
		@opcode_var = split(/ /,$line);
		if($opcode_var[2] =~ /0x*/)
		{
			print "$opcode_var[3] $opcode_var[4]\n";
		}
		else
		{
			if($opcode_var[2] =~ /0x*/)
			{
				print "$opcode_var[2] $opcode_var[3]\n";
			}
		}
	}
}

you can copy this code and print the output. Just stuck here. Learning to extract the assembly code from .s file.

Thank you.

any help is appreciated.
# 2  
Old 01-22-2015
Perl looks like overkill for this.

Code:
awk '{ sub(/;.*/, "");
        $1=""; $2="";
        sub(/^[ \r\n\t]*/, "");
        A[$0]++ ; print }
END {
        for(X in A) print X" appeared "A[X]" times";
}' inputfile

This User Gave Thanks to Corona688 For This Post:
# 3  
Old 01-25-2015
Or even:
Code:
sed -e 's/ *;.*$//' -e 's/0x[^ ]* //g' inputfile | tee outfile | sort | uniq -c

---------- Post updated at 05:20 PM ---------- Previous update was at 04:00 PM ----------

Perlish solution, code to stdout, report to stderr:
Code:
use strict;
use warnings;

$\ = "\n";
my %COUNTS = ();

while (<>) {
    chomp;
    s{\s*;.*$}{};
    s{^\s*(0x[0-9a-z]+\s+)+}{}i;
    print;
    $COUNTS{$_}++;
}

while (my ($w, $n) = each %COUNTS) {
    printf STDERR "\%10d \%s\n", $n, $w;
}


Last edited by derekludwig; 01-25-2015 at 06:20 PM.. Reason: incompelete answer
This User Gave Thanks to derekludwig For This Post:
# 4  
Old 01-25-2015
It looks like Corona688's script missed one detail; the number of fields at the start of a line beginning with 0x is not a constant 2. This slight modification to his script:
Code:
awk '
{	sub(/;.*/, "")
	while($1 ~ /^0/) {
		$1 = ""
		$0 = $0
	}
	sub(/^[ \r\n\t]*/, "")
	print
	A[$0]++
}
END {	print ""
	for(X in A)
		print "\"" X "\" appeared " A[X] " times."
}' file.s

(with the sample input your provided) produces the output:
Code:
BRA.l 0x60
RETI
MOV R0L,R0L
RETI
MOV R0L,R0L

"MOV R0L,R0L" appeared 2 times.
"BRA.l 0x60" appeared 1 times.
"RETI" appeared 2 times.

which seems to be what was requested.

If you want to try this on a Solaris/SunOS system, change awk to /usr/xpg4/bin/awk, /usr/xpg6/bin/awk, or nawk.
This User Gave Thanks to Don Cragun For This Post:
# 5  
Old 01-25-2015
@acdc
I played with your original code a little and shamelessly stole the %COUNTS array from derekludwig. I came up with this without much regex...
Code:
#!/usr/local/bin/perl -w

use warnings;
use strict; 

# my @s_words = 0;
# my $fun_name = 0;
# my $file_name = 0;
# my $remove_hex = 0;
# my $word = 0;

my $filename = 'C:\data1.txt';
my @opcode_var = 0;
my $output_var = 0;
my %COUNTS = ();

open(my $FILE, '<', $filename) or die "Could not read from $filename";
my @lines = <$FILE>;
chop @lines;

foreach my $line(@lines) 
{
    if ($line =~ /0x*/)
    {
        chop ($line);
        @opcode_var = split(/ /,$line);
        
        if($opcode_var[2] =~ /0x*/)
        {
            $output_var = "$opcode_var[3] $opcode_var[4]";
        }
        else
        {
            if($opcode_var[1] =~ /0x*/)
            {
                if ($opcode_var[3] =~ /[;]+/)
                {
                    $output_var = "$opcode_var[2]";
                }
                else
                {
                    $output_var = "$opcode_var[2] $opcode_var[3]";
                }
            }
        }
    }
    print "$output_var\n";
    $COUNTS{$output_var}++;
}
print "\n";
while (my ($w, $n) = each %COUNTS)
{
    # printf STDERR "\(\%d\) \%s\n", $n, $w;
    printf STDERR "%-14s - occurred %-2d %s\n", $w, $n, $n < 2 ? "time" : "times";
}

close($FILE);

# eof #

# output
# ------
# BRA.l 0x60
# RETI
# MOV R0L,R0L
# RETI
# MOV R0L,R0L
#
# BRA.l 0x60     - occurred 1  time
# MOV R0L,R0L    - occurred 2  times
# RETI           - occurred 2  times
# or ...
# (1) BRA.l 0x60
# (2) MOV R0L,R0L
# (2) RETI


Last edited by ongoto; 01-26-2015 at 02:02 AM.. Reason: changed $filename
This User Gave Thanks to ongoto For This Post:
# 6  
Old 01-26-2015
Another solution with awk,
Code:
$ cat tmp
0x000000 0x5a80 0x0060 BRA.l 0x60 ;file:UserCall.s ;function:_user_call_table ;C_sourceLine:24
0x000002 0x1bc5 RETI ;file:UserCall.s ;function:_user_call_table ;C_sourceLine:30
0x000003 0x6840 MOV R0L,R0L ;file:UserCall.s ;function:_user_call_table ;C_sourceLine:31
0x000004 0x1bc5 RETI ;file:UserCall.s ;function:_user_call_table ;C_sourceLine:35
0x000005 0x6840 MOV R0L,R0L ;file:UserCall.s ;function:_user_call_table ;C_sourceLine:36


$ awk -F";" '{split($1,a,"");  for (i=1;i<=length(a);i++) { if (a[i-1]a[i]!="0x" && a[i-2]==" "  )  { print substr($1,i-1); break;}   }}' tmp
BRA.l 0x60
RETI
MOV R0L,R0L
RETI
MOV R0L,R0L

$ awk -F";" '{split($1,a,"");  for (i=1;i<=length(a);i++) { if (a[i-1]a[i]!="0x" && a[i-2]==" "  )  { print substr($1,i-1); break;}   }}' tmp | sort | uniq -c
      1 BRA.l 0x60
      2 MOV R0L,R0L
      2 RETI

This User Gave Thanks to senhia83 For This Post:
# 7  
Old 01-27-2015
Thanks guys. I finally managed to write my own code.

Here it is. But I would still love to re-use the code with you permission.
@senhia83 @ongoto @Don Cragun @derekludwig Corona688
Thank you all guys !
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

Python Count Number Of Occurence

Hello, I have a programming assignment to count number of occurrences of hours in particular file. Below is the code: fname = raw_input("Enter file name: ") if len(fname) < 1 : fname = "mbox-short.txt" largest = None fh = open(fname) counts = dict() test = list() for line in fh: ... (2 Replies)
Discussion started by: infinitydon
2 Replies

2. Shell Programming and Scripting

Print between patterns - first occurence, second occurence etc

I have a file # cat asasas AAAAAA 11 22 33 44 BBBBB NILNILNIL AAAAAA 22 33 44 55 66 77 88 BBBBB NILNILNIL (2 Replies)
Discussion started by: anil510
2 Replies

3. UNIX for Dummies Questions & Answers

How to print first occurence

Hi there, how can i print the first pattern occurrence in a .log file? I want to print the filename of the first 17262? I tried but all I can do is print all the lines with the number 17262? I tried using awk and sed but nothing!:wall: I just want filename! Here´s an example: 17259... (3 Replies)
Discussion started by: BMatter
3 Replies

4. Shell Programming and Scripting

Count number of character occurence but not from quotation marks

I have the following string: 31-01-2012, 09:42:37;OK;94727132638;"Mozilla/5.0 (Linux; U; Android 2.2.1)";3G;WAP;I need a script which is counting the occurrence of semicolons ( ; ) but exclude the ones from the quotation marks. In the string given as example there are 8 semicolons but the script... (3 Replies)
Discussion started by: calinlicj
3 Replies

5. Shell Programming and Scripting

Perl :How to print the o/p of a Perl script on console and redirecting same in log file @ same time.

How can i print the output of a perl script on a unix console and redirect the same in a log file under same directory simultaneously ? Like in Shell script, we use tee, is there anything in Perl or any other option ? (2 Replies)
Discussion started by: butterfly20
2 Replies

6. Programming

'seg' assembly instruction in .s file

Is this x86? I encountered this instruction and can't seem to find any info on what it does anywhere. Any ideas? This is how it appears: seg es (4 Replies)
Discussion started by: stevenswj
4 Replies

7. UNIX for Dummies Questions & Answers

How to count the occurence of a character in a line

Suppose i have data like :- 1,2,3,4,5 a,b,c x,y,z,t I want to count the occurence of , (comma) in every line. Waiting for a solution. (5 Replies)
Discussion started by: sumit207
5 Replies

8. UNIX for Advanced & Expert Users

How to count the occurence of a character in a line

Suppose i have data like :- 1,2,3,4,5 a,b,c x,y,z,t I want to count the occurence of , (comma) in every line. Waiting for a solution.:) (1 Reply)
Discussion started by: sumit207
1 Replies

9. UNIX for Dummies Questions & Answers

search& count for the occurence of a word

Greetings, I need to search and count all the occurences of a word in all the files in a directory. Any suggestions greatly appreciated. Thanks (1 Reply)
Discussion started by: skoppana
1 Replies

10. Shell Programming and Scripting

Count the number of occurence of perticular word from file

I want to count the number of occurence of perticular word from one text file. Please tell me "less" command is work in ksh or not. If it is not working then instead of that which command will work. :confused: (40 Replies)
Discussion started by: rinku
40 Replies
Login or Register to Ask a Question