- Utilizzare strategie di problem solving per lo sviluppo di programmi in linguaggio macchina
- Analizzare l'architettura dei sistemi di elaborazione a livello di CPU
- Comprendere e utilizzare i set di istruzioni base dell'architettura x86
- Configurare e utilizzare ambienti di simulazione ed emulazione (emu8086)
L'istruzione fondamentale per eseguire la sottrazione nell'architettura x86 è SUB (Subtract). Essa agisce sottraendo il valore dell'operando sorgente dall'operando destinazione e memorizzando il risultato in quest'ultimo.
La sintassi generale è la seguente:
SUB destinazione, sorgente
Sottrazione: destinazione = destinazione - sorgente
Gli operandi possono essere registri o locazioni di memoria, ma non possono essere entrambi locazioni di memoria contemporaneamente.
L'istruzione modifica i Flag della CPU, in particolare
- ZF (Zero Flag) se il risultato è zero
- CF (Carry Flag) se si verifica un prestito (borrow).
| Esempio | Descrizione |
|---|---|
| SUB AX, BX | Sottrae il contenuto di BX da AX e salva in AX |
| SUB CX, 10 | Sottrae il valore immediato 10 da CX |
| SUB [1000h], AL | Sottrae AL dal valore contenuto all'indirizzo 1000h |
Un concetto fondamentale da ricordare è che l'operazione di sottrazione, a livello hardware, viene spesso eseguita tramite la somma del complemento a due del sottraendo.
Il concetto di Prestito (Borrow)
Nella sottrazione decimale, se dobbiamo fare 15 - 8, "chiediamo un prestito" alle decine. In Assembly succede lo stesso. Quando sottraiamo un numero più grande da uno più piccolo, la CPU attiva il Carry Flag (CF), che in questo contesto chiamiamo Borrow Flag.
Lo Zero Flag (ZF)
Lo Zero Flag è un indicatore di stato che ci dice se l'operazione appena conclusa ha prodotto uno zero come risultato. È fondamentale per i futuri cicli (loop) e per i salti condizionati (istruzioni JZ/JNZ).
| Operazione | Risultato in AL | Stato Zero Flag (ZF) | Significato |
|---|---|---|---|
SUB AL, AL |
00h |
1 | Acceso: Il risultato è zero. |
MOV AL, 5SUB AL, 2 |
03h |
0 | Spento: Il risultato è diverso da zero. |
MOV AL, 0FFhINC AL |
00h |
1 | Acceso: AL è tornato a zero (Overflow del registro). |
LABORATORIO
Esercitazione con emu8086
Applicheremo l'istruzione SUB per risolvere problemi di calcolo aritmetico diretto e gestione dei registri.
- Emulatore emu8086 installato
- Manuale dei registri x86
1 Esercizio Guidato: Calcolo del resto
In questo scenario, simuliamo una cassa che deve calcolare il resto. Abbiamo un costo di 25h e un pagamento di 50h. Seguire i passaggi per scrivere il codice:
- Aprire emu8086 e cliccare su "New" -> "COM Template".
- Caricare il valore del pagamento nel registro AL.
- Sottrarre il valore del costo dal registro AL.
- Terminare il programma con l'istruzione RET.
ORG 100h
MOV AL, 50h ; Carico il pagamento (80 in decimale)
MOV BL, 25h ; Carico il costo (37 in decimale)
SUB AL, BL ; AL = AL - BL (Risultato: 2Bh)
RET
Istruzioni per l'analisi: Cliccare su Emulate, poi su Single Step. Osservare come cambiano i valori nei registri e prestare attenzione al pannello "Flags" dopo l'esecuzione di SUB.
2 Esercizio di Realtà: Differenza di Temperatura
Scenario: Un sensore rileva una temperatura ambiente di 30 gradi (1Eh) e una temperatura desiderata di 22 gradi (16h). Calcolare lo scarto di temperatura per attivare il condizionatore.
Consegna:
- Utilizzare il registro AH per la temperatura corrente.
- Utilizzare il registro BH per la temperatura target.
- Eseguire la sottrazione salvando il risultato in AH.
- Sfida: Cosa succede se la temperatura target è più alta della corrente? Prova a invertire i valori e osserva il Carry Flag (CF).
; Scrivi qui il tuo codice per lo scarto termico
; Ricorda di commentare ogni riga spiegando l'operazione
ORG 100h
; Inserire MOV e SUB qui...
RET
3 Verifica dei risultati
Al termine dell'esercitazione, compilare la seguente tabella di debug basandosi sull'emulatore:
| Operazione | Valore Finale Registro | Stato Zero Flag (ZF) |
|---|---|---|
| SUB AL, AL | 00h | 1 (Attivo) |