L'écriture d'une boucle while en assemblée
Je suis en train d'écrire une boucle while à l'assemblée avec un processeur 6502 et je ne peux pas comprendre comment écrire le code hexadécimal. J'ai vu des exemples écrits en utilisant le raccourci où il y a une étiquette à l'endroit où la boucle doit commencer et à la fin, mais je ne vois rien pour le code hexadécimal.
Les deux codes, je vois utiles sont:
- La comparaison d'un octet dans la mémoire de l'X reg (abréviation: CPX, hex: CE). Cela définit le Z drapeau à zéro en cas d'égalité et
- La branche X octets si Z flag = 0 (abréviation: BNE, hex: D0)
Pourquoi voulez-vous des codes hex au lieu d'utiliser un assembleur?
le code"? Qui IDE, assembleur ou le compilateur que vous utilisez? Quelle est votre expérience avec l'assembleur 6502 avez-vous déjà?
J'espère que vous n'allez pas nous dire que vous écrivez un 6502 programme sans l'aide d'un assembleur. De quoi êtes-vous à l'aide d'un système de développement? Un Apple ][ ? Ou quoi?
Essayer d'écrire un compilateur qui génère du code hex de sorte qu'il peut être exécuté sur une simulation de microprocesseur 6502.
Il est peut-être l'aide d'un microprocesseur formateur (par exemple, innovision-group.net/catalog/images/...). Ce sont de simples ordinateurs que vous pouvez programmer directement en code machine. Vous pouvez toujours utiliser un assembleur pour générer le code machine, mais vous avez encore entrer manuellement le code de l'ordinateur dans le système.
le code"? Qui IDE, assembleur ou le compilateur que vous utilisez? Quelle est votre expérience avec l'assembleur 6502 avez-vous déjà?
J'espère que vous n'allez pas nous dire que vous écrivez un 6502 programme sans l'aide d'un assembleur. De quoi êtes-vous à l'aide d'un système de développement? Un Apple ][ ? Ou quoi?
Essayer d'écrire un compilateur qui génère du code hex de sorte qu'il peut être exécuté sur une simulation de microprocesseur 6502.
Il est peut-être l'aide d'un microprocesseur formateur (par exemple, innovision-group.net/catalog/images/...). Ce sont de simples ordinateurs que vous pouvez programmer directement en code machine. Vous pouvez toujours utiliser un assembleur pour générer le code machine, mais vous avez encore entrer manuellement le code de l'ordinateur dans le système.
OriginalL'auteur jnhyf | 2011-05-16
Vous devez vous connecter pour publier un commentaire.
Voici un endroit pour vous de commencer: http://www.obelisk.demon.co.uk/6502/ . La page dispose d'un cross-assembleur, que vous pouvez exécuter sur votre PC. Que pourrait être un bon dev plate-forme pour vous.
Avant de faire quoi que ce soit, vous devez comprendre le principe de fonctionnement de la 6502. Ensuite, vous devez comprendre le logiciel du processus de développement qui comprend:
-- la préparation d'un "fichier source" soi-disant,
de la symbolique des instructions que vous
appel "raccourci"
-- à l'aide d'un
assembleur, la transposition de la source
fichier en instructions machine qui
le 6502 comprend
-- chargement de la
traduction dans le 6502
-- dire
le 6502 pour exécuter la traduction
instructions machine
Votre exemple de programme essaie de copier
LEN
mémoire d'octets à partir deSRC
àDST
.Vous format comme ceci:
Après que vous avez ajouté plus de lignes de déclaration (comme
END
, par exemple); et après avoir définiSRC
,DST
, etLEN
, vous enregistrez le tout dans un fichier appelé, disons,cploop.txt
.Puis vous dire que l'assembleur pour le traduire. L'assembleur est livré avec un fichier binaire 6502 code machine que la cam être représentés sous la forme d'octets hexadécimaux vous parlez.
Vous nourrir que de fichier de code machine de la simulation, 6502. Alors vous en quelque sorte dire le 6502 pour exécuter les opérations que le code machine incarne.
Vous vraiment besoin de diviser votre problème dans "comment puis-je écrire ce code dans 6502 code machine" et "comment puis-je convertir ce code hexadécimal". Comme il est, il est difficile de vous aider.
Il y a deux étapes: (1) écrire votre programme en langage d'assemblage, ce que vous appelez "raccourci" (un terme que je n'ai jamais entendu parler, d'ailleurs); (2) donner ce fichier de langage d'assemblage pour l'assembleur, puis crache les codes hex que vous voulez.
D'ailleurs, la réduction des changements de boucles sont plus efficaces - ils omettre la nécessité pour les comparer instruction, et ainsi que l'enregistrement de ces deux octets sont également n'importe où de 2 à 6 horloges plus rapide par itération (en fonction de la comparer et de mode d'adressage): LDX #LEN ; Commencer par le dernier octet _LOOP LDA SRC,X ; charger octet de la SRC dans le registre STA de l'heure d'été,X ; magasin qui octet dans l'heure d'été DEX ; la bosse de l'indice d'inscrire le point à la prochaine SRC et DST endroits BNE _LOOP ; si pas de zéro, allez déplacer le suivant
une chose que vous semblez être coincé sur l'existence de la "_LOOP" étiquette dans le code assembleur. Ce n'est qu'un assembleur de la directive, qui correspond à l'adresse à l'emplacement que l'instruction commence. Il n'est pas assemblé en quoi que ce soit dans le code machine qui est sortie au point où il est défini. Quand il est utilisé comme partie d'un opérande (c'est à dire, les arguments pour les instructions de montage), il est remplacé par l'adresse de l'instruction, c'est quand il est défini. Sur le 6502 c'est écrit octet le moins significatif en premier l'adresse $0300 est écrit "00 03" en code machine.
OriginalL'auteur Pete Wilson
Voici un exemple montrant la correspondance entre l'assemblée (ce que vous appelez "raccourci") et le code machine. Tout d'abord, voici le code assembleur pour l'algorithme, avec certains paramètres disparaît:
Bien sûr, vous ne pouvez pas transformer directement en code machine. Vous devez également remplir les valeurs de
len
,src
etdest
:La chose à comprendre au sujet de la
loop
nom est que, tout commesrc
est affectée de la valeur$1234
,loop
sera assignée à l'adresse de l'instruction après. Donc, dans ce cas, puisqueLDX #len
occupe 2 octets (comme je vous le montrerai bientôt),loop
est fixé à$4000 + 2 = $4002
. Ceci est fait automatiquement par l'assembleur, mais bien sûr vous pouvez faire tout cela sur le papier.Donc, qu'est-ce que le 6502 code machine pour le dessus de l'assemblage de programme?
Comment puis-je savoir cela? Eh bien, j'ai juste collé le programme ci-dessus en ligne assembleur 6502 à http://www.masswerk.at/6502/assembler.html. Il vous montre même la cartographie détaillée entre l'assemblée et le code machine:
Notez comment la valeur réelle de
LOOP
n'est même pas utilisé pour calculer le code machine pourBNE LOOP
, seulement son adresse relative par rapport à laBNE
d'instruction lui-même:F7
est -9, et la différence entre$400B
et$4002
est -9!Donc, si vous aviez à le faire à la main, vous devriez juste de traduire tout le reste en code machine, puis quand vous arrivez à un saut, vous calculez la différence entre la prochaine instruction à l'adresse de départ et la destination du saut de l'adresse. Il devrait être négative en arrière, sauts et positif pour les sauts.
OriginalL'auteur Cactus
Les instructions de branchement prendre un octet signé relative de l'adresse de l'opérande, qui est ajouté à l'adresse de la prochaine instruction à céder la direction de la cible. Depuis la direction de l'instruction occupe toujours la place de 2 octets, l'adresse de destination est l'adresse de la direction de l'instruction plus l' (signe étendu) opérande moins 2.
Exemples:
$D0 $00
: no-op: la direction générale passe à l'instruction suivante, indépendamment de la condition$D0 $FE
: points de branchement à lui-même, créer une boucle infinie siZ=0
.OriginalL'auteur Wumpus Q. Wumbley
Un
while
déclaration signifie vraiment:Avec 6502, rien de tout cela va être très simple, à moins que vous pouvez faire beaucoup d'hypothèses. Si la condition de test est toujours va être un registre, le les instructions de comparaison (cmp, cpx, cpy) et les instructions de branchement sont, de toute évidence, vous avez besoin pour 1.
Si ça va être un seul octet stocké dans la mémoire, alors vous avez besoin pour charger cet octet, puis à les comparer.
Si c'est une valeur de 16 bits stockés dans deux octets, vous devez charger et tester chaque valeur de l'octet.
Traiter avec des flotteurs? Si vous avez écrit ou disponible pour vous à virgule flottante de package (tels que le Commodore 64 ROM de BASE en virgule flottante routines), vous aurez besoin de les utiliser.
Vous pouvez voir pourquoi les langages de haut niveau ont des types de données.
Alors, vraiment, cela dépend du type de données que vous traitez, mais toute la mise en œuvre de
while
dans 6502 doit à peu près à suivre ci-dessus.Le cas précis que vous indiquez dans votre question, c'est OK si vous connaissez les données vous permettra de comparer sera toujours dans X et que votre destination sera toujours +127/-128 octets loin (limite de Bxx instructions).
OriginalL'auteur LawrenceC