Afficher un registre a l'ecran [tasm]

Contenu du snippet

Je cherchais le moyen d'afficher un registre... Je pensais qu'il existait une petite fonction du bios qui permettait de le faire, et pi en fait non ;-(
Donc on est obligé de faire soi même une fonction pour afficher un registre, par exemple AX...
En fait j'affiche d'abord AH, puis avec la même fonction j'affiche AL.
Les valeurs sont affichées en Hexadécimal.
Aucun registre n'est modifié par ma fonction.

Source / Exemple :


;------------------------SEGMENT DE DONNEES-------------------------
;-------------------------------------------------------------------
_data segment public
	hex	db	'0123456789ABCDEF'
_data ends

;------------------------SEGMENT DE CODE----------------------------
;-------------------------------------------------------------------
_code segment public
	assume cs:_code, ss:_stack

	START:
		mov	ax, _data	;synchronise les segments data et ds
		mov	ds, ax
		
		mov	ax, 123Fh	;on choisit une valeur à afficher par exemple 123Fh
		call	AFFICHER_AX	;on appelle la procédure d'affichage de AX

		mov	ax, 4C00h	;fonction de fin du prog correcte
		int	21h		;int 21h (retour au dos)

	AFFICHER_AX:
		push	ax
			xchg	ah, al	   ;on échange ah et al
			call	AFFICHER_AL;de cette manière on affiche ah
			xchg	ah, al	   ;on rééchange ah et al
			call	AFFICHER_AL;pour afficher al
		pop	ax
		ret

	AFFICHER_AL:
		push	si bx ax		;(ax doit être tout en bas de la pile)
				mov	si, ax	;(dans le registre SegmentIndex on mets ax soit 12h)
				shr	si, 4	;(on décale de 4bits pour ne garder que x1h)
				and	si, 0Fh	;on se débarrasse du 1er quartet il reste 01h
				add	si, Offset hex ;on additionne à 01h l'@ de la chaine on obtient l'@ de '1'
				mov	al, [ds:[si]]	;on récupère le '1' dans al	
				mov	ah, 0Eh		;on prépare l'affichage avec la fonction OE du bios
				int	10h		;on affiche
			pop	ax		;on restaure ax
			push	ax		;et on le rebalance dans la pile
				mov	si, ax	;on recommence avec ax
				and	si, 0Fh	;mais cette fois plus décalage(on s'occupe du 2e octet)
				add	si, Offset hex
				mov	al, [ds:[si]]		
				mov	ah, 0Eh
				int	10h
		pop	ax bx si		;on restaure les registres
		ret

_code ends
;--------------------------------------------------------------------

;------------------------SEGMENT DE LA PILE--------------------------
;--------------------------------------------------------------------
_stack segment stack
	db 100h dup (?)			;déclare une pile de 256 octets
_stack ends
;--------------------------------------------------------------------

;------------------------SAUT AU DEBUT DU PROGRAMME------------------
	end START
;--------------------------------------------------------------------

Conclusion :


Possibilité d'améliorer le code, de le compléter en affichant les registres en décimal...
Si vous avez des commentaires, ou autres n'hésitez pas à poster...

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.