Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
6 / 6 / 3
Регистрация: 19.09.2010
Сообщений: 173
1

Трансляция на ассемблер: промежуточный код для сложных действий

16.11.2015, 17:10. Показов 2966. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Есть следующее:

int a;
a = 5+(9*4);

В результате отработки польской записи вторая строка будет преобразована в:

a = 5 9 4 * +;

Вопрос, собственно, в том, можно ли подобное транслировать на язык ассемблера без промежуточного кода? Примерно такой алгоритм:

5 - в стек
9 - в стек
4 - в стек
* - извлекаем 2 элемента из стека и выполняем это действие над ними, результат в стек
//теперь стек имеет вид: 4 36 +
+ - извлекаем 2 элемента из стека и выполняем это действие, результат в стек.

Итого получится:

a = 41;

С другой стороны, расписывая всё это через промежуточный код:

int temp = 9*4;
int a = 5+temp;

Если со стеком реально осуществить такое, то какой вариант предпочтительнее(стек или промежуточный код)?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2015, 17:10
Ответы с готовыми решениями:

Увидеть промежуточный код и его пошаговое выполнение
Каким образом можно увидеть промежуточный код? Т.е., например, если я хочу увидеть устройство...

простое шифрование информации с превращение текста в промежуточный код
помогите пожалуйста с алгоритмом . допустим имеем список c энным количеством фраз, необходимо...

Дописать код для кнопки отмены действий пользователя
Запоминать каждое действие, которое делает пользователь, если после действия не произошла отмена,...

Разработать программу для реализации основных действий с двунаправленным динамическим списком (я правильно составила код?)
Разработать программу для реализации основных действий с двунаправленным динамическим списком:...

3
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
16.11.2015, 17:45 2
Лучший ответ Сообщение было отмечено Minchanin-Bel как решение

Решение

Цитата Сообщение от Minchanin-Bel Посмотреть сообщение
a = 5 9 4 * +;
Вопрос, собственно, в том, можно ли подобное транслировать на язык ассемблера без промежуточного кода?
Можно. Так работает Forth.

Вот пример:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
push 5         ; кладём число 5 в стек.
push 9         ; кладём число 9 в стек.
push 4         ; кладём число 4 в стек.
 
pop  eax       ; забираем число 4 из стека.
pop  ebx       ; забираем число 9 из стека.
mul  ebx       ; eax = 36 = 4 * 9
push eax       ; кладём число 36 в стек.
 
pop  eax       ; 36
pop  ebx       ; 5
add  eax, ebx  ; eax = 41 = 36 + 5
push eax       ; кладём число 41 в стек.
Цитата Сообщение от Minchanin-Bel Посмотреть сообщение
С другой стороны, расписывая всё это через промежуточный код:
int temp = 9*4;
int a = 5+temp;
Если со стеком реально осуществить такое, то какой вариант предпочтительнее(стек или промежуточный код)?
Думаю, пишущему виднее.
1
6 / 6 / 3
Регистрация: 19.09.2010
Сообщений: 173
16.11.2015, 18:02  [ТС] 3
Отлично, спасибо!

А преимущество есть у какого-либо из методов? Или же они, по сути, одинаковы?
1
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
17.11.2015, 06:16 4
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

Цитата Сообщение от Minchanin-Bel Посмотреть сообщение
А преимущество есть у какого-либо из методов? Или же они, по сути, одинаковы?
Нет, не одинаковы. Вот, безстековый способ.
Assembler
1
2
3
4
mov  eax, 9   ; eax = 9.
mov  ebx, 4   ; ebx = 4.
mul  ebx      ; eax = 36 = 9 * 4.
add  eax, 5   ; eax = 41 = 36 + 5.
Безстековый код, короче и быстрее. Выбирай.
1
17.11.2015, 06:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.11.2015, 06:16
Помогаю со студенческими работами здесь

Транслировать заданный код с языка Pascal в исходный код ассемблер
Транслировать заданный код с языка Pascal в исходный код ассемблерVar a:byte; b:byte; c:word;...

Скоростной промежуточный кеш для лог. анализаторов.
Есть идея сделать замедлитель для дешевых низкоскоростных логических анализаторов. Скоростной...

Промежуточный класс для реализации методов работы с базой данных.
Кто-нить писал промежуточный класс для реализации методов работы с базой данных? Если не жалко,...

Проектирование сложных систем - ООП. Покритикуйте код, пожалуйста!
Добрых суток. Недавно начал делать первые шаги в проектировании. Вроде, разобрался как строить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru