Autore Topic: Assembly sbc operazione di differenza  (Letto 2813 volte)

Hal9000

  • Neo-iscritto
  • *
  • Post: 6
  • Gioco Preferito: impossible mission
Assembly sbc operazione di differenza
« il: 15 Novembre 2019, 19:59:04 »
Salve,

se per la somma di due byte (aritmetica senza segno) l'eventuale riporto (carry) può essere memorizzato in un ulteriore locazione di memoria (parte bassa-parte alta contenente carry), nel caso della differenza fra due byte, l'eventuale prestito, che comporta l'azzeramento del carry (precedentemento impostato tramite sec) come viene gestito?

Grazie

eregil

  • Administrator
  • Utente
  • *****
  • Post: 706
  • Gioco Preferito: Impossible Mission
Re:Assembly sbc operazione di differenza
« Risposta #1 il: 16 Novembre 2019, 11:06:19 »
1. Imposti il flag di carry con SEC
2. Esegui la SBC
3. Verifichi il flag carry
3a. Se il carry è ancora impostato, non c'è stato prestito e non devi fare nulla di particolare
3b. Se il carry è stato resettato, c'è stato prestito e devi tenerne conto nella prosecuzione del programma

Un esempio semplice: hai un puntatore (byte basso-byte alto) a $FB-$FC. Vuoi aggiornare il puntatore facendolo puntare ad un indirizzo $20 byte più in basso.

Codice: [Seleziona]
LDA $FB     ; byte basso
SEC
SBC #$20
BCS noprest
DEC $FC     ; byte alto
.noprest
STA $FB

N.B. qui assumiamo che $FC non contenga già uno zero in partenza, perché si tratta di un puntatore. Di solito, quando si programma, i puntatori non contengono valori arbitrari, ma punteranno da qualche parte in RAM e non in pagina zero. Se operi con numeri arbitrari, in base a cosa stai facendo, può essere necessario aggiungere un qualche controllo.
Non rispondo a richieste private, di qualunque genere esse siano.
Per domande tecniche leggete le FAQ e usate l'apposito forum.
Per questioni amministrative contattate lo staff tramite il form Contatti sul sito.

Hal9000

  • Neo-iscritto
  • *
  • Post: 6
  • Gioco Preferito: impossible mission
Re:Assembly sbc operazione di differenza
« Risposta #2 il: 17 Novembre 2019, 01:47:57 »
Grazie

Hal9000

  • Neo-iscritto
  • *
  • Post: 6
  • Gioco Preferito: impossible mission
Re:Assembly sbc operazione di differenza
« Risposta #3 il: 17 Novembre 2019, 02:11:32 »
https://i.imgur.com/3DvE1pq.png

se ho ben capito...

MOD - Sostituita immagine con link. -eregil
« Ultima modifica: 17 Novembre 2019, 09:50:44 da eregil »

eregil

  • Administrator
  • Utente
  • *****
  • Post: 706
  • Gioco Preferito: Impossible Mission
Re:Assembly sbc operazione di differenza
« Risposta #4 il: 17 Novembre 2019, 10:10:35 »
Per cortesia, prendi visione del Regolamento, in particolare riguardo l'invio di immagini (art. 6). Sposto anche in Aiuto perché l'argomento si evolve verso le basi piuttosto che verso una produzione di codice (che è lo scopo della sezione Programmazione).

L'immagine che riporti, oltre a fare confusione tra operazioni di interi con segno e senza segno, non è corretta. La sottrazione 260-5=255 in binario viene scritta:

Codice: [Seleziona]
1 0000 0100 -
  0000 0101 =
  1111 1111

Torniamo all'esempio del puntatore in $FB (anche se poco realistico in questo caso). All'inizio hai

Codice: [Seleziona]
$FB: 04
$FC: 01

corrispondenti al byte basso e al byte alto di 260. Durante l'esecuzione di un blocco simile a quello di cui sopra si avrebbe:

Codice: [Seleziona]
LDA $FB     ; A ora vale #$04
SEC         ; imposta il flag carry
SBC #$05    ; ora A vale #$FF e il carry è resettato (prestito)
BCS noprest ; branch non eseguita, si passa alla DEC
DEC $FC     ; ora il valore in $FC passa a #$00
.noprest
STA $FB     ; e in $FB viene scritto #$FF

Se invece il valore in $FB fosse inizialmente #$08 (corrispondente alla sottrazione: 264-5=259), dopo la SBC nell'accumulatore sarebbe #$03, e il carry non sarebbe resettato (nessun prestito). Quindi la BCS eseguirebbe il salto alla STA, che scriverebbe #$03 in $FB, e la DEC non verrebbe eseguita, lasciando #$01 nella locazione $FC.
Non rispondo a richieste private, di qualunque genere esse siano.
Per domande tecniche leggete le FAQ e usate l'apposito forum.
Per questioni amministrative contattate lo staff tramite il form Contatti sul sito.

Hal9000

  • Neo-iscritto
  • *
  • Post: 6
  • Gioco Preferito: impossible mission
Re:Assembly sbc operazione di differenza
« Risposta #5 il: 17 Novembre 2019, 12:28:16 »
Ciao, si in effetti dopo aver pubblicato l'immagine, mi sono reso conto che avevo fatto confusione tra signed/unsigned, volevo correggere il danno, ma il forum dopo un tot di tempo non mi permetteva di correggere... :headshake:

L' ultimo esempio esempio da te postato ha chiarito ogni dubbio.

Grazie e ....ovviamente vi disturberò spesso  :mattsid: