View Full Version : assembler 6502 cmp cpy cpx
Ciao ragazzi ho un dubbio nel linguaggio assembler 6502 in particolare nelle istruzioni di confronto
Ho letto che le tre istruzioni di confronto sono usate per settare i bit dello Stato del Processore; la relazione tra i valori confrontati e i bit di Stato è:
A, X, o Y < memoria ---> N=1, Z=0, C=0
A, X, o Y = memoria ---> N=0, Z=1, C=1
A, X, o Y > memoria ---> N=0, Z=0, C=1
Ma facendo qualche prova con gli emulatori in rete alcune cose non tornano; per esempio:
confronto tra FF e 2F dove l'emulatore mi restituisce N=1, Z=0, C=1
confronto tra 1 e fF dove l'emulatore mi restituisce N=0, Z=0, C=0
etc..
vi ringrazio anticipatamente
cdimauro
14-02-2015, 16:29
Qui (http://www.6502.org/tutorials/compare_beyond.html) trovi tutto sui confronti, e in effetti sembra che la prima tabella ricalchi il funzionamento della CMP.
Che emulatore hai usato? Inoltre FF sta nell'accumulatore e 2F in memoria (o come immediato)?
lorenzo001
14-02-2015, 18:38
In realtà il flag N assume il valore del bit 7 del risultato della sottrazione tra i due operandi. La tabella è
A, X, o Y < memoria ---> N=*, Z=0, C=0
A, X, o Y = memoria ---> N=0, Z=1, C=1
A, X, o Y > memoria ---> N=*, Z=0, C=1
* bit 7 di Reg-Operand
Qui (http://www.6502.org/tutorials/compare_beyond.html) trovi tutto sui confronti, e in effetti sembra che la prima tabella ricalchi il funzionamento della CMP.
Che emulatore hai usato? Inoltre FF sta nell'accumulatore e 2F in memoria (o come immediato)?
Utilizzo l'emulatore disponibile qui:
http://skilldrick.github.io/easy6502/
Negli esempi che ho scritto:
FF sta nell'accumulatore e 2F in memoria
1 nell'accumulatore e FF in memoria
In realtà il flag N assume il valore del bit 7 del risultato della sottrazione tra i due operandi. La tabella è
A, X, o Y < memoria ---> N=*, Z=0, C=0
A, X, o Y = memoria ---> N=0, Z=1, C=1
A, X, o Y > memoria ---> N=*, Z=0, C=1
* bit 7 di Reg-Operand
Ci avevo pensato ma nell'esempio sopra citato:
in A--> 1 e in memoria --> FF
provando nell'emulatore online ho N=0 Z=0 e C=0
quindi non capisco..:mc:
magari è un problema dell'emulatore..
cdimauro
15-02-2015, 07:47
In realtà il flag N assume il valore del bit 7 del risultato della sottrazione tra i due operandi. La tabella è
A, X, o Y < memoria ---> N=*, Z=0, C=0
A, X, o Y = memoria ---> N=0, Z=1, C=1
A, X, o Y > memoria ---> N=*, Z=0, C=1
* bit 7 di Reg-Operand
E' corretto.
Utilizzo l'emulatore disponibile qui:
http://skilldrick.github.io/easy6502/
Negli esempi che ho scritto:
FF sta nell'accumulatore e 2F in memoria
1 nell'accumulatore e FF in memoria
L'emulatore è lo stesso che usato tempo fa, e dovrebbe essere affidabile.
Nello specifico, ho provato con:
LDA #$ff
CMP #$2f
BRK
che mi ha restituito:
NV-BDIZC
10110001
Che è corretto, in quanto $ff-$2f = $d0.
Dunque è diverso da zero -> Z = 0.
E' negativo -> N = 1.
Non ha generato nessun riporto, quindi C è rimasto lo stesso -> C = 1. Attenzione, perché la CMP funziona nel seguente modo:
SEC
SUB
Dunque prima setta il carry, e poi esegue internamente la sottrazione. Ecco perché viene fuori C = 1: il carry è stato settato, ma non è stato poi "usato" dalla sottrazione.
Riguardo all'altra operazione abbiamo:
LDA #$01
CMP #$ff
BRK
che mi ha restituito:
NV-BDIZC
00110000
Anche questo è corretto, in quanto $01-$ff = $02.
E' diverso da zero -> Z = 0.
Non è negativo -> N = 0.
Ha generato un riporto, quindi C è cambiato -> C = 0.
Per cui la precedente tabella che avevi riportato in precedenza non è corretta. Scusami per non averlo verificato prima.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.