Mon problème est que j'ai écrit un code qui est supposé générer un résultat dans un ensemble de voyants connectés au port parallèle. Quand j'ai exécuté le code, il n'a pratiquement rien fait. Mon instructeur m'a dit que le code fonctionnait trop vite et que mes yeux ne voyaient pas ce qui s'était passé.
J'ai trouvé qu'il y avait deux façons de retarder, j'ai essayé de boucler le NOP mais je pense que je ne peux pas vraiment déterminer ce qui se passe. Y a-t-il une meilleure façon?
J'ai ici une partie du code où je dois ajouter un délai 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
Ce que j'ai finalement fini par utiliser était la boucle nop
; start delay
mov bp, 43690
mov si, 43690
delay2:
dec bp
nop
jnz delay2
dec si
cmp si,0
jnz delay2
; end delay
J'ai utilisé deux registres que je mets tous les deux à n'importe quelle valeur élevée
Ce que j’ai utilisé ici était AAAA
pour les deux SI and BP
; j’ai fini avec environ 1 seconde pour chaque boucle de délai.
Merci pour l'aide les gars, et oui, nous utilisons toujours MS DOS pour ce cours de langue d'assemblage :(
Définissez un intervalle de 1 million de microsecondes (1 seconde) En utilisant les instructions ci-dessous.
MOV CX, 0FH
MOV DX, 4240H
MOV AH, 86H
INT 15H
Vous pouvez définir plusieurs secondes de retard en utilisant 86H et INT 15H
consultez ces liens pour plus de détails
Attend un nombre spécifié de microsecondes avant de rendre le contrôle à l'appelant
Vous pouvez utiliser interruption 1Ah
/function 00h
( GET SYSTEM TIME) pour obtenir le nombre de ticks d'horloge (18.2/s) depuis minuit dans CX:DX
.
Donc, pour attendre environ 1 seconde en utilisant cette méthode, vous devez exécuter cette fonction d’interruption une fois, enregistrer 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
soit supérieure à 18.
Vous pouvez également créer un processus et l'appeler chaque fois que vous souhaitez différer en utilisant uniquement le registre de comptage et l'implémentation de pile.
L'exemple ci-dessous retarde environ 1/4 par seconde.
delay proc
mov cx, 003H
delRep: Push cx
mov cx, 0D090H
delDec: dec cx
jnz delDec
pop cx
dec cx
jnz delRep
ret
delay endp
DELAY_1SEC: MOV R3,#0AH;10D
LOOP1: MOV R2,#64H;100D
LOOP2: MOV R1,#0FAH;250D
LOOP3: NOP
NOP
DJNZ R1,LOOP3;4x250Dx1,085us=1,085ms (0s.001ms010)/cycle
DJNZ R2,LOOP2;3x100Dx1,085ms=325,5ms (0s.100ms309)/cycle
DJNZ R3,LOOP1;3x10Dx325,5us=976,5ms (1s.604ms856)/cycle
RET