Sistemi E Reti

Sottrazione

Emu8086: La sottrazione con SUB in Assembly x86.

Durata

50 minuti

Software

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, 5
SUB AL, 2
03h 0 Spento: Il risultato è diverso da zero.
MOV AL, 0FFh
INC 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.


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:

  1. Aprire emu8086 e cliccare su "New" -> "COM Template".
  2. Caricare il valore del pagamento nel registro AL.
  3. Sottrarre il valore del costo dal registro AL.
  4. 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)






Assembly, x86, Sottrazione, SUB, emu8086, Sistemi e Reti,