2017-05-11 3 views
0

Je commence une nouvelle langue à l'école (assemblage), et je dois faire un travail pour cette classe. Je travaille sur DOSBox 0.74. J'ai besoin d'une fonction pour enregistrer dans un tableau toute la visière de contenu de la console, mais comment puis-je le faire? J'ai essayé,Enregistrer le contenu de la visière de la console dans un tableau (assemblage)

salva_ecran proc 
     xor  bx,bx 
     mov  cx,25*80 

salva:   
     mov dl, es:[bx] 
     mov consoleText[bx], dl 
     inc bx 
     cmp bx, cx 
     jb salva 
     ret 
salva_ecran endp 

mais cela n'a pas fonctionné. Ma variable est consoleText db 80 dup (25 dup (?),13,10). Ps: Je suis vraiment nouveau à ce sujet, donc désolé si la question est ridicule ou le code est mauvais et inefficace.

Répondre

1

définition consoleText est octets 80x27 (pas 25x82!), Et ceux qui sont inutiles 13,10 toute façon, comme vous les remplacer par mov consoleText[bx], dl, donc tout ce dont vous avez besoin pour le stockage est consoleText db 80*25 dup (?).

mov dl, es:[bx] peut lire la RAM vidéo du mode texte, si le es est défini sur 0B800h (non visible à partir de votre code). Mais la RAM vidéo en mode texte en 80x25 (mode 03h je pense) utilise deux octets par caractère, le premier octet de la paire est le code ASCII étendu, le deuxième octet est l'attribut avec couleurs, voir probablement https://en.wikipedia.org/wiki/VGA-compatible_text_mode et d'autres ressources. Donc vous lisez seulement la moitié des caractères et la moitié des couleurs, pour lire tous les caractères je pense que mov dl, es:[bx*2] fonctionnerait en mode réel (ou utiliser si au lieu de bx, dans le cas où le mode 16b réel ne peut pas utiliser le mode d'adressage bx*2). Nouvelle ligne commence dans la mémoire vidéo juste après la ligne précédente, il n'y a pas 13,10 dans la RAM vidéo, en fait ce sont des glyphes de polices valides (13 étant une note musicale IIRC), donc les premiers 160 octets à B800:0000 est la première ligne de 80 caractères (avec des couleurs), puis à l'adresse 160 (B800:00A0) la deuxième ligne commence immédiatement.

Il n'est pas clair comment vous vérifiez/imprimez le contenu stocké, il est donc difficile de dire ce qui "ne fonctionne pas". Utilisez toujours le débogueur pour vérifier que vous obtenez les valeurs comme prévu. Pour sauvegarder/restaurer le mode plein texte VRAM, vous devez bien sûr stocker également les couleurs (donc tampon de 80 * 25 * 2 octets), et les restaurer comme ça, et cela ne fonctionnerait que lorsque l'application en cours ne changera pas le début de VRAM, ou d'autres registres de contrôle VGA, affectant la sortie (c'est-à-dire uniquement dans l'état vierge mov ax,3 int 10h). Un tel magasin/restauration ne restaure pas la position du curseur BIOS et probablement d'autres variables du BIOS, donc si vous voulez vraiment enregistrer "console", il y a plus à faire que de simplement copier le contenu VRAM.

Mais dans l'ensemble, cela ressemble à un bon essai, le code est simple et droit au but, ne vous inquiétez pas de la performance tout en apprenant les bases. Mais apprendre à utiliser efficacement le débogueur est essentiel pour votre avenir (de l'apprentissage en Assemblage).

0

Chars sur l'écran viennent par paires: char et la couleur, donc il vous suffit de doubler votre taille variable (et le compteur!):

.model small 
.stack 100h 
.data 

some_text db 'StackOverflow!',13,10,'$' 
consoleText db 80*25*2 dup(?) ;◄■■ * 2 

.code 
    mov ax, @data 
    mov ds, ax 

    mov ax, 0b800h 
    mov es, ax 

    mov ah, 9 
    lea dx, some_text 
    int 21h 

    call salva_ecran 

    mov ax, 4c00h 
    int 21h 

salva_ecran proc 
     xor  bx,bx 
     mov  cx,25*80 * 2 ;◄■■ * 2 

salva:   
     mov dl, es:[bx] 
     mov consoleText[bx], dl 
     inc bx 
     cmp bx, cx 
     jb salva 
     ret 
salva_ecran endp 
+0

Merci homme! Vous avez résolu mon problème! : D –

+0

qu'en est-il au moins de mentionner «rep movsw» avec un CX de 2000? ;) – Tommylee2k

+0

@ JoãoRodrigues, j'attends toujours que tu cliques sur la coche ✔ de ma réponse :) –