Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2009, 20:43   #1
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию собрать команду из кода операции и операнда

Добрый день, эта тема не связана с тем как сделать программу на ассме, она связана с С++, но курсовая как раз мне сделать транслятор к ассму. У меня проблема получилась, я не знаю как собрать команду из КОП и операнда. Это происходит на втором этапе транслирования, после того как метки, их адреса;литералы,их адреса уже так сказать я занес в структуры массивов, но проблема у меня появилась на втором этапе транслирования. Я вот просто не понимаю как собрать команду, я ниже предоставлю таблицу машинных кодов и псевдокоманд для того чтобы вы видели с чем мне надо работать:
Код:
/* Таблица машинных команд */
MACHINE_OPERATION MOT[46]=
{                   /*                            NUM  */
   {"ADD ", 0x5,0x0}, /*  A=A+<adr>                   1  */
   {"ADX ",-0xA,0x4}, /*  A=A+X                       2  */
   {"CALL",-0x3,0x0}, /*  [SP]=PC, SP=SP+1, PC=adr    3  */
   {"DEC ",-0xA,0x3}, /*  A=A-1                       4  */
   {"DIV ", 0x8,0x0}, /*  A=A/<adr>                   5  */
   {"DVX ",-0xA,0x7}, /*  A=A/X                       6  */
   {"IN  ",-0xC,0x1}, /*  Y=<port>                    7  */
   {"INC ",-0xA,0X2}, /*  A=A+1                       8  */
   {"JC  ", 0xC,0x0}, /*  IF flag C JUMP adr          9  */
   {"JE  ",-0x1,0x0}, /*          E                   10 */
   {"JMP ", 0x9,0x0}, /*  JUMP adr  ( PC=adr )        13 */
   {"JNC ", 0xD,0x0}, /*  IF NOT(flag C) JUMP adr     14 */
   {"JNE ",-0x2,0x0}, /*              E               15 */
   {"JNS ", 0xF,0x0}, /*              S               16 */
   {"JNZ ", 0xB,0x0}, /*              Z               17 */
   {"JS  ", 0xE,0x0}, /*          S                   11 */
   {"JZ  ", 0xA,0x0}, /*          Z                   12 */
   {"LDA ", 0x1,0x0}, /*  A=<adr>                     18 */
   {"LDAX",-0xD,0x1}, /*  A=[X]                       21 */
   {"LDX ", 0x2,0x0}, /*  X=<adr>                     19 */
   {"LDY ",-0x4,0x0}, /*  Y=<adr>                     20 */
   {"LOOP",-0x6,0x0}, /*  X=X-1,if(X>0) JMP adr       22 */
   {"MASP",-0xB,0x9}, /*  A=SP                        31 */
   {"MAX ",-0xB,0x3}, /*  A=X                         23 */
   {"MAY ",-0xB,0x5}, /*  A=Y                         24 */
   {"MLX ",-0xA,0x6}, /*  A=A*X                       25 */
   {"MSPA",-0xB,0xA}, /*  SP=A                        32 */
   {"MUL ", 0x7,0x0}, /*  A=A*<adr>                   26 */
   {"MXA ",-0xB,0x4}, /*  X=A                         27 */
   {"MXY ",-0xB,0x7}, /*  X=Y                         28 */
   {"MYA ",-0xB,0x6}, /*  Y=A                         29 */
   {"MYX ",-0xB,0x8}, /*  Y=X                         30 */
   {"NEG ",-0xA,0x8}, /*  A=A*-1                      33 */
   {"NOP ", 0x0,0x0}, /*  No Operation                34 */
   {"OUT ",-0xC,0x2}, /*  <port>=Y                    35 */
   {"POP ",-0xB,0x2}, /*  [SP]=A , SP=SP+1            36 */
   {"PUSH",-0xB,0x1}, /*  A=[SP] , SP=SP-1            37 */
   {"RET ",-0xC,0x4}, /*  PC=SP  , SP=SP-1            38 */
   {"SBX ",-0xA,0x5}, /*  A=A-X                       39 */
   {"STA ", 0x3,0x0}, /*  <adr>=A                     40 */
   {"STAX",-0xD,0x2}, /*  [X]=A                       43 */
   {"STOP",-0xC,0x3}, /*                              44 */
   {"STX ", 0x4,0x0}, /*  <adr>=X                     41 */
   {"STY ",-0x5,0x0}, /*  <adr>=Y                     42 */
   {"SUB ", 0x6,0x0}, /*  A=A/<adr>                   45 */
   {"ZERO",-0xA,0x1} /*  A=0                          46 */
};

