Langage D'Assemblage Du Générateur De Nombres Aléatoires
Récemment, j'ai commencé à apprendre le langage d'assemblage. Pour un projet que je suis en train de travailler sur je dois faire un générateur de nombre aléatoire à l'aide de congruence linéaire. Je suis supposer avoir dans trois numéros. Une limite supérieure, limite inférieure et un certain nombre de combien de nombres aléatoires que je veux. Quant à la formule pour obtenir un nombre aléatoire je suis venu avec....
randomNumber = (graine % (haut-bas) + bas)
J'ai ensuite essayé de mettre ce code.
Je suis venu avec cette
.data
upper BYTE 100 ;setting upper limit 100
lower BYTE 0 ;setting lower limit 0
number BYTE 5 ;number of random numbers
.code
call main
exit
main proc
cls
mov bx,upper ;moving upper bound into bx
mov dx,lower ;moving lower bound into dx
mov ax,2914017 ;taking a random number for this trial
mov ecx,number ;setting the loop counter
L1:
sub bx,dx ;(upper-lower)
div bx
add ah,dx ;(randomNumber mod (bx) + lower
main endp
Je suis curieux de savoir comment je pourrais imprimer le nombre aléatoire à la fin de chaque itération de la boucle. Et si le code ci-dessus n'a aucun sens.
Merci d'avance!
Si c'est sur Windows puis quelques suggestions ici: stackoverflow.com/questions/1922134/...
L'impression est très spécifique à une plateforme. Où êtes-vous essayer de les assembler et de les exécuter? MS-DOS? Windows? Linux? Aussi, Cette instruction ne sera pas volée: "mov ax,2914017"-- ax est un registre 16 bits qui plafonne à 65535. eax est de 32 bits, cependant.
C'est toutes sortes de mal. Plus important encore, cette expression n'est pas de produire un nouveau lot de semences. Habituellement, vous devez multiplier et ajouter un peu de bien-choisi constantes avant de modulo. Deuxièmement,
div bx
divise dx:ax
par bx
, mais vous n'avez pas de zéro dx
. Charge lower
en esi
ou edi
. (Et il le fait avec movzx
, parce qu'ils emplacements de mémoire sont octets. Vous êtes en train de charger avec word charge, de sorte mov dx, [lower]
mettra 0x500
en dx
.)Il devrait être relativement simple à mettre en œuvre celle dont il est question ici: imgs.xkcd.com/comics/random_number.png
OriginalL'auteur Whiplash | 2012-04-11
Vous devez vous connecter pour publier un commentaire.
La réponse à votre question est dépendants de la plateforme, vous devez spécifier le présent, et nous pouvons vous aider de manière plus spécifique.
Mais une méthode commune dans la vraie-adresse-mode (par exemple, MS-DOS) est d'appeler une interruption et envoyer les données à l' (Sortie Standard).
Exemple (le %de mots clés macro sont les directives de préprocesseur qui MSNA comprend - mais pas tous les compilateurs de l'utiliser, mais je l'ai inclus pour plus de clarté):
Une autre méthode pourrait être de se connecter directement un C-Lib de la fonction et de sortie de cette façon.
Vous devez vous référer à la Table ASCII les codes de caractères.
Rappelez-vous aussi, comme drhirsch mentionnés ci-dessous, que si vous avez l'intention de sortie entiers, vous aurez besoin de convertir ces valeurs en une forme que votre ISR peut gérer, comme hex équivalents. Ensuite, vous devrez écrire une fonction supplémentaire permettant de "traduire" les valeurs. Cette question est un bon exemple de ce à quoi je fais référence.
int 01fh
? Êtes-vous sûr de ne pas direint 21h
?Vous avez besoin de convertir le nombre en ASCII avant l'impression
OriginalL'auteur Ray