| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1563 人关注过本帖
标题:如何快速统计汇编源码中各指令个数?
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
已结贴  问题点数:20 回复次数:14 
如何快速统计汇编源码中各指令个数?
程序代码:
// 统计指令的频度,并进行排序输出

#include "stdio.h"
#include "string"
using namespace std;

int main()
{
    // 获取输入文件
    FILE *fin=fopen("in.s","r");      // 输入汇编文件
    FILE *fout=fopen("out.txt","w");    // 输出汇编文件中各个指令的频度

    // 根据指令表创建hash树
   


    // 获得两个文件中指令频度

    // 根据两个文件中指令频度排序

    // 根据指定顺序输出指令频度

}
这个是我将要编写的程序总体结构,不知道各位大侠有什么好想法?
搜索更多相关主题的帖子: 如何 
2011-09-01 00:43
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
Instruction.rar (2.12 KB)

1、所有的汇编指令如附件所示,有什么方法能快速的根据这个指令列表创建创建hash树
2、如何方便获取汇编源码中的指令
3、对于指定的汇编指令应该创建一个怎样的结构体来记录频度信息
希望各位高手不舍赐教

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2011-09-01 01:17
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
今天看到同事用脚本实现了,改天添出代码!

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2011-09-01 23:08
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:20 
哈希是表啊,哥哥
这种事情适合用 perl处理,哈希是perl内置的数据结构
10行代码就可以搞定...

不过用c语言也不难, 大概要100行,也不是很长


[ 本帖最后由 BlueGuy 于 2011-9-2 12:17 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2011-09-02 12:13
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
能帮忙使用perl处理下吗?10行还是有难度的

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2011-09-05 21:59
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
testlog=$1
uniteBundleLine $testlog ${testlog}.tmp
cat ${testlog}.tmp | sed '/^$/d' | awk '{print $1}' | sort | uniq -c > ${testlog}.tmp2
cat ${testlog}.tmp2 | grep -v "iss\|clocks\|cycle\|fetch" | sort -k1 -g | tee ${testlog}.freqtab
uniteBundleLine.cpp
程序代码:
#include "stdio.h"
#include "string"
using namespace std;

char fsm[2][256];

void initfsm()
{
    const int line_len=sizeof(char)*256;
    memset(fsm[0],0,line_len);
    memset(fsm[1],1,line_len);
    fsm[0]['"']=1;
    fsm[1]['"']=0;
}

int main(char argc, char**argv)
{
    int state=0;
    unsigned char c;
    std::string s;

    if ( (argv[1] == NULL) || (argv[2] == NULL) )
    {
        printf("please check the input parameter.\n");
        return 1;
    }

    FILE *fin=fopen(argv[1], "r");
    FILE *fout=fopen(argv[2], "w");
   
    if ( (fin == NULL) || (fout == NULL) )
    {
        printf("please check the name of input files.\n");
        return 1;
    }

    initfsm();
    while(fscanf(fin,"%c",&c)!=EOF)
    {
        state=fsm[state][c];
        switch(state)
        {
        case 1:
            if(c=='\"')
            {
                fputc('\n',fout);  // 将第一个引号换成空格
            }
            else
                fputc(c,fout);
            break;
        default:
            if(c=='\n')
            {
                fputc(c,fout);
            }
            break;
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
} 


~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2011-09-06 16:29
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
该程序利用--trace=6的特点开发

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2011-09-07 20:53
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
以下是引用vfdff在2011-9-7 20:53:00的发言:

该程序利用--trace=6的特点开发

#include <stdio.h>
#include <string.h>

#define N 10010
#define M 10007
struct hashtabel
{
   
    char str[200] ;
    int num;
}a[N], b[N];

int hash(char *s)

{

    int h = 0, a = 127;
   
    for (; *s ; s++)
        
        h = (a*h + *s) % M;
   
    return h;
   
}

int getnum(char *s)
{
    int x;
   
    x = hash(s);
   
    while (strcmp(a[x].str, "") && strcmp(a[x].str, s)) // 该位置有值且值不匹配串
    {
        
        x = (x+1) % M;
        if (!(strcmp(a[x].str, "")))                    // 找一个没有值的位置
        {
            strcpy(a[x].str, s);
            return x;
        }
    }
    return x;
}

int main(void)
{
    char t[200];
    int i, j, n, total;
   
    for (i = 0; i < N; i++)
    {
        strcpy(a[i].str, "");
        a[i].num = 0;
    }
   
    scanf("%d\n", &n);
    for (i = 0, j = 0;  i < n; i++)
    {
        
        gets(t);
        total = getnum(t);
        
        if (a[total].num == 0)
        {
            strcpy(b[j].str, t);
            b[j].num = total;
            j++;
        }
        a[total].num++;
    }
   
    for (i = 0; i < j; i++)
        printf("%s %d\n", b[i].str, a[b[i].num].num);
   
    return 0;
}

我就是真命天子,顺我者生,逆我者死!
2011-10-05 21:45
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
以下是引用vfdff在2011-9-7 20:53:00的发言:

该程序利用--trace=6的特点开发

这是我以前写的一个字符串哈希, 希望对你有点帮助

我就是真命天子,顺我者生,逆我者死!
2011-10-05 21:46
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
研读下,谢谢

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2011-10-15 07:30
快速回复:如何快速统计汇编源码中各指令个数?
数据加载中...
 
   



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

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