| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1563 人关注过本帖
标题:如何快速统计汇编源码中各指令个数?
只看楼主 加入收藏
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 10楼 vfdff
那个代码写的太烂了,适合ACM,
我最近在实现 STL,这个是现在的 哈希表结构

typedef struct xHashtableNode
{
    void* key,;
    void* enement;
    int hashCode;
    struct xHashtableNode* next;
} GL_HashtableNode, *HashtableNode;

typedef struct xHashtable
{
    HashtableNode* table;
    int size;
} GL_Hashtable, *Hashtable;

[ 本帖最后由 BlueGuy 于 2011-10-15 09:51 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2011-10-15 07:56
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:0 
#
#  运行时,需要指定输入输出文件:
#  如 perl foo.pl --in inputfile --out outputfile
#


#  分别为: 哈希  输入文件名  输出文件名
my (%hash, $fi, $fo) = (undef, undef, undef);

use Getopt::Long;
GetOptions ( "in=s" => \$fi, "out=s" => \$fo );
die "需要指定 输入文件 输出文件"  unless ($fi && $fo);


open (FI, "<$fi")  or  die "不能打开文件(读) '$fi' : $!";
open (FO, ">$fo")  or  die "不能打开文件(写) '$fo' : $!";

while (<FI>)
{
   chomp;                             # 去掉行尾换行
   s{ ^ \s*+ (\w\S*+) .*+ $ }{\1}xo;  # 提取指令名: 如push %bx和push %ax应该都是push指令
   next if $_ eq "";                  # 空行
   tr/a-z/A-Z/;                       # 汇编代码不分大小写,转换为大写
   $hash{$_} = 0 unless  exists $hash{$_};
   $hash{$_} ++;                      # 指令数目加1
}

my @keys = sort (keys %hash);         # 按字母顺序输出指令
foreach (@keys)
{
   print FO "$_ $hash{$_}\n";         # 输出格式:指令 出现的次数
}
close FO;
close FI;

   



[ 本帖最后由 wfoo 于 2011-10-15 15:25 编辑 ]
2011-10-15 15:15
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 12楼 wfoo
脚本真是好东西!

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2011-10-15 21:12
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
12 楼真牛B, 我只是说说而已...

1、所有的汇编指令如附件所示,有什么方法能快速的根据这个指令列表创建创建hash树
// 百度找一个字符串的哈希函数,得到每个字符串的哈希值,也就是链表数组的索引
// 采用链地址法,把字符串插入到数组链表中, 相当于插入到多个单链表中...
// 哈希很简单的,就是比单链表多个 哈希函数来算出链表数组索引

void hashtableInsert(Hashtable hashtable, HASHTABLEkey key, HASHTABLEitem item)
{
    int i = hash(key);
    HashtableNode x = hashtable->heads[i];
    x->next = newHashtableNode(key, item, x->next);
}

2、如何方便获取汇编源码中的指令
// hash是一个一一映射关系,
// key 是字符串, value是字符串的频度
// 所以只能通过字符串找 字符串的频度
HASHTABLEitem hashtableSearch(Hashtable hashtable, HASHTABLEkey key);

3、对于指定的汇编指令应该创建一个怎样的结构体来记录频度信息
typedef struct xHashtableNode
{
    HASHTABLEkey key;
    HASHTABLEitem item;
    struct xHashtableNode* next;
} HASHTABLEnode, *HashtableNode;
这样的结构就行了...

你的文件是不是还需要解析的呀的?? 没有发现有重复的指令
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Hash.h"

Hashtable hashtable;

int main(void)
{
    FILE* file;
    char s[100] = {0};
    char* t;
    file = fopen("hash.txt", "r");
    freopen("result.txt", "w", stdout);
    hashtable = newHashtable(100);

    while (fscanf(file, "%s", s) != EOF)
    {
        t = malloc(100);
        strcpy(t, s);
        hashtableInsert(hashtable, t, 0);
    }

    hashtableForeach(hashtable);
    return 0;
}

[ 本帖最后由 BlueGuy 于 2011-10-16 15:39 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2011-10-16 13:05
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 14楼 BlueGuy
嗯,我提供的附件只是指令列表,而不是真正的汇编代码,因此没有重复的指令。

确实,真正的汇编文件中应该不仅仅含有指令,也包含指令的操作数。虽然我看不懂12楼提供的perl语言

但是我感觉12楼的理解是正确的,也就是根据附件创建指令的hash表

然后解析输入的汇编语言,提取指令,并统计指令的个数。
谢谢两位的耐心指导

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2013-01-20 16:30
快速回复:如何快速统计汇编源码中各指令个数?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017645 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved