[mic] affichage d'un caractère

Voir le sujet précédent Voir le sujet suivant Aller en bas

[mic] affichage d'un caractère

Message  Florent le Dim 23 Mai 2010, 18:56

Bonjour,

j'aimerais savoir comment est calculé la position d'affichage d'un caractère

si je prends ce code :

Code:


MOV AX, 0xB800
MOV ES, AX
MOV AL, 'h'
MOV AH,10010111b
MOV [ES:0xA0], AX


Dans cette exemple tiré des slides, il s'affichera donc a la 1er colonne et 2ème ligne

Le A0 est calculé de quelle façon?

Merci de votre aide Wink

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  Bill le Dim 23 Mai 2010, 22:26

A0h est égal a 160 en décimal.
Vu qu'il y a 80 colonnes sur les écrans "par défaut" et que chaque caractères prend 2 bytes (1 pour le caractère (en ASCII étendu) et l'autre byte pour sa couleur)
C'est un peu comme si tu faisais "MOV [ES:80*2], AX"

Sinon, moi j'ai aussi une question par rapport à cette question.
Est-ce qu'on doit faire en sorte que ce programme soit bootable, c'est a dire qu'il doit donc assigner une signature de boot sur les 2 derniers octets du MBR ?
Si oui, comment arriver à l'octet 510 , parce que dans le code j'ai pas bien compris la ligne suivante :

times 510−($−$$ ) DB 0x90 ; 0x90=NOP −−> 510

si quelqu'un pourrait m'expliquer comment cette ligne nous fait arriver au byte 510 ce serait génial.
Merci.

Bill

Nombre de messages : 73
Age : 27
Prénom : Kevin
Statut : Ancien
Localisation : Brussels
Date d'inscription : 07/10/2009

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  DjMan42 le Dim 23 Mai 2010, 22:34

Pour l'afficher au milieu

Code:

MOV AX, 0xB800
MOV ES, AX
MOV AL, 'h'
MOV AH,10010111b
MOV [ES:80*2*12+40*2], AX

Et l'afficher une ligne plus bas

Code:

MOV AX, 0xB800
MOV ES, AX
MOV AL, 'h'
MOV AH,10010111b
MOV [ES:80*2*13+40*2], AX

On multplie par 2 parce quil faut un byte pour le caractère et un pour la couleur donc un word.
Pour avancer on fait + 2 sur la même ligne.
Pour passer à la ligne suivante on fait 80*2 car une ligne est constitué de 80 words
Donc il y'a 80 colonnes de words et 25 lignes.

Donc pour l'exemple il devrait afficher en première ligne, dernière colonne.
Une case plus loin. 2ème ligne, 1er colonne.

Code:
MOV AX, 0xB800
MOV ES, AX
MOV AL, 'h'
MOV AH,10010111b
MOV [ES:0xA0], AX

Mais, il faut le testé pour être sûr.


Dernière édition par DjMan42 le Lun 24 Mai 2010, 23:00, édité 2 fois

DjMan42

Nombre de messages : 219
Prénom : Eden
Statut : Etudiant 1er Indu
Localisation : Bruxelles
Date d'inscription : 28/10/2008

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  DjMan42 le Dim 23 Mai 2010, 22:38

Bill a écrit:A0h est égal a 160 en décimal.
Vu qu'il y a 80 colonnes sur les écrans "par défaut" et que chaque caractères prend 2 bytes (1 pour le caractère (en ASCII étendu) et l'autre byte pour sa couleur)
C'est un peu comme si tu faisais "MOV [ES*2], AX"

Sinon, moi j'ai aussi une question par rapport à cette question.
Est-ce qu'on doit faire en sorte que ce programme soit bootable, c'est a dire qu'il doit donc assigner une signature de boot sur les 2 derniers octets du MBR ?
Si oui, comment arriver à l'octet 510 , parce que dans le code j'ai pas bien compris la ligne suivante :

times 510−($−$$ ) DB 0x90 ; 0x90=NOP −−> 510

si quelqu'un pourrait m'expliquer comment cette ligne nous fait arriver au byte 510 ce serait génial.
Merci.

Cette ligne sert à faire une boucle infinie car un processeur ne doit jamais s'arrêté. (vu que le SE ne seras pas lancé).

DjMan42

Nombre de messages : 219
Prénom : Eden
Statut : Etudiant 1er Indu
Localisation : Bruxelles
Date d'inscription : 28/10/2008

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  Bill le Dim 23 Mai 2010, 22:38

DjMan42 a écrit:Pour l'afficher au milieu
Mais, il faut le testé pour être sûr.

Il faut être un mode réel pour pouvoir le tester.

Bill

Nombre de messages : 73
Age : 27
Prénom : Kevin
Statut : Ancien
Localisation : Brussels
Date d'inscription : 07/10/2009

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  Bill le Dim 23 Mai 2010, 22:40

DjMan42 a écrit:

Cette ligne sert à faire une boucle infinie car un processeur ne doit jamais s'arrêté. (vu que le SE ne seras pas lancé).

La boucle infinie, ce n'est pas plutot la ligne juste au dessus ?

