17.12.2018, 02:38 [+3 UTC]
в нашей команде: 3 237 чел. | участники онлайн: 4 (рекорд: 19)

:: РЕГИСТРАЦИЯ

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.58 (11.12.2018)

Общие новости:
13.12.2018, 11:36

Форум:
16.12.2018, 14:55

Последний вопрос:
16.12.2018, 22:36

Последний ответ:
16.12.2018, 21:15

Последняя рассылка:
17.12.2018, 00:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
19.04.2010, 18:43 »
Vitvol
Спасибо Вам огромное!!!!!! [вопрос № 177926, ответ № 260912]
07.06.2010, 22:44 »
Фоменко Роман Федорович
Отличный, очень умный ответ! [вопрос № 178982, ответ № 261966]

РАЗДЕЛ • С / С++

Создание программ на языках C и C++.

[администратор рассылки: Андрей Кузнецов aka Dr_Andrew (Старший модератор)]

Лучшие эксперты в этом разделе

Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 166
solowey
Статус: Студент
Рейтинг: 145
Андрей Кузнецов aka Dr_Andrew
Статус: Старший модератор
Рейтинг: 73

Перейти к консультации №:
 

Консультация онлайн # 187548
Раздел: • С / С++
Автор вопроса: Посетитель - 397515
Отправлена: 25.09.2013, 18:18
Поступило ответов: 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

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

Состояние: Консультация закрыта

Oтветов пока не поступило.

Мини-форум консультации № 187548

Посетитель

ID: 337233

# 1

= общий = | 25.09.2013, 18:25 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

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

• Отредактировал: [неизвестный]
• Дата редактирования: 25.09.2013, 18:25


Посетитель

ID: 397515

# 2

= общий = | 25.09.2013, 18:26 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

с комментариями smile


Посетитель

ID: 397515

# 3

= общий = | 25.09.2013, 18:51 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Почему программа не может быть написана на С? Для чего нужно использовать С++?
Предоставляю программу на языке ассемблер (ограниченный список команд ассемблера, который должна распознавать программа) smile

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) Конец текста с точкой входа

Чекменёв Александр Анатольевич
Профессор

ID: 399103

# 4

= общий = | 25.09.2013, 21:14 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

На C++ удобнее. Но не критично. Более критично условие. Переформулируется ли задача, по сути, как "берётся строка, первое слово считается "командой", остальные "операндами""?


Посетитель

ID: 397515

# 5

= общий = | 26.09.2013, 20:53 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

, ну если так в действительности в ассемблере, то да

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 6

= общий = | 27.09.2013, 10:55 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Для всех:

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


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

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

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



Что ещё нужно изобретать?

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 7

= общий = | 04.10.2013, 20:31 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

smile
Смотрите код ТС 2.01:

/*Подключаем описание*/
#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 - точно не найдете код  smile  
*/

/*директивы ассеблера*/
	"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*/

Результат работы программы:
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


Некоторые директивы не определяются(пока не разобрался почему):
Name :ARR_CALC
Name :ENDP
line 30 : Code ENDS
Name :CODE
Name :ENDS

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

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

• Отредактировал: Зенченко Константин Николаевич (Старший модератор)
• Дата редактирования: 04.10.2013, 20:33

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.14885 сек.

© 2001-2018, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.58 от 11.12.2018