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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2011, 16:29   #1
Bizunov
Пользователь
 
Регистрация: 16.04.2011
Сообщений: 36
По умолчанию Простейший компилятор выражений типа X операция Y

Всем привет. Хочу написать сабж, чтобы одновременно изучать ассемблер и Делфи. Собственно, в Делфи проблем нет. Компиляторов ( в свой байт код ) и интерпретаторов на делфи я писал много, правда не до конца... Но это не важно, основы компиляции и интерпретации я знаю, так что, половина работы сделана.
А вот ассемблером заинтересовался совсем не давно, на этой неделе. Вообще, мечтаю написать свой компилируемый язык, по этому, изучение ассемблера неминуемо ))) И чтобы изучение не было скучным, решил написать простенький компилятор выражений типа:
X <+,-,*,/,(целочисленное)> Y
Как я себе представляю процесс компиляции:
1) Берем три токена, первое число, знак операции, второе число.
2) Далее, генерируем код, примерно такого содержания
Код:
mov eax, 2  ; первое число
mov ebx, 2  ; второе число
add eax,ebx ; в зависимости от знака
3) Добавляем код вывода результата на экран.
4) Запускаем какой нибудь компилятор ассемблера ( может я не правильно выразился ).

Основная проблема - шестнадцатеричная система счисления и вывод на экран. И еще, я сильно путаюсь в позициях ( память, файл ).

Так, для первого сообщения хватит, сейчас напишу второе. Я, конечно, извиняюсь за дабл пост, но если пихать все в одно сообщение, получится каша.
Bizunov вне форума Ответить с цитированием
Старый 28.06.2011, 16:37   #2
Bizunov
Пользователь
 
Регистрация: 16.04.2011
Сообщений: 36
По умолчанию

И так, вот то что мне нужно.
Код:
mov - копирование содежимого, как испольовать понятно
add - сложение, вроде все понятно
sub - вычитание
??? - умножение
??? - деление
Как видно, мне не хватает двух комманд - умножения и деления. Надеюсь, подскажите. (Вообще, интуиция подсказывает, что это mul и div, но я не уверен).
Далее, вывод на экран
Код:
mov  ah,9                     
int  021h
Кажется, это то, что мне нужно, но как и куда мне передать значение из регистра EAX после вычисления выражения? О! Вспомнил - вышеприведенный код выведет на экран строку по адресу в регистре bx, кажется, которая должна закончится 24h. Тогда такой вопрос, куда мне переместить значение из регистра EAX, что бы вывести его на экран? Чувствую, в этом тексте велика вероятность ошибки, так что, правьте )

Пока, все. С нетерпением жду ваших советов.
Bizunov вне форума Ответить с цитированием
Старый 29.06.2011, 16:54   #3
Bizunov
Пользователь
 
Регистрация: 16.04.2011
Сообщений: 36
По умолчанию

И так, я почти со всем разобрался. Осталось только сделать вывод результата на экран, поможите? Дело в том, что мне нужно конвертировать число в строку, а затем ее вывести, это я и не могу сделать...
Текущий код
Код:
program BasicCompiler;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  LVal: char;
  RVal: char;
  Symb: char;
  AsmC: string;
begin
  ReadLn( LVal );
  ReadLn( Symb );
  ReadLn( RVal );

  if  ( LVal in ['0'..'9'] )
  and ( RVal in ['0'..'9'] )
  and ( Symb in ['+','-','*','/'] ) then begin
    //Инициализация 16 бит режима, отступ
    AsmC := 'use16'+#13#10+
            'org 100h'+#13#10;
    //Загружаем переменные в регистры
    AsmC := AsmC + 'mov ah,[a]'+#13#10;
    AsmC := AsmC + 'mov al,[b]'+#13#10;
    //Выполняем операцию
    case ( Symb ) of
      '+': AsmC := AsmC + 'add ah,al'+#13#10;
      '-': AsmC := AsmC + 'sub ah,al'+#13#10;
      '*': AsmC := AsmC + 'mul ah,al'+#13#10;
      '/': AsmC := AsmC + 'div ah,al'+#13#10;
    end;
    //Инициализация переменных
    AsmC := AsmC + ';Variables'+#13#10;
    AsmC := AsmC + 'a db '+LVal+#13#10;
    AsmC := AsmC + 'b db '+RVal+#13#10;
  end else begin
    WriteLn( 'Input expression not correct' ); ReadLn; Halt;
  end;

  WriteLn( AsmC );
  ReadLn;
end.
Bizunov вне форума Ответить с цитированием
Старый 29.06.2011, 16:56   #4
Bizunov
Пользователь
 
Регистрация: 16.04.2011
Сообщений: 36
По умолчанию

Забыл сказать, компилирую в FASM.
Bizunov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Каким образом сохранить цвет. Типа в переменную типа TColor ? serres C++ Builder 5 07.12.2010 16:19
in Формула типа String out результат типа Double Gypsy Общие вопросы Delphi 3 16.04.2010 10:21
Запись числа типа инт в ячейку двумерного массива типа char AxenicX Помощь студентам 1 25.09.2009 00:35
Простейший firewall ytkopobot Помощь студентам 1 08.05.2008 13:14