Pentru programarea unui dispozitiv se foloseşte o variantă simplificată a limbajului de asamblare.
Avem doar patru regiştri: AX, BX, CX şi DX. Dispozitivul are un procesor de mică performanţă,
aşa că regiştri pot stoca numai trei biţi, adică valori între 0 şi 7, inclusiv. Totuşi, în acest mini
assembly există instrucţiunile clasice din limbajul de asamblare pentru operaţiile aritmetice şi operaţiile
pe biţi, după cum urmează. În continuare vom descrie instrucţiunile limbajului. Pentru descrierea parametrilor
vom folosi reg, care poate semnifica oricare registru şi imm, care poate semnifica orice valoare
imediată, adică o constantă între 0 şi 7, inclusiv.
MOV reg,reg: Registrul din primul parametru ia valoarea registrului din al doilea parametru.
MOV reg,imm: Registrul ia valoarea imediată.
NOT reg: Se execută un NU logic pe registru.
AND reg,reg: Se execută ŞI logic între cei doi regiştri şi primul registru ia valoarea rezultatului.
AND reg,imm: Se execută ŞI logic între cei doi parametri şi registrul ia valoarea rezultatului.
OR reg,reg: Se execută SAU logic între cei doi regiştri şi primul registru ia valoarea rezultatului.
OR reg,imm: Se execută SAU logic între cei doi parametri şi registrul ia valoarea rezultatului.
XOR reg,reg: Se execută SAU EXCLUSIV logic între cei doi regiştri şi primul registru ia valoarea rezultatului.
XOR reg,imm: Se execută SAU EXCLUSIV logic între cei doi parametri şi registrul ia valoarea rezultatului.
MUL reg: Se înmulţeşte valoare din AX cu registrul din parametru şi rezultatul se stochează în DX:AX.
DIV reg: Se împarte valoarea din DX:AX cu registrul din parametru. Câtul se stochează în AX şi restul în DX. Dacă registrul este egal cu zero, sau câtul nu încape pe trei biţi, instrucţiunea nu este validă.
Notăm cu DX:AX un număr de şase biţi, biţii semnificativi fiind stocaţi în DX, iar biţii nesemnificativi în AX. De exemplu, dacă avem DX=3 şi AX=5, valoarea din DX:AX = DX * 8 + AX = 3 * 8 + 5 = 29
Operaţiile logice se execută pe fiecare bit în parte, după cum urmează:
Cerinţă
Ştiind în câte unităţi de timp se execută fiecare dintre cele 11 tipuri de instrucţiuni de mai sus şi o stare iniţială a regiştrilor, să se scrie un program, care duce la o stare dată a regiştrilor şi se execută în timp minim!
Date de intrare
Pe prima linie a fişierului de intrare miniasm.in se află patru numere separate prin câte un spaţiu, semnificând starea iniţială a regiştrilor. Pe a doua linie se află patru numere separate prin câte un spaţiu, semnificând starea finală a regiştrilor. Pe a treia linie se află 11 numere separate prin câte un spaţiu, semnificând numărul unităţilor de timp în care se execută fiecare tip de instrucţiune, respectând ordinea din enunţ.
Date de ieşire
Pe prima linie a fişierului de ieşire miniasm.out să se scrie numărul de instrucţiuni al programului şi numărul unităţilor de timp necesar pentru rularea acestuia, separate printr-un singur spaţiu. Pe următoarele linii să se scrie programul, cu câte o instrucţiune pe linie.
Restricţii
Fiecare număr de pe primele două linii ale fişierului de intrare va avea o valoare între 0 şi 7, inclusiv.
Cele patru valori date pe primele două linii vor semnifica regiştrii în ordinea: AX, BX, CX, DX.
Numerele de pe a treia linie a fişierului de intrare vor avea valori între 1 şi 100, inclusiv.
Fiecare instrucţiune scrisă în fişierul de ieşire va trebui să respecte exact formatul din enunţ, adică fără spaţii la început sau sfârşit, instrucţiunea scrisă cu litere mari, un singur spaţiu după instrucţiune, fără spaţii înainte sau după virgulă, numele regiştrilor scrise cu litere mari.
Se acordă punctaje parţiale, după cum urmează: numărul unităţilor de timp 50%, programul complet 50.