Estoy intentando crear un procedimiento de suspensión/demora en el ensamblaje MASM de 16 bits x86 que, por ejemplo, imprimirá un personaje en la pantalla cada 500 ms. A partir de la investigación que he realizado, parece que hay tres métodos para lograr esto: me gustaría usar uno que use marcas de reloj de la CPU.¿Cómo puedo crear una función de suspensión en ensamblaje MASM de 16 bits x86?
Tenga en cuenta que estoy ejecutando Windows XP a través de VMWare Fusion en Mac OS X Snow Leopard - No estoy seguro de si eso afecta algo.
¿Podría alguien señalarme en la dirección correcta, o proporcionar un código de trabajo que pueda modificar? ¡Gracias!
El código que he encontrado debe imprimir 'A' en la pantalla cada segundo, pero no funciona (me gustaría usar milisegundos de todos modos).
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: Siguiendo el consejo de GJ, aquí hay un procedimiento de trabajo. Sólo tiene que llamar que
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
¿Está ejecutando su código en el espacio de usuario? En Windows? – nico
Sí. Lo estoy ejecutando en Windows a través de una máquina virtual, como se indica en mi publicación :) –
Tenga cuidado a la medianoche que puede tener un problema. Tal vez es mejor idea leer directamente la ubicación de la memoria de marcación en 0x0040: 0x0070. Lea también: http://www.merlyn.demon.co.uk/pas-time.htm#RDT –