L'assemblage, l'impression ascii
J'ai un problème avec mon code assembleur. Je veux imprimer numéro mémorisé dans le registre cx, mais quand j'ai essayé de l'imprimer, imprimer de caractères ascii au lieu de l'ascii numéro, j'ai donc décidé d'écrire une procédure pour convertir les caractères ascii dans le fichier ascii de la valeur.
Problème, c'est que lorsque j'essaie d'appeler cette procédure, le programme se bloque et je dois redémarrer dosbox. Personne ne sait quoi de mal avec ce code? Merci.
P4 PROC
MOV AX,CX ;CX = VALUE THAT I WANT TO CONVERT
MOV BX,10
ASC2:
DIV BX ;DIV AX/10
ADD DX,48 ;ADD 48 TO REMAINDER TO GET ASCII CHARACTER OF NUMBER
PUSH AX ;SAVE AX
MOV AH,2 ;PRINT REMAINDER STORED IN DX
INT 21H ;INTERRUP
POP AX ;POP AX BACK
CMP AX,0
JZ EXTT ;IF AX=0, END OF THE PROCEDURE
JMP ASC2 ;ELSE REPEAT
EXTT:
RET
P4 ENDP
- Vous devez effacer
DX
avant de se diviser.DIV BX
diviseDX:AX
parBX
. - En dehors de ce que @user786653 dit, vous avez aussi le problème que vous aurez l'impression que les chiffres dans l'ordre inverse. E. g. 123 figure en tant que 321 avec votre code.
Vous devez vous connecter pour publier un commentaire.
Quelque chose comme ça pourrait fonctionner mieux pour l'impression d'une valeur décimale (le nouveau code est en minuscules):
Au lieu de l'impression de chaque personnage directement, il ajoute les caractères dans un tampon dans l'ordre inverse. Pour la valeur 123 il serait ajouter '3' au tampon[8], '2' au tampon[7] et de '1' à tampon[6] - ainsi, si vous imprimez la chaîne de départ au tampon+6, vous obtenez "123".
Je suis l'aide de MSNA de la syntaxe, mais j'espère que ça doit être assez clair.
undefined var: byte [buffer+9]
logique, mais ne peux pas comprendre ce depuis sa de ma première journée de l'apprentissage de l'assemblée, et je suis déjà bloqué à "comment faire pour convertir un nombre décimal en chaîne et l'imprimer sur l'écran"Que Michael a écrit dans son code, vous devez effacer de la DX , c'est à dire le mettre à 0, avant de vous diviser.
Mais si vous me demandez, si vous avez seulement besoin d'afficher un nombre de la forme ASCII (pas d'obtenir un smiley quand vous voulez un certain nombre à être affiché). La conversion de la valeur ASCII à l'interne peut être assez gênant.
Pourquoi ne pas simplement utiliser un tableau défini dans le début du programme, qui a toutes les valeurs ASCII des chiffres et de choisir celle qui correspond à l'.
pour eg.
DB arr '0123456789'
et de comparer chaque numéro de la position et de l'impression que l'on. Ça fait vraiment longtemps que je l'ai codé en 8086, mais je me souviens à l'aide de cette logique pour un programme qui m'a obligé à imprimer d'une valeur ASCII d'un nombre hexadécimal. J'ai donc utilisé un tableau qui avait
0123456789ABCDEF
et il a parfaitement fonctionné.Juste mes deux cents. Depuis que vous avez voulu seulement le résultat. n'a pas vraiment d'importance comment vous le calculer.
Pensé que je devrais poster une mise à jour de cette. Ce post m'a vraiment aidé à sortir la recherche d'un moyen pour obtenir la clé d'entrée pour CLI PHP scripts. Je ne pouvais pas trouver Windows/DOS de la solution de n'importe où, alors j'ai opté pour un programme externe.
Je suis à l'aide d'une très ancienne version de l'a86 à l'assembleur de sorte que le code est assez basique.
( et comment puis-je désactiver l'option "Exécuter" Extrait de Code? )
CSS:
Un exemple de script PHP pour tester dans:
HTML:
Certes après tout a été dit et fait, j'ai réalisé que j'aurais pu faire la même chose en C++. Mais j'ai appris beaucoup plus sur l'ASM, cette fois.
Donc merci encore a tous!!
Voici la bien testé le code pour le nombre d'impression