6
votes

Newline en 8086 Langue de montage: mon texte imprime l'escalier

Je reçois une sortie d'escalier comme celle-ci Entrez l'image Description ici

Mon programme fonctionne correctement, sauf que lorsque j'imprime une nouvelle ligne, puis imprimez Quelque chose dans la ligne actuelle, il montre sur la ligne suivante, mais avec un peu d'espace avant. p>


Le programme est le suivant: (Imprimer une table de plusieurs numéros de 0 à 9): P >

data_seg segment
    I DB 0D
    J DB 0D
    R DB ?
    DIVER DB 10D
    data_seg ends

stack_seg segment
    stack_seg ends

code_seg segment
    MAIN proc far
        assume cs:code_seg, ds:data_seg, ss:stack_seg
        MOV AX,data_seg
        MOV DS,AX

        FOR1:
            MOV J,0D
            FOR2:
            MOV AX,0H
            MOV AL,I
            MUL J
            DIV DIVER 
            MOV R,AH
            ADD AL,48D
            MOV AH,0EH
            INT 10H
            MOV AL,R
            ADD AX,48D
            MOV AH,0EH
            INT 10H

            MOV AX,32D
            MOV AH,0EH
            INT 10H
            INC J 
            MOV AX,0
            MOV AL,J
            SUB AX,10D
            JNZ FOR2
         INC I
         MOV AX,10D
         MOV AH,0EH
         INT 10H
         MOV AX,0
         MOV AL,I
         SUB AX,10D
         JNZ FOR1

        MOV AX,4CH
        INT 21H
        MAIN endp
    code_seg ends
end MAIN


9 commentaires

@JWW: Ce n'est pas [Windows] code, c'est DOS (pour le int 21h ) et en utilisant int 10h appels de bios autrement pour certains raison.


@Peter - pas de balise Microsoft; Étiquette Windows utilisée pour indiquer la plate-forme.


@JWW: La balise [dons] est la solution appropriée ici. Voir mon édition. Rien à propos de ce code n'a rien à voir avec Windows, à part le fait que certaines versions 32 bits de Windows sont livrées avec une machine virtuelle DOS. C'est pourquoi il y a une étiquette séparée pour DOS.


@Peter - Le terminateur de signe du dollar me dit que ce sont les technologies Microsoft. Masm l'utilisait pour la fin de la chaîne. Douteux c'est DOS en 2011; 15 ans trop tard.


@JWW: Tout ce que Microsoft n'a fabriqué est Windows. DOS existait en premier et est séparé. Et $ Les terminalisateurs ont commencé avec CP / M, copié par DOS mais pas Windows. (Windows utilise des chaînes C à 0 terminé dans des fonctions Winapi de bas niveau telles que des noms de fichiers). En outre, la question n'utilise aucune fonction de chaîne DOS, ce n'est que dans l'une des réponses, il est donc possible que cela ne soit même pas utile si l'appel de sortie DOS est juste là pour tester le code de démarrage sous DOS. Quoi qu'il en soit, s'il n'y avait pas de balise DOS, votre édition aurait peut-être été justifiée (mais la création d'une étiquette DOS aurait été meilleure). Mais c'est clairement faux.


@Peter - lol ... Dos est mort. Mais continuez à croire que les gens utilisent si cela vous rend heureux.


@JWW: DOS est toujours utilisé pour tester des cartes mères nouvellement développées et pour une raison folle de certaines écoles (beaucoup en Inde) enseignent la langue de l'Assemblée avec un DOS 16 bits. Beaucoup d'entre eux avec EMU8086. (Un peu comme Mars / Spim Gui Editor + Debugger + Simulator, mais pour 8086, y compris DOS). Je souhaite Dos était mort, mais ce n'est pas le cas. C'est un système d'exploitation intégré qui sort du chemin, je peux voir le cas d'utilisation. FreeDos.org est toujours maintenu, pour une utilisation dans des trucs intégrés apparemment. Je n'ai aucun intérêt à DOS, mais vous n'avez clairement pas passé beaucoup de temps à regarder dans la balise [x86] si vous pensez que DOS est mort.


@JWW: littéralement toutes les questions de DOS que j'ai vues sur les débutants sont des débutants qui sont bloqués pour l'école ou pour une raison pour une raison pour l'auto-enseignement (bien que autodidactu à on sait généralement "écrire leur propre système d'exploitation" en tant que Bios BIOS Legacy MBR Bootloader, SO x86-16 mais pas DOS, Just BIOS appelle). Mais il y a un volume important de ces questions. Les personnes qui utilisent réellement DOS pour tester l'ingénierie-échantillon mobos ou d'autres cas d'utilisation n'ont pas besoin de demander un autre duplicata sur la lecture / l'impression de numéros multi-chiffres ou comment div fonctionne donc.


@JWW: Plus important encore, vous Ne pouvez pas Exécuter ce code sur un système Windows de 64 bits moderne sans émulateur comme DosBox ou Bochs.


5 Réponses :


9
votes

Vous devez imprimer de nouvelles lignes et retour de chariot.


0 commentaires

-3
votes

Essayez de mettre des voies pour le retour de la ligne

mov ax, 4c00h ; return to ms-dos
int 21h


0 commentaires

3
votes

AS ANTHONY Dit, basé sur votre assembleur, vous devez faire un retour de chariot et une alimentation en ligne pour aller à la ligne suivante et placer le curseur au début de la ligne. Pour MASM, vous pouvez utiliser Call CRLF ou Imprimer des valeurs 0DH et 0AH respectivement.


0 commentaires

8
votes

Si vous utilisez EMU80X86, ce code doit le faire

mov dx,13
  mov ah,2
  int 21h  
  mov dx,10
  mov ah,2
  int 21h


0 commentaires

5
votes

Ceci imprimerait une nouvelle ligne:

1) Ajouter dans le segment de données: xxx

2) puis utilisez-le n'importe où que vous avez besoin d'une nouvelle ligne: < / p> xxx


1 commentaires

Cela a fonctionné pour moi .. Mais qu'est-ce que Linefeed DB 13, 10, "$" exactement?