/* Таблица псевдокоманд */
char   POT[5][4]=
  {
   "BSS",
   "CON",
   "END",
   "EQU",
   "ORG"
  };
В таблице машинных команд я понимаю что означает там: -0xD (STAX), 0x7 (MUL); это как раз и есть код операции, но как можно собрать команду из КОП и вычесленого из него значения операнда? А вот как еще обходиться при этом с таблой всевдокоманд?
Даю еще скрин проги препода, чтобы не писать много а всего лишь вы мне показали там что и на каких строках.
Изображения
Тип файла: jpg Безымянный.jpg (58.1 Кб, 47 просмотров)
Olejik вне форума Ответить с цитированием
Старый 06.06.2009, 21:09   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

У вас в таблице маш. команд даны сами оп коды, соответствующей длины, операнды в ней будут зависить от отдельных битов оп кода.
Почитайте напр. это и
http://www.intel.com/design/processo...als/253666.pdf
http://www.intel.com/design/processo...als/253667.pdf

Правда у вас похоже не для x86, но принцип скорее всего тот же.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 06.06.2009 в 21:45.
Goodwin98 вне форума Ответить с цитированием
Старый 06.06.2009, 21:51   #3
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

спасибо, сейчас почитаем )
Olejik вне форума Ответить с цитированием
Старый 06.06.2009, 21:54   #4
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Ребят, а -0xA,0x4 знак 'минус' что обозначает и что значит 0xA и 0x4 смещение и сколько байт занимает в памяти?
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 06.06.2009, 22:06   #5
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

там что то не понятно (
я всеголишь не понимаю, почему вот например в строке 0002, где start, там стоит -C001 или почему в строке 0006, где add, стоит 5602? Лан, первые символы это коды операций,а откуда остальные три символа берутся?
Olejik вне форума Ответить с цитированием
Старый 06.06.2009, 22:09   #6
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

Цитата:
Сообщение от MalCer Посмотреть сообщение
Ребят, а -0xA,0x4 знак 'минус' что обозначает и что значит 0xA и 0x4 смещение и сколько байт занимает в памяти?
Вообще как я понял занимает или 2 байта или 1 байт, типа слово или два а что значит минус не знаю... это непонятно )
Olejik вне форума Ответить с цитированием
Старый 06.06.2009, 22:15   #7
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Цитата:
там что то не понятно
Не не не! Все ясно, я просто C плохо знаю, просто спросил.
Простите за флуд!
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 06.06.2009, 22:43   #8
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Может быть не правильно, но вот какие мысли мне пришли после наблюдения на картинку.
Числа в опкоде это первый и последний полубайт.
Если перед командой стоит минус, значит эта команда не требует указания операндов, т.е. -0xA,0x4 так и останется A004 h.
Если он не стоит, значит после команды будет смещение операнда, т.е. "ADD ", 0x5,0x0 станет 5 h +смещение напр x (50h) в итоге получится 5050. А если смещение 601h , то получим 5601h.
Насчет псевдокоманд.
ORG - устанавливает текущий аддрес
BSS - переменная
END - конец кода
EQU - константа(правда как она выражается здесь я не пойму)
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 06.06.2009 в 23:35.
Goodwin98 вне форума Ответить с цитированием
Старый 06.06.2009, 23:08   #9
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Совсем недавно делал ассемблер для DOS(текстовый вариант скажем так - показывает сгенеренный код)
http://dump.ru/file/2285357
Может быть чем то поможет.
Правда это сделано просто топорным способом - ярый пример индусского кода
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 06.06.2009, 23:55   #10
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

да, на счет этого я тоже думал, но LDY в строке 0014 все это предположение рушит в пух и прах (
но на следующем скрине показывает что sty что то откуда то берет и мне просто не понятно что вообще они берут
а еще я нарисовал укрупненный алгоритм второго прохода ассма
Изображения
Тип файла: jpg 1.jpg (40.7 Кб, 120 просмотров)
Тип файла: jpg 123.jpg (36.1 Кб, 34 просмотров)
Olejik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не удается собрать программу Миша Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 23.12.2008 23:16
Собрать статистику счетчика. Djonson PHP 1 01.03.2008 18:35
Выдернуть куски кода из html-кода trafbite Помощь студентам 7 18.08.2007 13:51