J'essaye de créer une procédure de sommeil/retard dans l'Assemblée de MASM de 16 bits x86 qui dirait, par exemple, imprimer un caractère sur l'écran toutes les 500ms. D'après les recherches que j'ai faites, il semble qu'il y ait trois méthodes pour y parvenir - je voudrais utiliser celle qui utilise des ticks d'horloge CPU.Comment est-ce que je peux créer une fonction de sommeil dans le MASM Assembly x86 de 16bit?
S'il vous plaît noter que je cours Windows XP via VMWare Fusion sur Mac OS X Snow Leopard - Je ne suis pas sûr si cela affecte n'importe quoi.
Quelqu'un pourrait-il me diriger dans la bonne direction, ou fournir un morceau de code que je peux modifier? Je vous remercie!
Le code que j'ai trouvé est censé imprimer 'A' sur l'écran toutes les secondes, mais ne fonctionne pas (je voudrais utiliser des millisecondes de toute façon).
TOP:
MOV AH,2C
INT 21
MOV BH,DH ; DH has current second
GETSEC: ; Loops until the current second is not equal to the last, in BH
MOV AH,2C
INT 21
CMP BH,DH ; Here is the comparison to exit the loop and print 'A'
JNE PRINTA
JMP GETSEC
PRINTA:
MOV AH,02
MOV DL,41
INT 21
JMP TOP
EDIT: Après les conseils de GJ, voici une procédure de travail. Il suffit d'appeler ce
DELAY PROC
TIMER:
MOV AH, 00H
INT 1AH
CMP DX,WAIT_TIME
JB TIMER
ADD DX,3 ;1-18, where smaller is faster and 18 is close to 1 second
MOV WAIT_TIME,DX
RET
DELAY ENDP
Courez-vous votre code en userland? Sur Windows? – nico
Oui. Je l'exécute sur Windows via une machine virtuelle, comme indiqué dans mon post :) –
Faites attention à minuit, vous pouvez avoir un problème. Peut-être est une meilleure idée de lire directement l'emplacement de la mémoire tick à 0x0040: 0x0070. Lire aussi: http://www.merlyn.demon.co.uk/pas-time.htm#RDT –