Смотрите код
ТС 2.01:
[code h=200]/*Подключаем описание*/
#include "string.h"
#include "stdio.h"
/*определяем константы*/
#define szServWord 315/*количество зарезервированых слов*/
#define szWord 15/*длина слова*/
#define szData 150/*длина вводимой строки*/
#define szCommand 250/*граница команды-директивы*/
/*массив зарезервированных слов*/
char ServWord[szServWord][szWord]={
/*команды ассемблера простые - непривилегированные по книге Зубкова*/
"MOV", "CMOVA", "CMOVNBE", "CMOVAE", "CMOVNB",/*CMOVcc*/
"CMOVNC", "CMOVB" "CMOVNAE", "CMOVC", "CMOVBE",
"CMOVNA", "CMOVE", "CMOVZ", "CMOVG", "CMOVNLE",
"CMOVGE", "CMOVNL", "CMOVL", "CMOVNGE", "CMOVLE",
"CMOVNG", "CMOVNE", "CMOVNZ", "CMOVNO", "CMOVO",
"CMOVNP", "CMOVPO", "CMOVP", "CMOVPE", "CMOVNS",
"CMOVS", "XCHG", "BSWAP", "PUSH", "POP",/*CMOVcc*/
"PUSHA", "PUSHAD", "POPA", "POPAD", "IN",
"OUT", "CWD", "CDQ", "CBW", "CWDE",
"MOVSX", "MOVZX", "XLAT", "XLATB", "LEA",/*50*/
"ADD", "ADC", "XADD", "SUB", "SBB",
"IMUL", "MUL", "IDIV", "DIV", "INC",
"DEC", "NEG", "CMP", "CMPXCHG", "CMPXCHG8B",
"DAA", "DAS", "AAA", "AAS", "AAM",
"AAD", "AND", "OR", "XOR", "NOT",
"TEST", "SAR", "SAL", "SHR", "SHL",
"SHRD", "SHLD", "ROR", "ROL", "RCR",
"RCL", "BT", "BTS", "BTC", "BSF",
"BSR", "SETA", "SETNBE", "SETAE", "SETNB",/*SETcc*/
"SETNC", "SETB" "SETNAE", "SETC", "SETBE",/*100*/
"SETNA", "SETE", "SETZ", "SETG", "SETNLE",
"SETGE", "SETNL", "SETL", "SETNGE", "SETLE",
"SETNG", "SETNE", "SETNZ", "SETNO", "SETO",
"SETNP", "SETPO", "SETP", "SETPE", "SETNS",/*SETcc*/
"SETS", "JMP", "JA", "JNBE", "JAE",/*Jcc*/
"JNB", "JNC", "JB" "JNAE", "JC",
"JBE", "JNA", "JE", "JZ", "JG",
"JNLE", "JGE", "JNL", "JL", "JNGE",
"JLE", "JNG", "JNE", "JNZ", "JNO",
"JO", "JNP", "JPO", "JP", "JPE",/*150*/
"JNS", "JS", "JCXZ", "JECXZ", "LOOP",/*Jcc*/
"LOOPE", "LOOPZ", "LOOPNE", "LOOPNZR", "CALL",
"RET", "RETN", "RETF", "INT", "IRET",
"IRETD", "INT3", "INTO", "BOUND", "ENTER",
"LEAVE", "REP", "REPE", "REPNE", "REPZ",
"REPNZ", "MOVS", "MOVSB", "MOVSW", "MOVSD",
"SCAS", "SCASB", "SCASW", "SCASD", "LODS",
"LODSB", "LODSW", "LODSD", "STOS", "STOSB",
"STOSW", "STOSD", "INS", "INSB", "INSW",
"INSD", "OUTS", "OUTSB", "OUTSW", "OUTSD",/*200*/
"STC", "CLC", "CMC", "STD", "CLD",
"LAHF", "SAHF", "PUSHF", "PUSHFD", "POPF",
"POPFD", "CLI", "STI", "SALC", "LDS",
"LES", "LFS", "LGS", "LSS", "NOP",
"LOCK", "UD2", "CPUID", "reserv", "reserv",
"reserv", "reserv", "reserv", "reserv", "reserv",
"reserv", "reserv", "reserv", "reserv", "reserv",
"reserv", "reserv", "reserv", "reserv", "reserv",
"reserv", "reserv", "reserv", "reserv", "reserv",
"reserv", "reserv", "reserv", "reserv", "reserv",/*szCommand 250*/
/* fpu */
/* 94 команды
"FLD", "FST", "FSTP", "FILD", "FIST",
"FISTP", "FBLD", "FBSTP", "FXCH", "FCMOVE",
"FCMOVNE", "FCMOVB", "FCMOVBE", "FCMOVNB", "FCMOVNBE",
"FCMOVU", "FCMOVNU", "FADD", "FADDP", "FIADD",
"FSUB", "FSUBP", "FISUB", "FSUBR", "FSUBRP",
"FISUBR", "FMUL", "FMULP", "FIMUL", "FDIV",
"FDIVP", "FIDIV", "FDIVR", "FDIVRP", "FIDIVR",
"FPREM", "FPREM1", "FABS", "FCHS", "FRNDINT",
"FSCALE", "FXTRACT", "FSQRT", "FCOM", "FCOMP",
"FCOMPP", "FUCOM", "FUCOMP", "FUCOMPP", "FICOM",
"FICOMP", "FCOMI", "FCOMIP", "FUCOMI", "FUCOMIP",
"FTST", "FXAM", "FSIN", "FCOS", "FSINCOS",
"FPTAN", "FPATAN", "FIL2X", "FYL2XP1", "FLD1",
"FLDZ", "FLDPI", "FLDL2E", "FLDL2T", "FLDLN2",
"FLDLG2", "FINCSTP", "FDECSTP", "FFREE", "FINIT",
"FNINIT", "FCLEX", "FNCLEX", "FSTCW", "FNSTCW",
"FLDCW", "FSTENV", "FNSTENV", "FLDENV", "FSAVE",
"FNSAVE", "FXSAVE", "FRSTOR", "FXRSTOR", "FSTSW",
"FNSTSW", "WAIT", "FWAIT", "FNOP", "reserv",
"reserv", "reserv", "reserv", "reserv", "reserv",szCommand=350
*/
/* mmx*/
/* 62 команды
MMX и SSE - точно не найдете код :)
*/
/*директивы ассеблера*/
"reserv", "reserv", "reserv", "reserv", "reserv",
"ASSUME", "END", "EXTRN", "IFNB", "LOCAL",/*260*/
"PURGE", "COMMENT","ENDIF", "GROUP", "IFNDEF",
"MACRO", "RECORD", "DB", "ENDM", "IF",
"IF1", "NAME", "REPT", "DD", "ENDP",
"IFB", "IF2", "ORG", "SEGMENT", "DQ",
"ENDS", "IFDEF", "INCLUDE","OUT", "STRUC",
"DT", "EQU", "IFDIF", "IRP", "PAGE",
"SUBTTL", "DW", "EVEN", "IFE", "IRPC",
"PROC", "TITLE", "ELSE", "EXITM", "IFIDN",/*300*/
"LABEL", "PUBLIC", "MODEL", "reserv", "reserv",
".186", ".286", ".386", ".486", ".586",
"reserv", "reserv", "reserv", "reserv", "reserv"};/*315*/
void main()
{/*main*/
char InputLine[szData],isSeparator[szWord],temp[szWord];
char isLabel[szData],isCommand[szData];
char isOperand[szData],isComment[szData];
char *a,*b,*c;
int i,countOperand,countLine;
FILE *InputFile;
/*открываем файл для чтения*/
InputFile=fopen("q187548.asm","r");
/*сбрасываем счетчик линий*/
countLine=0;
/*цикл чтения файла*/
while(!feof(InputFile)){
fgets(InputLine,szData,InputFile);
a=InputLine;
/*выводим вводимую строку*/
printf("\nline %d : %s",countLine++,InputLine);
/*сбрасываем используемые строки*/
strcpy(isLabel,"");
strcpy(isCommand,"");
strcpy(isOperand,"");
strcpy(isComment,"");
/*отделяем комментарии*/
strcpy(isSeparator,";");
b=strpbrk(a,isSeparator);
if(b){
strcat(isComment,"\nComment :");
strncat(isComment,b,strlen(a)-(int)(b-a));
*b='\0';
};/*if(b)*/
/*отделяем метки*/
strcpy(isSeparator,": \t");
b=strpbrk(a,isSeparator);
if(b && *b==':'){/* */
strcat(isLabel,"\nLabel :");
strncat(isLabel,a,(int)(b-a));
b++;
a=b;
};/*if(b)*/
/*+++ основной обработчик команд +++*/
if(strlen(a)){
/*счетчик операндов*/
countOperand=1;
/*переводим в верхний регистр*/
strupr(a);
/*устанавливаем разделители и разбиваем строку на лексемы*/
strcpy(isSeparator," ,\t");
b=strtok(a,isSeparator);
do{
if(strlen(isCommand)==0){/*если ноль, ищем команду*/
for(i=0;i<szServWord;i++){/*цикл проверки зарезервированных слов*/
if(strlen(isCommand)==0){/*команда найдена,больше не ищем(только для ускорения работы программы)*/
if(strcmp(b,ServWord[ i ])==0){/*сравниваем с зарезервированным словом*/
if(i<szCommand){/*проверяем команда или директива*/
strcat(isCommand,"\nCommanda :");
}else{
strcat(isCommand,"\nDirective :");
};/*if(i<szCommand)*/
strcat(isCommand,b);/*заполняем ****** строку*/
};/*if(strcmp(b,ServWord[ i ])==0)*/
};/*if(strlen(isCommand))*/
};/*for(i=0;i<szServWord;i++)*/
if(strlen(isCommand)==0){
strcat(isLabel,"\nName :");/*если команды нет,то это имя перменной, макроса и т.д.*/
strcat(isLabel,b);
};
}else{/*если команда уже есть, заполняем операнды*/
strcat(isOperand,"\nOperand ");
strcpy(temp,"");
itoa(countOperand++,temp,10);
strcat(isOperand,temp);
strcat(isOperand," :");
strcat(isOperand,b);
};/*if(strlen(isCommand)==0)*/
b=strtok(NULL,isSeparator);
}while(b);/*пока не ноль повторяем*/
/*+++ конец основного обработчика +++*/
};/*if(strlen(a))*/
/*если все строки пусты пропускаем вывод результата*/
i=strlen(isLabel)+strlen(isCommand)+strlen(isOperand)+strlen(isComment);
if(i)printf("%s%s%s%s",isLabel,isCommand,isOperand,isComment);
};/*while(!feof(InputFile))*/
/*закрываем файл*/
fclose(InputFile);
}/*main*/[/code]
Результат работы программы:
[code h=200]
line 0 : ;1 modul
Comment :;1 modul
line 1 : Code SEGMENT byte public
Name :CODE
Directive :SEGMENT
Operand 1 :BYTE
Operand 2 :PUBLIC
line 2 : ASSUME cs:code
Directive :ASSUME
Operand 1 :CS:CODE
line 3 : PUBLIC Arr_Calc
Directive :PUBLIC
Operand 1 :ARR_CALC
line 4 : MaximumPositive PROC NEAR
Name :MAXIMUMPOSITIVE
Directive :PROC
Operand 1 :NEAR
line 5 : Arr EQU word ptr [BP+6]
Name :ARR
Directive :EQU
Operand 1 :WORD
Operand 2 :PTR
Operand 3 :[BP+6]
line 6 : N EQU word ptr [BP+4]
Name :N
Directive :EQU
Operand 1 :WORD
Operand 2 :PTR
Operand 3 :[BP+4]
line 7 : PUSH BP
Commanda :PUSH
Operand 1 :BP
line 8 : MOV BP,SP
Commanda :MOV
Operand 1 :BP
Operand 2 :SP
line 9 : ;aaaaa
Comment :;aaaaa
line 10 : MOV CX,N
Commanda :MOV
Operand 1 :CX
Operand 2 :N
line 11 : LES SI,Arr
Commanda :LES
Operand 1 :SI
Operand 2 :ARR
line 12 : ;bbbbb
Comment :;bbbbb
line 13 : mov bx,si
Commanda :MOV
Operand 1 :BX
Operand 2 :SI
line 14 : jmp short NewMaxH
Commanda :JMP
Operand 1 :SHORT
Operand 2 :NEWMAXH
line 15 : LoopMax: add si,4
Label :LoopMax
Commanda :ADD
Operand 1 :SI
Operand 2 :4
line 16 : cmp dx,ES:[SI+2]
Commanda :CMP
Operand 1 :DX
Operand 2 :ES:[SI+2]
line 17 : jg noMax
Commanda :JG
Operand 1 :NOMAX
line 18 : je okCheckLow
Commanda :JE
Operand 1 :OKCHECKLOW
line 19 : ;ccccc
Comment :;ccccc
line 20 : newMaxH: mov dx,es:[si+2]
Label :newMaxH
Commanda :MOV
Operand 1 :DX
Operand 2 :ES:[SI+2]
line 21 : newMaxL: mov ax,es:[si]
Label :newMaxL
Commanda :MOV
Operand 1 :AX
Operand 2 :ES:[SI]
line 22 : jmp short noMax
Commanda :JMP
Operand 1 :SHORT
Operand 2 :NOMAX
line 23 : ;ddddd
Comment :;ddddd
line 24 : okCheckLow: cmp ax,es:[si]
Label :okCheckLow
Commanda :CMP
Operand 1 :AX
Operand 2 :ES:[SI]
line 25 : jl newMaxL
Commanda :JL
Operand 1 :NEWMAXL
line 26 : ;eeeee
Comment :;eeeee
line 27 : noMax: loop loopMax
Label :noMax
Commanda :LOOP
Operand 1 :LOOPMAX
line 28 : RET 6
Commanda :RET
Operand 1 :6
line 29 : Arr_Calc ENDP
Name :ARR_CALC
Name :ENDP
line 30 : Code ENDS
Name :CODE
Name :ENDS
line 31 : END
Directive :END[/code]
Некоторые директивы не определяются(пока не разобрался почему):
Name :ARR_CALC
Name :[b]ENDP[/b]
line 30 : Code ENDS
Name :CODE
Name :[b]ENDS[/b]и могут быть проблемы с
;, всё что после - считается комментарием.
Удачи!