Comment définir 1 seconde de temps de retard à l'assembleur 8086
Mon problème est que j'ai écrit un code qui est censé sortie un résultat dans un ensemble de Led connectée au port parallèle. Quand j'ai couru le code il n'a rien fait. Mon instructeur m'a dit que le code a couru trop vite, que mes yeux ne voient pas ce qui s'est passé.
J'ai trouvé qu'il y a un couple de façons de le faire une heure de retard, j'ai essayé de la boucle de la NOP, mais je pense que je ne peut pas vraiment déterminer ce qui se passe. Est-il un meilleur moyen?
J'ai ici une partie du code où j'ai du ajouter un temps de retard dans:
org 100h
mov ax, 0
mov dx, 378
out dx, ax
mov ax, 1
; 1st
mov cx, 1ah
start1st:
mov ax, 1
left:
out dx, ax
; --------------------------------> how to loop?
mov bx, 2
mul bx
cmp ax, 80h
jl left
dec cx
cmp cx,0
jg start1st
; end 1st
- Cela nécessite généralement un système d'exploitation ou du BIOS appel, ou en sachant que le PROCESSEUR fréquence d'horloge et très soigneusement la construction d'une boucle de retard pour le bon nombre de cycles (et en supposant que la fréquence de l'horloge ne change pas). Quel système d'exploitation êtes-vous de faire cela?
- La meilleure façon, si vous avez le matériel, est d'utiliser un dédié minuterie pour faire le calendrier. Il informe ensuite le CPU par une interruption lorsque le délai a expiré. Cela permet au PROCESSEUR de faire d'autres travaux pendant l'attente, qui est souvent très agréable.
- Jim Mischel Bonjour, je suis à l'aide d'un windows xp dans l'exécution du code. Bâtiment le code a été sur un 8086 émulateur. Sera le NOP boucle être capable de faire cela? Je suis la planification d'une boucle à un certain moment, mais je ne sais pas combien de cycles de chaque instruction est fait. Je n'ai aucune idée à ce sujet.
- Pourquoi tu fais ça en mode DOS à la première place? Votre émulé en mode réel DOS ne vous donnera pas de meilleur moment que l'hôte du système Windows.
- Parce que certaines écoles n'ont pas mis à jour leurs cours dans les 20 dernières années. Ils enseignent encore 16 bits assemblée pour MS-DOS. Ils ont aussi probablement utiliser Ford modèle T de pour leur des cours de conduite.
- ils devraient dump cette merde maintenant. Sur 32 bits, il est trivial Sleep() de l'appel. Ancien de la foutaise..
Vous devez vous connecter pour publier un commentaire.
Set 1 million de microsecondes de l'intervalle (1 seconde)
En utilisant les instructions ci-dessous .
Vous pouvez définir plusieurs secondes de retard en utilisant 86H et INT 15H
vérifier ces liens pour plus de détails
Attend un certain nombre de microsecondes avant de rendre le contrôle à l'appelant
INT 15H 86H: Attendre
Vous pouvez utiliser d'interruption
1Ah
/fonction00h
(OBTENEZ DE L'HEURE DU SYSTÈME) pour obtenir le nombre de tops d'horloge (de 18.2/s) depuis minuit dansCX:DX
.Donc attendre environ 1 seconde en utilisant cette méthode, vous feriez exécuter cette fonction d'interruption une fois, enregistrez CX:DX dans une variable, puis exécuter la même interruption dans une boucle jusqu'à ce que la valeur absolue de
CX:DX - firstCX:DX
est supérieur à 18.CX:DX
traitée comme une variable? si oui, voulez-vous dire-je ajouter les valeurs decx
etdx
et de les stocker dans une variable?DD
,DWORD
, ou quelle que soit la directive votre assembleur utilise.18
. Voir ce code-golf en question où j'ai fait la même chose avec les registres 32 bits à tourner surRDTSC
pour 1 seconde de retard (si la vitesse d'horloge < ~4.3 GHz).Ce que j'ai finalement fini par utiliser est le nop boucle
J'ai utilisé deux registres qui je les ai à la fois à haute valeur
et sa vas le garder sur la boucle jusqu'à ce que les deux valeurs à zéro
Ce que j'ai utilisé ici a été
AAAA
pour les deuxSI and BP
, je me suis retrouvé avec environ 1 seconde pour chaque boucle de retard.Merci pour l'aide les gars, et oui, nous avons encore l'utilisation de MS DOS pour cette assemblée en cours de langue 🙁
lfence
oucpuid
pour sérialiser de l'exécution peut être votre seule option. Mais une deuxième est des milliards de cycles d'horloge, vous pouvez simplement vérifier une minuterie dans une boucle. par exemple, avec RDTSC qui les tiques à une vitesse constante sur moderne x86 (indépendamment de l'âme changements de vitesse d'horloge). Voir un code-golf chronomètre qui utilise RDTSC avec une référence connue-vitesse de l'horloge.Alternativement, vous pouvez créer un processus et de l'appeler à chaque fois que vous voulez délai en utilisant seulement le registre de compteur de pile et de mise en œuvre.
Exemple ci-dessous retards d'environ 1/4 de sec.
Je suis de mobile. Désolé pour mon entrée 😉