Ecriture caractère passé en paramètre

Résolu
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011 - 30 déc. 2008 à 19:19
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 - 1 janv. 2009 à 01:20
Bonjour, comme c'est dit dans le titre je voudrais afficher un caractère passé en paramètre avec l'interruption Bios 10h.

j'ai écris un code mais Nasm me sort une erreur : invalid combination of opcode and operands

voici le code :

[BITS 32] ; indique à NASM que l'on est en 32 bits


segment .text


global _printchar


_printchar:
              push    ebp
              mov     ebp, esp 
      
              mov     eax, [ebp+8]        ; 1er argument
              mov     ebx, eax
              mov AH, 0Ah                 ; Charge la fonction d'affichage
              mov AL, ebx                 ; Charge le caractère a afficher
              int 10h                     ; Active l'interruption video
      
              pop     ebp                 ;
              ret                         ; retour, la somme est dans
                                          ; EAX

voila j'espère que vous pourrez résoudre mon problème et bonne prog à tous !

14 réponses

cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
30 déc. 2008 à 21:15
mov al,ebx => Tu voulais mettre 32 bits dans 16 ? Un peu court, non ? Evidemment il fallait mettre les crochets pour dire "la valeur pointée par EBX".
int 10h ;Active l'int. vidéo => On active pas les interruptions, on les appelles. (En fait, l'instruction INT correspond à l'empilation des flags & registres ((je ne me souviens plus de ce qu'elle empile exactement)) et fait un call sur l'adresse se trouvant en segment 0, offset numint*2 ((2 bytes pour le segment et 2 autres pour l'offset)) ).

_printchar:
    push ebp                ; On sauve EBP
    mov ebp, esp
    mov eax, [ebp+8]        ; 1er argument
    mov ebx, eax
    mov ah, 0Ah                ; Choisis la fonction 0Ah, affichage
    mov al, [ebx]            ; Charge le caractère a afficher
    int 10h                    ; Appelle l'interruption video
    pop ebp
ret                            ; Retour, la somme est dans EAX
3
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
30 déc. 2008 à 21:20
Et, une question : veux-tu utiliser cette fonction sous Windows ? Ou fais-tu un OS ?
0
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011
30 déc. 2008 à 21:37
Bonjour,

Oui, je projette de faire un OS et donc je réécris une partie de la librairie C pour pouvoir l'utiliser correctement.

Voilà et Merci.
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
30 déc. 2008 à 21:41
J'espère que ton OS est en mode protégé sinon pas de 32 bits (et puis si c'est le cas, pas d'interruption 10h)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011
30 déc. 2008 à 21:45
Bonjour,

Oui, je vais le faire en 32 Bits (donc en mode protégé).
Donc, si j'ai bien compris je ne pourrais pas utiliser l'interruption 10h en 32 Bits ?

Voilà
0
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011
30 déc. 2008 à 21:45
Bonjour,

Oui, je vais le faire en 32 Bits (donc en mode protégé).
Donc, si j'ai bien compris je ne pourrais pas utiliser l'interruption 10h en 32 Bits ?

Voilà
0
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011
30 déc. 2008 à 21:46
Oups désolé pour le double poste.
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
30 déc. 2008 à 21:58
Eh non, tu devras travailler directement dans la mémoire vidéo.
Petit exemple (en ASM 16 bits on peut aussi le faire) :

mov [B800h:0000],69 ;caractère : 'F'
mov [B800h:0001],2 ;couleur : vert sur noir
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
30 déc. 2008 à 21:59
Ooops :

mov byte [0B800h:0000],69 ;caractère : 'F'
mov byte [0B800h:0001],2 ;couleur : vert sur noir
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
30 déc. 2008 à 22:01
Re-oops :
<hr size="2" width="100%" />mov ax,0B800h
mov ds,ax
mov byte [DS:0],69 ;caractère : F
mov byte [DS:1],2 ;attribut/couleur : vert sur noir
0
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011
30 déc. 2008 à 22:44
Bonjour,

et je fais comment pour obtenir le bon code à partir du caractère.

Voila
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
31 déc. 2008 à 00:32
C'est le code ASCII ...
Exemple :

mov ax,cs
mov ds,ax
mov si,lettre        ;DS:SI pointe vers lettre
mov ax,0B800h
mov es,ax
xor di,di            ;ES:DI pointe vers le caractère dans la mémoire écran
mov [ES:DI],[DS:SI]
mov [ES:DI+1],0        ;Fond noir

lettre DB 'K'
0
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011
31 déc. 2008 à 19:10
Bonjour,

et comment je peut faire pour afficher le caractère entrer en paramètre.

Voila et merci
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
1 janv. 2009 à 01:20
mov ax,0B800h
mov ds,ax
xor si,si
mov al,[lettre]
mov byte [DS:SI],al
mov byte [DS:SI+1],0

lettre DB 'K'
0
Rejoignez-nous