Questo è il testo dell'elaborato:
"Si ottimizzi un codice in linguaggio C che effettua il monitoraggio di un impianto chimico industriale mediante l’uso di Assembly inline. Ricevendo come input il pH di una soluzione contenuta in un serbatoio e, una volta impostate le soglie minima e massima per il funzionamento ottimale, il programma fornisce in uscita lo stato della soluzione in termini di acido (A), basico (B) e neutro (N). Il sistema deve portare sempre la soluzione allo stato neutro, accettando un transitorio di 5 cicli di clock; pertanto si richiede che al sesto ciclo di clock in cui il sistema sia allo stato A, venga aperta una valvola con soluzione basica (BS), e analogamente se allo stato B si apra la valvola con soluzione acida (AS). Il sistema deve inoltre fornire in uscita il numero di cicli di clock da cui si trova nello stato attuale.
Il programma deve essere lanciato da riga di comando con due stringhe come parametri, la prima stringa identifica il nome del file .txt da usare come input, la seconda quello da usare come output:
$ ./controller testin.txt testout.txt"
Mentre questo è la parte di codice asm che ho scritto io:
_asm_(
"CHECK: leab init, %%ah\n" //passo valori di init
" cmp $1, %%ah\n" //controllo se la macchina è accesa
" je RESET\n" //passo al controllo sul reset se la macchina è accesa
" movb $48, %%dh\n" //azzero contatore cicli se la macchina è spenta
"RESET: leab reset, %%al\n" //passo valori di reset
" cmp $0, %%al\n" //controllo se reset vale 0
" je ON\n" //se reset è 0 passo a ON
" movb $48, %%dh\n" //azzero contatore dei cicli se reset vale 1
" jmp CHECK\n" //passo al prossimo valore
"ON: leab ph, %%ah\n" //passo il valore del ph
" cmp $60, %%ah\n" //confronto il valore con 60
" jl ACIDO\n" //se è minore passo all'etichetta ACIDO
" cmp $80, %%ah\n" //confronto il valore con 80
" jg BASICO\n" //se è maggiore passo all'etichetta BASICO
" jmp NEUTRO\n" //passo all'etichetta NEUTRO
"ACIDO: movb $65, %%bl\n" //metto il carattere 'A' nel registro
" leab oldst, %%bh\n" //passo il valore dello stato precedente
" cmp %%bh, %%bl\n" //lo confronto con quello dello st. attuale
" je PLUS_A\n" //se sono uguali passo all'etichetta PLUS_A
" movb $48, %%dh\n" //altrimenti azzero i cicli di clock
" jmp CHECK\n" //passo al prossimo valore
"BASICO:movb $66, %%bl\n" //metto il carattere 'B' nel registro
" leab oldst, %%bh\n" //passo il valore dello stato precedente
" cmp %%bh, %%bl\n" //lo confronto con quello dello st. attuale
" je PLUS_B\n" //se sono uguali passo all'etichetta PLUS_A
" movb $48, %%dh\n" //altrimenti azzero i cicli di clock
" jmp CHECK\n" //passo al prossimo valore
"NEUTRO:movb $78, %%bl\n" //metto il carattere 'N' nel registro
" jmp PLUS_N\n" //passo all'etichetta PLUS_N
"NCK: leab oldst, %%bh\n" //passo il valore dello stato precedente
" cmp %%bh, %%bl\n" //confronto il valore dello st. prec. con quello dello st. att.
" je PLUS\n" //se sono uguali passo all'etichetta PLUS
" movb $48, %%dh\n" //se sono diversi azzero il numero di cicli di clock
" jmp CHECK\n" //e passo al prossimo valore
"PLUS_A:incb %%dh\n" //incremento di uno il numero di cicli di clock
" cmp $4, %%dh\n" //confronto il NCK con 4
" jg VLV_BS\n" //se NCK > 4 passo all'etichetta relativa alla valvola BS
" jmp CHECK\n" //altrimenti passo al prossimo valore
"PLUS_B:incb %%ch\n" //incremento di uno il numero di cicli di clock
" cmp $4, %%dh\n" //confronto il NCK con 4
" jg VLV_AS\n" //se NCK > 4 passo all'etichetta relativa alla valvola AS
" jmp CHECK\n" //altrimenti passo al prossimo valore
"PLUS_N:incb %%dh\n" //incremento di uno il numero di cicli di clock
" jmp CHECK\n" //passo al prossimo valore
"VLV_BS:leab $66$83, %%dl\n" //metto 'BS' nel registro
" jmp CHECK\n" //passo al prossimo valore
"VLV_AS:leab $65$83, %%dl\n" //metto 'AS' nel registro
" jmp CHECK\n" //passo al prossimo valore
:"=m" (bufferout_asm)
:"r" (bufferin), "r" (init), "r" (reset), "r" (st), "r" (nck), "r" (oldst)
:"%%eax", "%%ebx", "%%ecx", "%%edx"
);