Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум по программированию на языке программирования Си..pdf
Скачиваний:
20
Добавлен:
05.02.2023
Размер:
1.39 Mб
Скачать

126

1.Ввести в алгоритмический язык обработку различного класса объектов: векторов, матриц, списков, структур.

2.Вести в алгоритмический язык оператор ввода.

3.Ввести понятие функций и подпрограмм.

4.Ввести режим пошагового выполнения программы.

5.Ввести расширенную диагностику ошибок.

9.5 Компилятор усеченного языка программирования Си

Построение компилятора для реального, хотя и усеченного, языка программирования является достаточно сложным делом. В литературе [ ] опубликован текст компилятора RatC для усеченного языка программиро­ вания Си. Исходный код этого компилятора имеется в файле . Дадим крат­ кое описание этого компилятора.

Этот компилятор генерирует ассемблерный код для некоторого вир­ туального микропроцессора, похожего на микропроцессор Intel 8080. В нем имеется четыре регистра:

PC — счетчик команд, SP — указатель стека, P — первый регистр данных, S — второй регистр данных.

Система команд следующая:

ldir.b

<метка>

загрузка данных записанных в байте по адресу <мет­

 

 

ка> в регистр P

ldir.w

<метка>

загрузка данных записанных в слове(16 разрядов по

 

 

адресу <метка> в регистр P

addr

<значение>

P=SP+значение

sdir.b

<метка>

сохранение байта их регистра P в байт по адресу

 

 

<метка>

sdir.w

<метка>

сохранение слова их регистра P в слово по адресу

 

 

<метка>

sind.b

 

(S)=P.b пересылка байта из P по адреcу заданному в

 

 

S

sind.w

 

(S)=P (пересылка слова из P по адреcу заданному в

 

 

S)

lind.b

 

считывание байта в регистр P, по адресу записанно­

 

 

му в P

lind.w

 

считывание слова в регистр P, по адресу записанно­

 

 

му в P

call

<метка>

вызов подпрограммы (адрес возврата заносится в

 

 

стек)

scall

 

вызов подпрограммы из вершины стека (адрес воз­

 

 

127

 

 

 

 

 

врата заносится в стек)

ujump

<метка>

безусловный переход

fjump

<метка>

переход если P==0

modstk

<значение>

SP=SP+значение

swap

 

обмен содержимого P и S

limm

<значение>

P=занчение

push

 

содержимое P заслать в стек

pop

 

вытащить из стека и записать в S

xchang

 

обмен значениями P и вершины стека

e

 

 

return

 

возврат из подпрограммы

scale

<значение>

умножить содержимое P на занчение

add

 

P=S+вершина стека

sub

 

P=S­P

mult

 

P=S*P

div

 

P=S/P остаток от деления в S

mod

 

S=S/P остаток в P

or

 

P=P|S поразрядное или

xor

 

P=P^S поразрядное исключающее или

and

 

P=P&S поразрядной И

asr

 

арифметический сдвиг вправо S на число бит запи­

 

 

санных в P, результат в P

asl

 

арифметический сдвиг влево S на число бит записан­

 

 

ных в P, результат в P

neg

 

поразрядная инверсия P

inc

 

P=P+1

dec

 

P=P­1

testeq

 

если S равно P то P=1 иначе P=0

testne

 

если S неравно P то P=1 иначе P=0

testlt

 

если S меньше P то P=1 иначе P=0

testle

 

если S меньше или равно P то P=1 иначе P=0

testgt

 

если S больше P то P=1 иначе P=0

testge

 

если S больше или равно P то P=1 иначе P=0

testult

 

если S меньше P то P=1 иначе P=0 (без знака)

testule

 

если S меньше или равно P то P=1 иначе P=0 (без

 

 

знака)

testugt

 

если S больше P то P=1 иначе P=0 (без знака)

testuge

 

если S больше или равно P то P=1 иначе P=0 (без

 

 

знака)