如何使用** C++ 将内容如下的文本文件中的指令提取出来,就是能将操作码、操作数**区分开?
例如,输入文件路径**D:\指令文件.txt**
例如,输入文件路径**D:\指令文件.txt**
例如,指令文件中有一行是 addi R1 R0 0; 编写的程序能够识别出指令是 addi 并且是要对两个变量 R1和R0 进行操作,并且R0的初始值是0
大神们,请赐教!!!
楼主要实现的应该是用C++实现汇编语言的简单语句,这个任务可以参考编译原理中的思想,你可以将这个任务拆分成几个部分,如其中一个部分用来判断操作指令,是add,addi或者什么指令,然后第二个部分判断当前字符串是否是变量名,然后第三部分判断当前字符串是否是操作数,最后用一个主控函数调用前面说的各个部分,通过逻辑判断来控制程序走向,从而实现目标
相当于解释执行汇编指令,以下方法供参考:
1.对整个文件,以分号(或换行符)作为分隔符,提取每条指令;
2.对每条指令,以空格为分隔符,提取操作码,操作数(如果有的话);
3.对每个操作码,以操作数为参数, 调用一个相对应的函数即可(可事先为每个操作码,定义一个对应的函数,函数参数为操作数)。
http://blog.csdn.net/linchaolong/article/details/43943479
执行一条系统命令,并把执行结果输出到一个buffer。这种方法把输出直接写入内存,所以速度很快。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include
#include
#include
// 输入一个指令,并把输出写入到out
int execmd(const char* in, char* out){
// 通过管道把结果输出到内存
FILE* pipe = _popen(in,"r"); // 第一个参数是指令字符串,第二个参数是模式(r:读,w:写)
// _popen函数用于执行一条指令并把结果输出到内存中的文件对象
if (!pipe)
{
return 0; // 无输出,直接返回
}
char buff[128] = {0};
while (!feof(pipe))
{
// 从文件中读取一行
if (fgets(buff, 128, pipe))
{
// 连接字符串
strcat(out, buff);
}
}
_pclose(pipe);
return 1;
}
来自CODE的代码片
GetCMDOut.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char in[50] = {0};
char out[8192] = {0};
//char out[4096] = {0};
// 从标准输入读取一个指令
scanf("%s",in);
// 执行指令并把结果输出到out
execmd(in, out);
// 打印命令执行的结果
printf("\n\n%s",out);
// 执行tasklist命令并判断是否打开了QQ
char* p = strstr(out,"QQ.exe");
if (NULL != p)
{
printf("\n is open qq %c \n",*p);
}else{
printf("\n is not open qq \n");
}
来自CODE的代码片
测试代码.cpp
通过获取系统命令输出,可以很方便的实现一些功能,如windows下获取tasklist命令的输出可以获取到所有进程的信息。
工程地址:https://coding.net/u/linchaolong/p/GetCMDOut/git