Affichage de caractères avec NASM par macro

Fermé
.Enzo44. Messages postés 38 Date d'inscription jeudi 21 février 2013 Statut Membre Dernière intervention 28 mai 2014 - 22 avril 2014 à 06:16
.Enzo44. Messages postés 38 Date d'inscription jeudi 21 février 2013 Statut Membre Dernière intervention 28 mai 2014 - 25 avril 2014 à 17:42
Bonjour,
Je suis débutant en ASM et je suis en train de faire un affichage de caractères pixel par pixel par appel de macro mais lorsque j'effectue l'affichage, il y a un décalage sur les coordonnées "y" (je ne veux pas utiliser l'intérruption car je veux redéfinir
la forme des caractères)

boot.asm:
; ......
; Appel de la macro
__DisplayChar 'A', 0x0F, 0, 0
; ......

video.asm:
; ......
%macro __DisplayPixel 3 ; COLOR, X, Y
PUSH AX
PUSH BX
PUSH CX
PUSH DX

MOV AH, 0x0C
MOV AL, %1
MOV BH, 1
MOV CX, %2
MOV DX, %3
INT 0x10

POP DX
POP CX
POP BX
POP AX
%endmacro
;......

char.asm:
; ......
%macro __DisplayChar 4 ; CHAR, COLOR, X, Y
PUSH AX
PUSH BX
PUSH CX
PUSH DX

MOV AX, %1

CMP AX, 'A'
JNE B

MOV BX, %3
MOV CX, %4
__DisplayPixel %2, BX, CX ; Je n'affiche qu'un pixel pour tester

B :

POP DX
POP CX
POP BX
POP AX
%endmacro
; .......

J'utilise NASM


A voir également:

8 réponses

Utilisateur anonyme
22 avril 2014 à 10:00
Bonjour

Tu fais un appel à DisplayPixel avec BX et CX comme coordonnées du pixe l :
__DisplayPixel %2, BX, CX 
Quand ta macro DisplayPixel est appelée, %2 et %3 sont remplacés par BX et CX, on a donc :
...
MOV AH, 0x0C
MOV AL, %1
MOV BH, 1 ; BH modifié -> BX n'EST PLUS la coordonnée X
MOV CX, BX ; CX modifié -> CX N'EST PLUS la coordonnée Y
MOV DX, CX
INT 0x10
...

Ta macro DisplayPixel modifie les registres BX et CX, donc les valeurs que tu passes à l'INT 10 ne sont pas celles que tu crois.
1
.Enzo44. Messages postés 38 Date d'inscription jeudi 21 février 2013 Statut Membre Dernière intervention 28 mai 2014 3
24 avril 2014 à 19:20
Merci
0
.Enzo44. Messages postés 38 Date d'inscription jeudi 21 février 2013 Statut Membre Dernière intervention 28 mai 2014 3
24 avril 2014 à 20:22
Mais y'a-t-il un autre moyen que les variables pour accéder aux valeur de %3 et %4 (genre autres registres même si je pense pas qu'il y en ait d'autres, variables
que l'on peut supprimer à la fin de la macro...)
0
Utilisateur anonyme
24 avril 2014 à 21:42
Il y a un tas de solutions :
Tu peux modifier l'ordre des MOV dans DisplayPixel pour utiliser que tu passes dans BX et CX avant de les modifier
Soit tu ne passes PAS les coordonnées à DisplayPixel et tu décides que la coordonnée x doit être passée dans CX et la coordonnée y doit être passée dans DX.

Note que si tu utilises la première méthode, tu es obligé de toujours utiliser les mêmes registres pour passer x et y, puisque sinon tu retomberas sur le problème d'ordre d'exécution. Tu as donc intérêt à choisir la deuxième méthode qui de plus, t'économise quelques MOV devenus inutiles.
0

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

Posez votre question
.Enzo44. Messages postés 38 Date d'inscription jeudi 21 février 2013 Statut Membre Dernière intervention 28 mai 2014 3
Modifié par .Enzo44. le 25/04/2014 à 06:47
Au pire je peux toujours utiliser des fonctions
(si je me souvient bien on les appellent avec "call" et on les terminent par "ret")
mai je ne comprend pas pourquoi sur internet on trouve souvent des fonction
qui commence comme ça : .fonction, @fonction et @@fonction.
Sinon est-il possible de créer des variables que l'on peut supprimer ou rendre inaccessibles en dehors de la macro ?
0
.Enzo44. Messages postés 38 Date d'inscription jeudi 21 février 2013 Statut Membre Dernière intervention 28 mai 2014 3
25 avril 2014 à 07:03
J'ai essayé la deuxième solution mais ça ne marche pas

%macro __DisplayChar 4
PUSH AX
PUSH BX
PUSH CX
PUSH DX

CMP AX, 'A'
JNE B

MOV CX, %3
MOV DX, %4
__DisplayPixel %2

B :

POP DX
POP CX
POP BX
POP AX
%endmacro

%macro __DisplayPixel 1 ; COLOR, X, Y
PUSH AX
PUSH BX

MOV AH, 0x0C
MOV AL, %1
MOV BH, 1
INT 0x10

POP BX
POP AX
%endmacro

(boot.asm n'a pas changé)
0
Utilisateur anonyme
25 avril 2014 à 09:07
Qu'est-ce qui ne marche pas ? Tu as toujours un décalage des coordonnées ?

Tu as oublié le MOV AX, %1 au début de ta nouvelle version de __DisplayChar
0
.Enzo44. Messages postés 38 Date d'inscription jeudi 21 février 2013 Statut Membre Dernière intervention 28 mai 2014 3
25 avril 2014 à 17:42
Merci, je suis aveugle ^^
0