2016-04-17 1 views
1

Nous avons eu une activité sur la mise en boucle dans le langage assembleur. Notre tâche est simple: afficher les chiffres de 0 à 9 avec des espaces entre chaque nombre. J'ai obtenu le code pour travailler dans l'invite de commande en utilisant la commande 'debug' dans WINDOWS 7 dans notre école. Mon portable est Windows 10 et j'ai récemment découvert qu'il n'y a pas de commande 'debug' dans l'invite de commande. J'ai donc essayé d'écrire mon code dans DOSBox 0.74 (plus tard, peut-être). Chaque fois que je l'exécute dans DOSBox, les programmes raccroche soudainement, puis se bloque. Voici le codeL'instruction de bouclage qui fonctionne dans les instructions de débogage de Windows 7 ne fonctionnera pas dans DOSBox 0.74

mov cx,0a 
mov ah,02 
mov dl,30 
int 21 
mov bl,dl 
mov dl,20 
int 21 
mov dl,bl 
inc dl 
loop 0107 
int 20 

Quelqu'un peut-il m'expliquer pourquoi DOSBox plante?

Voici un pic d'échantillon du programme de travail qui se déroule dans cmd sous Windows 7:

enter image description here

+0

Utilisez-vous 'debug' dans DOSBox? Je demande car on ne sait pas comment vous exécutez votre programme dans DOSBox. –

+1

Pourquoi finissez-vous avec 'INT 20h' au lieu de' MOV AH, 4Ch; INT 21h'? – i486

+0

Pourquoi ne pas utiliser une étiquette comme cible de saut pour 'loop'? –

Répondre

1

Bien que votre question ne soit pas un doublon de cet autre Stackoverflow question il semble partager certaines similitudes. À savoir inattendu se bloque ou comportement inhabituel. Il semblerait que les versions DEBUG.EXE disponibles pour MS-DOS ne fonctionnent pas toujours correctement dans DOSBox. Cela peut être dû au fait que DOSBox n'est peut-être pas compatible à 100% en émulant un vrai PC/matériel (et DOS). Cela peut entraîner certains programmes et/ou OS à ne pas fonctionner comme prévu lorsqu'il est utilisé dans DOSBox.

J'ai modifié mon précédent Stackoverflow answer pour suggérer que divers programmes MS-DOS DEBUG.EXE peuvent ne pas fonctionner correctement lorsqu'ils sont exécutés sous DOSBox. Ross Ridge confirme qu'il peut dupliquer votre problème avec le débogueur de DOS 6.22 lorsqu'il est exécuté dans DOSBox.

Il existe une version de DEBUG.COM qui a été publiée par FreeDOS qui semble bien fonctionner avec DOSBox. J'ai fait la version FreeDOS de DEBUG.COM disponible pour le téléchargement de mon site Web. Alternativement, vous pouvez télécharger le ZIP File de Softpedia et extraire DEBUG.COM.

+1

Note pour clarifier ma déclaration, je peux reproduire le problème avec le MS-DOS 6,22 DEBUG.EXE lorsqu'il est exécuté sous DOSBox. Il fonctionne correctement lorsqu'il est utilisé sous MS-DOS 6.22 dans une machine virtuelle. –

+0

@RossRidge J'étais ambigu, ma réponse a voulu dire que précisément ils courent mal sous DOSBox (Ils ne fonctionnent correctement dans leur environnement natif - DOS). Je l'ai impliqué quand j'ai dit que la raison du problème était liée à la compatibilité DOSBox. –

0

AX est un registre volatile d'interruption DOS int 21h. Ainsi, le contenu de AH=02h sera remplacé par INT 21h appels. La seule source que je pourrais trouver pour faire référence à un document au sujet Interrupt Services from the Mississippi State University qui indique sur la première page:

BIOS (et la plupart des DOS) ISRs Préserver le contenu des registres - Sauf hache

donc dans votre code

int 21  ; alters AX 
mov dl,bl ; AH is undefined 
inc dl  ; DL is increased correctly 
loop 0107  

vous supposer à tort que AH contiendrait encore la valeur de 02h. Ce n'est pas forcément le cas.

ajouter Ainsi, une MOV AH, 02h avant l'instruction de boucle et votre programme devrait exécuter moins erronée, parce que votre INT 21h situé à 0107 puis appelleraient la DOS fonction correcte 02h.

+1

BIOS/DOS est plutôt incohérent en ce qui concerne la convention d'appel. Bien que la véritable AX soit souvent bousillée, ce n'est pas toujours le cas. [Liste d'interruption de Ralf Brown] (http://www.ctyme.com/rbrown.htm) est généralement considéré comme la Bible pour les interruptions DOS. Dans ce cas, les docs officiels utilisent pour dire _AL_ et _AH_ n'ont pas été touchés. Les documents Ralf [INT 21h/AH = 2] (http://www.ctyme.com/intr/rb-2554.htm) montrent que _AL_ est détruit et renvoie le caractère imprimé. Je dirais que ce n'est pas le source de son problème. Il a fini par que la question n'a pas été lié au code, mais avait un problème avec son 'DEBUG' prg –