Code:
JMP    $

Bill

Nombre de messages : 73
Age : 27
Prénom : Kevin
Statut : Ancien
Localisation : Brussels
Date d'inscription : 07/10/2009

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  DjMan42 le Dim 23 Mai 2010, 22:48

Bill a écrit:
DjMan42 a écrit:Pour l'afficher au milieu
Mais, il faut le testé pour être sûr.

Il faut être un mode réel pour pouvoir le tester.

Avec FREE-DOS mais, il faut absomument avoir la version professionnelle ( ce qui est le cas à l'école) sous windows sinon, il ne lance pas le plein écran. Et il faut le programme Tasm (asm sous windows).
Mais, il y'a un émulateur dos sur linux qui s'appelle dosemu (pg 46). Que j'ai installé mais maintenant je ne sais pas comment installé asm dedans, ni comment trouvé mon home,
il affiche C:\> .......


Avec ce code ça marche sans rien changé.

Code:
mov ax,0xb800
mov es,ax
mov al,'Z'
mov ah,10000111b
mov [es:80*2*3+10*2],ax
jmp $
times 510-($-$$) db 0x90
db  0x55,0xAA

Compilation "Tasm test.asm
édition des liens "Tlink test.obj"
ou "Tlink test"
éxecution "test"


Dernière édition par DjMan42 le Lun 24 Mai 2010, 00:37, édité 2 fois

DjMan42

Nombre de messages : 219
Prénom : Eden
Statut : Etudiant 1er Indu
Localisation : Bruxelles
Date d'inscription : 28/10/2008

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  Anthoblack le Dim 23 Mai 2010, 22:54

Bill a écrit:La boucle infinie, ce n'est pas plutot la ligne juste au dessus ?

Code:
JMP    $
Oui Smile

Anthoblack

Nombre de messages : 764
Age : 28
Prénom : Anthony
Statut : Ex-étudiant
Localisation : Bruxelles
Date d'inscription : 11/03/2008

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  Bill le Dim 23 Mai 2010, 22:56

DjMan42 a écrit:

Code:

times 510-($-$$) db 0x90

Ouais c'est tout une galère pour passer un mode réel ^^
Mais c'est la ligne (ci-dessus) que j'ai du mal a comprendre, je vois pas comment ça fait pour arriver à l'octet 510 =/

Bill

Nombre de messages : 73
Age : 27
Prénom : Kevin
Statut : Ancien
Localisation : Brussels
Date d'inscription : 07/10/2009

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  DjMan42 le Dim 23 Mai 2010, 22:59

Bill a écrit:
DjMan42 a écrit:

Code:

times 510-($-$$) db 0x90

Ouais c'est tout une galère pour passer un mode réel ^^
Mais c'est la ligne (ci-dessus) que j'ai du mal a comprendre, je vois pas comment ça fait pour arriver à l'octet 510 =/

Attendons le passage d'un prof qui sauras comment répondre.

DjMan42

Nombre de messages : 219
Prénom : Eden
Statut : Etudiant 1er Indu
Localisation : Bruxelles
Date d'inscription : 28/10/2008

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  DjMan42 le Lun 24 Mai 2010, 01:21

Pour changé le home il suffisait de faire "D:" en ouvrant le simulateur dos il indique où se trouve le home dans mon cas D.

DjMan42

Nombre de messages : 219
Prénom : Eden
Statut : Etudiant 1er Indu
Localisation : Bruxelles
Date d'inscription : 28/10/2008

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  nvs le Lun 24 Mai 2010, 14:18

Bill a écrit:
Code:
times 510−($−$$ ) DB 0x90 ; 0x90=NOP −−> 510
le but est de créer un exécutable de pile poil 512 octets.

comme 2 octets servent tout à la fin de signature de secteur de boot. il reste 510 octets à remplir au début.

Code:
times x n
est une directive de nasm qui permet de répéter x fois la séquence n. c'est expliqué ici. dans le cas qui nous occupe, on répète x fois
Code:
DB 0x90
c'est-à-dire qu'on met x fois l'octet 0x90 dans l'exécutable. le commentaire indique que 0x90 est le code de l'instruction NOP. remarquez qu'on s'en tape éperdument puisque ce remplissage est précédé de l'instruction
Code:
jmp $
qui boucle sur elle-même. le remplissage qui suit ne sera donc jamais exécuté : on peut remplir avec n'importe quoi, ça n'a aucune importance. seule la taille compte. il faut remplir
Code:
510−($−$$)
octets. ainsi,
Code:
times 510−($−$$) DB 0x90
Code:
times 510−($−$$) DB 0x0
Code:
times 510−($−$$) DB 15
Code:
times 510−($−$$) DB 30q
Code:
times 510−($−$$) DB 21h
Code:
times 510−($−$$) DB 0x80
Code:
times 510−($−$$) DB 0xFF
Code:
times 510−($−$$) DB -1
le font aussi Smile

reste le
Code:
510−($−$$)
on a vu qu'il faut en tout remplir 510 octets au début du segment.
Code:
$
est une directive nasm qui retourne, ici, l'adresse de l'instruction actuelle.
Code:
$$
est une directive nasm qui retourne l'adresse du début du segment (de la section) actuel(le). c'est expliqué ici. donc
Code:
$ - $$
donne la taille courante, en octets, du segment. et
Code:
510−($−$$)
le nombre d'octets à ajouter à la section pour que sa taille soit 510 Smile








_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  DjMan42 le Mar 25 Mai 2010, 16:45

Je viens de tester le code sur USB , il m'affiche un h blanc clignotant sur fond bleu.
Le seul inconvénient, c'est qu'il ne nettoie pas l'écran avant d'afficher le 'h'

Code:
mov ax,0xb800
mov es,ax
mov al,'h'
MOV AH,10010111b
mov [es:0xA0],ax
jmp $
times 510-($-$$) db 0x90
db  0x55,0xAA

Pour faire le programme bootable, il faut formater sa clé (récuperer d'abord les fichiers important).
Puis, éditer un fichier test.asm (par exemple), et le compilé "nasm test.asm -o test.bin -f bin"
Et pour visualiser le code machine "od -tx1 test.bin"

Ensuite pour ne pas avoir de problème de 1."sudo -s"
Et pour visualiser l'emplacement des périphérique.
2."cd /dev"
3."ls"

L'emplacement de la clé usb se trouve dans disk, il faut rentré dedans pour repérer la clé usb.

Dans mon cas j'entre dans "by-id", puis "ls" et là, je reconnait ma clé usb "usb-Generic_Flash_Disk_2DCEC517-0:0"

Je ressors pour me remettre dans ~/dev et la je tape:

"dd if=~/LMI/oral/test.bin of=/dev/disk/by-id/usb-Generic_Flash_Disk_2DCEC517-0:0"

(LMI/oral/test.bin "l'emplacement de du fichier")

Il m'indique ensuite:
Code:
1+0 enregistrements lus
1+0 enregistrements écrits
512 octets (512 B) copiés, 8,14e-05 s, 6,3 MB/s

Je redémarre en laissant la clé usb et il m'affiche le 'h'

DjMan42

Nombre de messages : 219
Prénom : Eden
Statut : Etudiant 1er Indu
Localisation : Bruxelles
Date d'inscription : 28/10/2008

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  DjMan42 le Mar 25 Mai 2010, 16:57

Pour afficher en 1er ligne, dernière colonne
Code:
mov ax,0xb800
mov es,ax
mov al,'h'
MOV AH,10010111b
mov [es:0x9E],ax
jmp $
times 510-($-$$) db 0x90
db  0x55,0xAA

Et pour la 2ème ligne, 1er colonne

Code:
mov ax,0xb800
mov es,ax
mov al,'h'
MOV AH,10010111b
mov [es:0xA0],ax
jmp $
times 510-($-$$) db 0x90
db  0x55,0xAA

DjMan42

Nombre de messages : 219
Prénom : Eden
Statut : Etudiant 1er Indu
Localisation : Bruxelles
Date d'inscription : 28/10/2008

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  Florent le Mer 26 Mai 2010, 19:33

Merci de vos réponses!

Code:

MOV AX, 0xB800
MOV ES, AX
MOV AL, 'h'
MOV AH,10010111b
MOV [ES:80*2*12+40*2], AX

désole de reposer la question mais j'ai encore quelques flous quand à l'affichage

pour le nombre de ligne on avance par 4 byte? car 80*2*12 le 12 correspond à 3 ligne?

ou je me trompe?

Merci de ton aide Wink

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  nvs le Mer 26 Mai 2010, 20:21

Florent a écrit:pour le nombre de ligne on avance par 4 byte? car 80*2*12 le 12 correspond à 3 ligne?

ou je me trompe?
tu te trompes. le 12 qui apparait ici, c'est pour écrire sur le 13e ligne... enfin je suppose car l'extrait de code que tu donnes est très petit Wink
















Mad

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  DjMan42 le Mer 26 Mai 2010, 21:29

Pour avancer d'une case on ajoute 2 bytes, donc pas 4 bytes. (un byte pour le caractère et un autre byte pour la couleur du caractère, la couleur de fond, ...).
MOV [ES:80*2*(LIGNES)+(COLONNES)*2], AX ; En commençant à la ligne 0 et colonne 0
- Dimension total (25 lignes * 80 colonnes). pg 67, 2ème ligne.

DjMan42

Nombre de messages : 219
Prénom : Eden
Statut : Etudiant 1er Indu
Localisation : Bruxelles
Date d'inscription : 28/10/2008

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  pbt le Mer 26 Mai 2010, 23:14

De mémoire un caractère ce sont deux bytes, l'un pour le code ASCII du caractère et l'autre pour ses attributs (les couleurs). Donc
  • 80 c'est le nombres de caractères sur une lignes,
  • 2 c'est le nombre de bytes que "prend" un caractère,
  • et 12 c'est le nombre de lignes que tu passes


Ensuite .... J'arrête là car je vois que tu as une réponse (problème de refresh) ...

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

Re: [mic] affichage d'un caractère

Message  Contenu sponsorisé Aujourd'hui à 01:10


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum