0

この lex プログラムを使用して、各レジスタの使用状況を分析しています。ソース、デスティネーション、または間接アドレッシングとして使用されているかどうかにかかわらず、これらは私のコードです。12 個のレジスタすべてを分析する必要があります...何かありますか? 36 個の変数と 36 個のルールを宣言するのとは対照的に、これらを行うための他の効率的な方法はありますか? (私は学生です)。

%{ 
#include <stdio.h>

int q,w,e,r,t,y,u,i,o,p,a,s = 0;

%}

%%
[push|dec]?+[ ]+(eax|EAX)+[,] q++ ;
[,| ]+(eax|EAX)+[ ]? w++ ;
['[']+(eax|EAX)+[ ]? e++ ;
[push|dec]?+[ ]+(ebx|EBX)+[,] r++ ;
[,| ]+(ebx|EBX)+[ ]? t++ ;
['[']+(ebx|EBX)+[ ]? y++ ;
[push|dec]?+[ ]+(ecx|ECX)+[,] u++ ;
[,| ]+(ecx|ECX)+[ ]? i++ ;
['[']+(ecx|ECX)+[ ]? o++ ;
[push|dec]?+[ ]+(edx|EDX)+[,] p++ ;
[,| ]+(edx|EDX)+[ ]? a++ ;
['[']+(edx|EDX)+[ ]? s++ ;




. ;



%%

main()

{

yylex() ;

printf("EAX as source: %d\n", q) ;
printf("EAX as destination: %d\n", w) ;
printf("EAX as indirect address: %d\n", e) ;
printf("EBX as source: %d\n", r) ;
printf("EBX as destination: %d\n", t) ;
printf("EBX as indirect address: %d\n", y) ;
printf("ECX as source: %d\n", u) ;
printf("ECX as destination: %d\n", i) ;
printf("ECX as indirect address: %d\n", o) ;
printf("EDX as source: %d\n", p) ;
printf("EDX as destination: %d\n", a) ;
printf("EDX as indirect address: %d\n", s) ;
}

これは私の出力です:

EAX as source: 56
EAX as destination: 71
EAX as indirect address: 0
EBX as source: 25
EBX as destination: 38
EBX as indirect address: 0
ECX as source: 26
ECX as destination: 30
ECX as indirect address: 0
EDX as source: 30
EDX as destination: 38
EDX as indirect address: 0
ubuntu@ubuntu:~$ ^C

分析しようとしているファイルはここにありますこれはasmファイルがある場所です

4

1 に答える 1

1

コメントで述べたように、lex を扱うのは久しぶりです。ただし、目的は、レジスタを定義してから、その定義を使用する式を定義することです。

たとえば、lex ファイルは次のようになります。

%

R EAX|eax|EBX|ebx|ECX|ecx|EDX|edx

%%

[push|dec]?+[ ]+({R})+[,] q++ ;
[,| ]+({R})+[ ]? w++ ;
['[']+({R})+[ ]? e++ ;

%%

main()
...

私の構文はおそらく完璧ではありませんが、それが一般的な考え方です。簡単な lex 定義の例を調べてください。

于 2013-09-26T22:21:53.177 に答える