web-dev-qa-db-fra.com

Comment définir un délai d'une seconde dans la langue de l'Assemblée 8086

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 
6
Jer Yango

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 :(

1
Jer Yango

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

INT 15H 86H: Attendez

9
john

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.

8
Michael

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
0
Alfred Benigno
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
0
kinAfro