Консультация № 187548
25.09.2013, 18:18
100.51 руб.
0 7 0
Здравствуйте! Прошу помощи в следующем вопросе:
Считать из текстового файла код языка "Ассемблер", определить на каждой строке команды и операнды и вывести результат на экран
Например input.asm
mov ax, bx
add cx, 5
sh r bx,7
pop cx

На экран:
Строка 1:
Команда - mov
Операнд1 - ax
Операнд2 - bx
.
.
Строка 4:
Команда - pop
Операнд1 - cx

Реализовать на языке программирования С

Обсуждение

Неизвестный
25.09.2013, 18:25
общий
25.09.2013, 18:25
Здравствуйте. Чтобы получить ответ на данный вопрос, Вам, вероятно, желательно предоставить ограниченный список команд ассемблера, которые должна распознавать программа. Вряд ли кто-то за 100 рублей напишет вам программу, распознающую ВСЕ инструкции :)
И ещё: критично, чтобы программа была написана именно на чистом C, использование C++ недопустимо?
Неизвестный
25.09.2013, 18:26
общий
с комментариями
Неизвестный
25.09.2013, 18:51
общий
Почему программа не может быть написана на С? Для чего нужно использовать С++?
Предоставляю программу на языке ассемблер (ограниченный список команд ассемблера, который должна распознавать программа)

text segment 'code' ; (1) Начало сегмента команд
assume CS:text, DS:text ; (2) Сегментные регистры CS и DS
; будут указывать на сегмент команд
begin: mov AX,text ; (3) Адрес сегмента команд загрузим
mov DS,AX ; (4) сначала в AX, затем в DS
mov AH,09h ; (5) Функция DOS 09h вывода на экран
mov DX,offset message ; (6) Адрес выводимого сообщения
int 21h ; (7) Вызов DOS
mov AH,4Ch ; (8) Функция 4Ch завершения программы
mov AL,00h ; (9) Код 0 успешного завершения
int 21h ; (10) Вызов DOS
message db 'Hello $' ; (11) Выводимый текст
text ends ; (12) Конец сегмента команд
end begin ; (13) Конец текста с точкой входа
давно
Профессор
399103
482
25.09.2013, 21:14
общий
На C++ удобнее. Но не критично. Более критично условие. Переформулируется ли задача, по сути, как "берётся строка, первое слово считается "командой", остальные "операндами""?
Неизвестный
26.09.2013, 20:53
общий
, ну если так в действительности в ассемблере, то да
давно
Старший Модератор
31795
6196
27.09.2013, 10:55
общий
Для всех:

Ребята, есть установленные правила формирования строк в ассемблере(формы Бэкуса—Наура):

  • Общая структура строки

  • Структура команды и макрокоманды

  • Структура директив



Что ещё нужно изобретать?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
04.10.2013, 20:31
общий
04.10.2013, 20:33

Смотрите код ТС 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]

и могут быть проблемы с ;, всё что после - считается комментарием.
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа