Niskopoziomowe C dopuszcza tylko :
Przetłumaczyć poniższe fragmenty programów z C do niskopoziomowego C (jako że zmienne są całkowitoliczbowe dla uproszczenia pomijam deklaracje):
if (a<b) { tmp = b; b = a; a = rmp; } while(a != b) { tmp = b; b = a % b; a = tmp; }i drugi fragment:
for(s=0, i=0; i<10; s+=i*i, i++);i trzeci:
a = (a+b)*(c=a-b)+d++;
Niskopoziomowe C z zadania 1 jest zbyt uproszczone żeby w nim zapisać poważne programy. Zaproponować rozszerzenia niskopoziomowego C z zadania 1 tak by zachować bliski związek z jezykiem maszynowym, ale żeby (po odpowiednim tłumaczeniu) dało się zapisać prawdziwe programy -- chodzi szczególnie o operacje na tablicach.
Maszyna stosowa operuje na liczbach całkowitych. Ma ona stos i dodatkową pamięć. Zmienne w dodatkowej pamięci są nazwane. Maszyna ma następujące instrukcje:
Maszyna stosowa została zmodyfikowana, tak że komórki pamięci dodatkowej są numerowane. Do maszyny dodano dwie nowe instrukcje: `pushi' która odczytuje (i usuwa) numer (liczbę) NR ze stosu, a natępnie umieszcza zawartość komórki NR na stosie, oraz `popi' która odczytuje (i usuwa) numer (liczbę) NR ze stosu, a natępnie pobiera wartość szczytu stosu i umieszcza w komórce NR.
Jak można wykorzystać te nowe instrukcje do obsługi tablic. Przetłumaczyć poniższy program w C na instrukcje maszyny stosowej:
for(i=0; i<100; i++) { a[i]++; }zakładając że `a' jest 100 elementową tablicą.
W niektórych przypadkach, np. jeśli program nie zawiera pętli, można obliczyć ile komórek stosu on potrzebuje (a także do których komórek się odwołuje w poszczególnych instrukcjach) i zastąpić odwołania do stosu odwołaniami do zmiannych. Pozwala to podać tłumaczenie takich programów maszyny stosowej (tej z zadania 3) na niskopoziomowe C, tak by jedna instrukcja maszyny stosowej odpowiadała jednej instrukcji niskopoziomowego C. Np. instrukcja stosowa `+' będzie tłumaczona na `s115 = s116 + s115;' (zakładająć że n-tej komórce stosu damy nazwę sn i że śledząc użycie stosu wyszło nam że komórka nr 116 jest szczytem stosu przed wykonaniem tej instrukcji). Przetłumaczyć stosową wersję trzeciego fragmentu z zadania 1 na niskopoziomowe C używająć naszkicowane wyżej tłumaczenie 1-1. Porównać to z bezpośrednim tłumaczeniem na niskopoziomowe C.