2011-10-22 3 views
0

Je suis en train d'écrire un programme qui entre une chaîne, la stocke en mémoire et la renvoie à l'écran. Mais j'ai de la difficulté à résoudre cette tâche.Erreur de boucle infinie dans le code assembleur TASM

Mon code source:

IDEAL 

MODEL small 
STACK 100h 

DATASEG 

beggining db 100 dup(0) 

CODESEG 

Start: 
    mov ax, @data 
    mov ds, ax 

    mov bx, offset beggining 

myloop: 

    mov ah, 06h 
    mov dl, 0ffh 
    int 21h 

    mov [bx], al 

    mov dl, [bx] 
    mov ah, 02h 
    int 21h 

    inc bx 

    cmp al, 13 
    je quit 

    jmp myloop 


quit: 

    mov ax, 4c00h 
    int 21h 


end Start 

Quand je lance le programme avec le code source ci-dessus ne fonctionne pas. Il va dans une boucle infinie.

Pourquoi mon programme n'imprime-t-il pas les caractères que j'ai tapés précédemment?

BTW J'écris dans TASM.

+0

Faussement mauvais titre pour une question raisonnablement fait ... :) – Mysticial

+1

S'il vous plaît donner l'URL ou toute autre ressource à partir de laquelle vous avez essayé de copier ce programme . –

Répondre

0

Alors que je ne suis pas capable de compiler et de tester votre code là où je suis en ce moment, je crois int 21h/06h n'attend pas qu'une touche soit pressée, il retourne simplement 0 pour no-key (ou extended key) . Si c'est le cas, votre programme trés rapidement TRASH mémoire. Je pense que vous avez besoin de 21h/07h pour attendre une clé si aucune n'est présente dans le tampon du clavier.

+0

Je ne m'en souviens pas non plus, mais [la liste d'interruptions de Ralf Brorws] (http://www.ctyme.com/intr/rb-2559.htm) indique que 'dl = 0ffh' a un comportement spécial. Pas que nous devrions déboguer ce genre de problème en 2011, mais là vous allez :) – user786653

+0

Ok, j'ai essayé d'utiliser le 07h et cette fois la boucle infinie ne s'est pas produite et elle montre même mon entrée. Mais pourquoi mon programme n'imprime-t-il pas les caractères que j'ai tapés? – Linas

+0

essayez d'utiliser ah comme 06 pour le personnage. Je ne me souviens pas si vous devez régler la sortie stdio pour utiliser 02 –

0

Vous souhaitez utiliser INT 21H la fonction 01, qui lit un caractère de STDIN et l'envoie par échos. Ainsi, au lieu de

mov ah, 06h 
mov dl, 0ffh 
int 21h 

Vous voulez:

mov ah, 01h 
int 21h 

Fonction 01h est d'entrée de la console "cuite". Il entre le caractère et les échos. Il vérifie également le contrôle-C et le contrôle-pause, et terminera votre programme si vous appuyez sur l'une de ces touches. Il pourrait également interpréter des caractères étendus comme Page Up, etc. Je ne me souviens pas. La fonction 07h est une entrée de console "brute". Il ne vérifie pas le contrôle-C ou ne fait aucun autre pré-traitement. Cela vous donne exactement ce qui a été entré.

Votre question indique que vous êtes censé sortir la chaîne après que l'utilisateur appuie sur Entrée, mais je ne vois aucun code qui affiche la chaîne que vous avez stockée à beggining.

(en passant, le mot est normalement orthographié « début »)