2013-09-26 2 views
0

Я использую эту программу lex для анализа использования каждого регистра, независимо от того, используются ли они в качестве источника, назначения или используются как косвенная адресация, это мои коды, i необходимо проанализировать все 12 регистров ... есть ли какой-либо другой эффективный способ сделать это, поскольку они выступают против объявления 36 переменных и 36 правил? (Я студент).Использование lex-программы для анализа asm-файла

%{ 
#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 
[email protected]:~$ ^C 

файл я пытаюсь анализировать здесь this is where the asm file is

+0

Похоже, что вы можете определить 'Register' как один из« EAX, EBX, ECX' и т. Д., А затем заменить конкретные имена регистров в ваших выражениях «Register». Таким образом, у вас будет только один набор выражений. Это было слишком долго, так как я использовал lex, но я не помню, как это делается. –

ответ

1

Как я сказал в своем комментарии, это было давно, так как я работал с Лексом , Идея состоит в том, чтобы определить ваши регистры, а затем выражение, которое использует это определение.

Так, к примеру, ваш закон файл будет что-то вроде:

% 

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

%% 

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

%% 

main() 
... 

Мой синтаксис, вероятно, не является совершенным, но это общая идея. Посмотрите несколько простых примеров определения lex.

Смежные вопросы