Правила генерации машинного кода
Пусть в качестве машинного языка выступает язык программирования Бейсик. Его особенностью является обязательная нумерация строк и отсутствие символьных меток. Поэтому в операторах перехода в качестве меток используют номера строк, на которые нужно передать управление.
Для построения МП-автомата по переводу ОПЗ в машинные коды и его семантических процедур введем ряд внутренних переменных:
P | - | счетчик вспомогательных переменных; |
STR | - | счетчик строк (этот счетчик вводится ввиду специфики выбранного выходного языка - Бейсика, где обязательна нумерация строк; при трансляции в другие выходные (машинные) языки этот счетчик не нужен); |
Кроме того, организуем таблицу меток, которая реализует отображение символьных меток исходного языка в номера строк машинного языка:
Метка | Номер строки |
Эта таблица потребуется в дальнейшем для замены символьных меток на номера строк, что также является особенностью Бейсика как выходного языка.
Рассмотрим работу МП-автомата.
1. Если элемент входной строки ‑ идентификатор или константа, то он заносится в стек (в исходном виде, т.е. не условное обозначение, а имя из таблицы идентификаторов или константа из таблицы констант); вспомогательные переменные и константы переносятся без изменения.
2. Для каждой операции и оператора определяется арность, т.е. количество операндов, и соответствующая семантическая процедура.
3. После выполнения каждой семантической процедуры в выходную строку заносится символ <ВК>, счетчик строк STR наращивается на единицу и заносится в начало новой строки.
Семантические процедуры для операторов и операций приведены в табл. 3.1.
Таблица 3.1
Лексема | Действия |
НП | Извлечь из стека два элемента, занести в выходную строку текст "REM Начало процедуры арг2, арг1" |
КП | Занести в выходную строку текст "REM Конец процедуры" |
DFD BFD DFT CHAR | Извлечь из стека арг1 - число переменных k; извлечь из стека k аргументов; занести в выходную строку текст "REM Вещественные переменные арг1, арг2,..,аргk" |
КО | Извлечь из стека два аргумента |
УПЛ | Извлечь из стека два аргумента, занести в выходную строку текст " IF NOT(арг2) THEN GOTO арг1" |
БП | Извлечь из стека один аргумент, занести в выходную строку текст "GOTO арг1" |
: | Извлечь из стека один аргумент, занести в таблицу меток арг1 и значение счетчика STR |
+ * > < | Извлечь из стека два аргумента, нарастить счетчик вспомогательных переменных Р, занести в выходную строку текст "Rp = арг2 <операция> арг1", занести в стек Rp. |
:= | Извлечь из стека 2 аргумента и занести в выходную строку текст " арг2 = арг1 " |
В стеке арг1 – это элемент, находящийся в вершине стека. Увеличение номера аргумента показывает его удаление от вершины стека и обратно порядку занесения элементов в стек.
Для арифметических выражений в целях уменьшения количества операторов присваивания и временных переменных возможен вариант формирования строки "(арг2 <операция> арг1)" и занесение ее в стек как единого аргумента для последующих операций и операторов. Недостатком такого подхода является избыточность круглых скобок в выражениях.
В языке Бейсик символьных меток не существует, поэтому необходим дополнительный просмотр сгенерированного текста с целью замены в нем символьных меток на номера строк в соответствии с построенной таблицей меток.
3.3 Комплексный пример перевода ОПЗ исходной программы в машинный код
Рассмотрим комплексный пример генерации машинного кода на языке Бейсик по ОПЗ исходной программы, которая была построена в примере, рассмотренном в лабораторной работе № 2.
MAIN 1 1 НП A1 A2 2 DFD 1 1 КО A1 378 := A2 .73 := CALC2 2 НП
SUM MULT 2 BFD 2 2 КО A1 A2 + 3.2 > M1 УПЛ P БП М1: SUM A2 A1 + :=
P : MULT A1 A2 SUM + * := КП КП
Последовательность действий МП-автомата изобразим в виде таблицы (табл. 3.2), в строке которой будем записывать состояние стека, счетчика переменных P, счетчика строк STR после обработки элемента ОПЗ, а также сформированный фрагмент машинного кода.
Таблица 3.2
Шаг | Элемент ОПЗ | Стек | P | STR | Машинный код |
0. | ‑ | ‑ | |||
1. | MAIN | MAIN | |||
2. | 1 MAIN | ||||
3. | 1 1 MAIN | ||||
4. | НП | ‑ | 1 REM Начало процедуры MAIN | ||
5. | A1 | A1 | |||
6. | A2 | A2 A1 | |||
7. | 2 A2 A1 | ||||
8. | DFD | ‑ | 2 REM Вещественные переменные А1, А2 | ||
9. | |||||
10. | 1 1 | ||||
11. | КО | ‑ | |||
12. | A1 | A1 | |||
13. | 378 A1 | ||||
14. | := | ‑ | 3 A1=378 | ||
15. | A2 | A2 | |||
16. | .73 | .73 A2 | |||
17. | := | ‑ | 4 А2=.73 | ||
18. | CALC | CALC | |||
19. | 2 CALC | ||||
20. | 2 2 CALC | ||||
21. | НП | ‑ | 5 REM Начало процедуры CALC | ||
22. | SUM | SUM | |||
23. | MULT | MULT SUM | |||
24. | 2 MULT SUM | ||||
25. | BFD | ‑ | 6 REM Вещественные переменные SUM, MULT | ||
26. | |||||
27. | 2 2 | ||||
28. | КО | ‑ | |||
29. | A1 | A1 | |||
30. | A2 | A2 A1 | |||
31. | + | R1 | 7 R1=A1+A2 | ||
32. | 3.2 | 3.2 R1 | |||
33. | > | R2 | 8 R2=R1>3.2 | ||
34. | M1 | M1 R2 | |||
35. | УПЛ | ‑ | 9 IF NOT(R2) GOTO M1 | ||
36. | P | P | |||
37. | БП | ‑ | 10 GOTO P | ||
38. | М1 | M1 | |||
39. | : | ‑ | Занести в таблицу меток пару M1, 11 | ||
40. | SUM | SUM | |||
41. | A2 | A2 SUM | |||
42. | A1 | A1 A2 SUM | |||
43. | + | R1 SUM | 11 R1=A2+A1 | ||
44. | := | ‑ | 12 SUM=R1 | ||
45. | P | P | |||
46. | : | ‑ | Занести в таблицу меток пару P, 13 | ||
47. | MULT | MULT | |||
48. | A1 | A1 MULT | |||
49. | A2 | A2 A1 MULT | |||
50. | SUM | SUM A2 A1 MULT | |||
51. | + | R1 A1 MULT | 13 R1=A2+SUM | ||
52. | * | R1 MULT | 14 R1=A1*R1 | ||
53. | := | ‑ | 15 MULT=R1 | ||
54. | КП | ‑ | 16 REM Конец процедуры | ||
55. | КП | ‑ | 17 REM Конец процедуры |
После замены символьных меток на числовые получим следующий машинный код
1 REM Начало процедуры MAIN
2 REM Вещественные переменные А1, А2
3 A1=378
4 А2=.73
5 REM Начало процедуры CALC
6 REM Вещественные переменные SUM, MULT
7 R1=A1+A2
8 R2=R1>3.2
9 IF NOT(R2) GOTO 11
10 GOTO 13
11 R1=A2+A1
12 SUM=R1
13 R1=A2+SUM
14 R1=A1*R1
15 MULT=R1
16 REM Конец процедуры
17 REM Конец процедуры
Полученный текст на машинном языке соответствует всем требованиям языка Бейсик.