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