2013-09-26 7 views
0

이 lex 프로그램을 사용하여 소스, 대상 또는 간접 주소 지정으로 사용되는 각 레지스터의 사용법을 분석합니다.이 코드는 내 코드입니다. 모든 12 개의 레지스터를 분석해야합니다 ... 36 개의 변수와 36 개의 규칙을 선언하는 것에 반대하는 다른 효율적인 방법이 있습니까? (저는 학생입니다).lex 프로그램을 사용하여 asm 파일 분석

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'로 바꿀 수있는 것처럼 보입니다. 그래서 당신은 한 세트의 표현만을 가질 수 있습니다. 내가 렉스를 사용한 이후로 너무 오래되었습니다. 그래서 어떻게 완료되었는지 기억하지 못합니다. –

답변

1

입니다 :

%{ 
#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) ; 
} 

내 출력 . 하지만 아이디어는 레지스터를 정의한 다음 해당 정의를 사용하는 표현식을 정의하는 것입니다.

그래서, 예를 들어, 렉스 파일을 볼 수있는 작품 같은 :

% 

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

%% 

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

%% 

main() 
... 

내 구문은 아마도 완벽하지 않습니다, 그러나 그것은 일반적인 생각이다. 간단한 렉스 정의 예제를 찾아보십시오.