PDA

View Full Version : assembler 6502 cmp cpy cpx


vemi
14-02-2015, 14:37
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

vemi
15-02-2015, 00:57
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

vemi
15-02-2015, 00:58
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.