2016-04-21 1 views
2

J'ai essayé de faire un exercice où je dois écrire dans un vecteur de 20 éléments les 20 premiers nombres de séries de fibonacci, mais je ne peux pas comprendre pourquoi le code ne fonctionne pas correctement. Cela fonctionne pour les 10 premiers éléments de la série, mais il y a un problème que je ne peux pas reconnaître. Qu'est-ce que tu penses? Voici le code que j'ai écrit:EMU8086 at-il un bogue ou ai-je fait une erreur en écrivant ce code?

DIM EQU 20 
COUNT EQU 18 
.model small 
.stack 
.data 

vect dw DIM dup ? 

.code 
.startup 

mov ax,1 
mov bx,1 
mov cx,COUNT 

lea si,vect 

mov [si],1 
add si,2 

ciclo: mov [si],bx 
     mov dx,bx 
     add bx,ax 
     mov ax,dx 
     add si,2 
     LOOP ciclo 

.exit 
end 

MISE À JOUR

Je ne l'ai pas coller le code exactement tel qu'il apparaît dans mon programme. Le programme que je cours commence par:

ORG 100h 

Je ne pensais pas que c'était important, donc je l'ai laissé de côté. Est-ce important?

Voici ce que je vois quand je débogue mon code original. Je passe à ciclo: mov [si],bx. CX a 8 dedans.

enter image description here

Quand je seule étape le programme se termine et il dit alors PROGRAM HAS RETURNED CONTROL TO THE OPERATING SYSTEM comme le montre cette image:

enter image description here

Pourquoi est-ce qui se passe?

+4

Veuillez fournir une description plus détaillée du problème que _ "il y a un problème que je ne peux pas reconnaître" _. – Michael

+1

Votre émulateur n'est pas en faute. –

+0

Oui, c'était une erreur de copier/coller. En ce qui concerne la ligne "mov [si], 1", si je ne me trompe pas, Intel utilise peu endian, et en spécifiant la taille de 1 est plus correct, mais n'est pas si important. En tout cas merci pour l'aide, maintenant je vais poster deux captures d'écran car j'ai trouvé quelque chose d'étrange lors du débogage. Si vous voulez toujours m'aider, je serai reconnaissant. – Pecho

Répondre

0

J'ai testé votre code dans EMU8086 et trouvé deux petites erreurs: dot avant code et initialiser le segment de données. Voici votre code fixe:

DIM EQU 20 
COUNT EQU 18 
.model small 
.stack 
.data 

vect dw DIM dup ? 

.code       ;<================================= 
.startup 
mov ax, @data     ;<================================= 
mov ds, ax      ;<================================= 

mov ax,1 
mov bx,1 
mov cx,COUNT 

lea si,vect 

mov [si],1 
add si,2 

ciclo: mov [si],bx 
     mov dx,bx 
     add bx,ax 
     mov ax,dx 
     add si,2 
     LOOP ciclo 

.exit 
end 

capture d'écran suivante prouve que des œuvres les correctifs du grand programme (voir la suite de Fibonacci en bas à droite?):

enter image description here

+0

Je ne suis pas d'accord que votre correctif fait quoi que ce soit (en plus de la période manquante). La directive '.startup' émettra le code pour définir _DS_ de manière appropriée. –

+0

@MichaelPetch, dans mon EMU8086 cela n'arrive pas, je dois ajouter ces deux lignes pour le faire fonctionner. –

+0

Quelle version utilisez-vous? Sur 4.08 '.startup' génère un' mov' à 'ds' via le registre _DX_. Possible certaines versions plus anciennes ne le font pas correctement. –

3

La raison pour laquelle votre code est un échec est parce que votre code d'origine a ce au sommet:

ORG 100h 

en EMU8086 cela a pour effet secondaire de la création de votre programme en tant que DOS COM programme (pas un programme DOS EXE). Avec un programme COM - si vous placez les données avant le code, il commencera littéralement à exécuter votre DATA comme code. Dans votre cas, il a commencé à exécuter la poubelle dans votre tableau vect, puis a tenté (mais pas avec succès) d'exécuter votre code réel. C'est la cause de tout le comportement étrange que votre programme expose à la fois lorsqu'il est exécuté et quand il est débogué via EMU8086. Comme vous avez clairement une zone de données, et une pile supprimez simplement org 100h par le haut, ce qui permettra à EMU8086 d'exécuter votre code sous la forme d'un EXE DOS et non d'un programme COM DOS.


Si vous voulez créer un programme DOS COM, vous devrez supprimer la directive .stack. Déplacez le segment data après le dernier morceau exécutable de code, et dans ce cas, c'est le code créé par .exit. Cela garantit que les données ne sont pas exécutées en tant que code lorsque DOS démarre votre programme en haut. Ce n'est pas un problème avec les programmes DOS EXE dans EMU8086.

DIM EQU 20 
COUNT EQU 18 

org 100h    ; COM programs are placed 256 from beginning of 
        ; of segment so we need ORG 100h. This 
        ; also informs EMU8086 you want to make a COM program 
        ; and not an EXE program. 

        ; No Stack specified for a COM program as DOS 
        ; automatically places it at the top of the 64K segment 
        ; and grows downward toward the code and data. 

.model tiny   ; Normally COM programs are TINY model (CS=DS=SS) 

.code 
.startup    ; This isn't needed for COM programs but won't hurt. 

mov ax,1 
mov bx,1 
mov cx,COUNT 

lea si,vect 

mov word ptr [si],1 ; To avoid a bug we want to update the WORD at [si] 
        ; not the BYTE. 
add si,2 


ciclo: mov [si],bx 
     mov dx,bx 
     add bx,ax 
     mov ax,dx 
     add si,2 
     LOOP ciclo 
     .exit  ; Program exits here 

.data    ; Place the data after the code for a COM program 

vect dw DIM dup ? 

end