Tienda | Foros | Blogs | EN |
 

Ayuda = este contador en .asm no se detiene

Seguir
; ###########################################################################
; EL LOOP SE LOGRA, HASTA 99 e INCREMENTANDOSE, luego retoma el piso de 00 ##
; 01,02,03 ... 55,56 ... 99 , etc #### PERO AL NO ACEPTAR EL TOPE DE 25 SIGUE
; INDEFINIDAMENTE ###########################################################
; ###########################################################################
; LOGRÉ QUE NO INTERCALARA Nros CON CARACTERES ( Por ejemplo <= equiv "61"
; EN ASCII) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; ###########################################################################
; PARA COMPROBAR LOS Nros SE DEBE OPRIMIR PAUSE ###############################
; ###########################################################################
; PERO NO SÉ CÓMO HACER QUE "RET" HAGA FINALIZAR EL CONTADOR ...............

vort segment
assume cs:vort,ds:vort ;ss:vort
org 100h
blurss:


mov cx,25


STERN:

add al,01h
adc al,0
;;;;;;;;;;inc al


;;xor bl,bl
xor ah,ah

;;;add al,01h
;;;adc ah,al

aaa

;;;;;;;;;;mov bx,cx
;;;;;;;;;;mov dx,ax

; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

or al,30h
mov al,al

cmp al,5
je imprimirright
je imprimirleft

;;;or ah,30h
;;;mov al,ah

;;;cmp ah,2d
;;;je imprimirleft

; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

;;;or cl,30h
;;;mov al,cl

;;;cmp cl,5d
;;;je imprimirright


;;;;;;;;;;;;;;;;;;;;;;;or bh,30h
;;;;;;;;;;;;;;;;;;;;;;;mov al,bh

;;;;;;;;;;;;;;;;;;;;;;;cmp bh,2d
;;;;;;;;;;;;;;;;;;;;;;;je imprimirleft


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

imprimirright:
mov ah,2
mov dh,8
mov dl,16
int 10h
mov ah,0eh ; Habilitamos la Funci¢n 0eh de la int 10h p / imprimir
int 10h

imprimirleft:
mov ah,2
mov dh,8
mov dl,15
int 10h
mov ah,0eh ; Habilitamos la Funci¢n 0eh de la int 10h p / imprimir
int 10h

;mov ah,0 ; Funci¢n q aguarda a q oprimamos una tecla
;int 16h

;;;dec al
;;;dec bh

dec cx

loop STERN

ret ; El ret es necesario para salir al DOS ... pero no lo logro !!!!

vort ends
end blurss


3 Soluciones propuestas

El problema es la instrucción:
DEC CX
si la borrás lo tendrás solucionado. La instrucción:
LOOP STERN
hace lo siguiente: Decrementa en 1 el registro CX, si el resultado es 0 continúa con la instrucción siguiente (en este caso RET), pero si no es cero salta a STERN.
Puntualmente no sales porque CX es decrementado dos veces seguidas, una por el DEC CX y otra por el LOOP. Como empezaste con CX en 25, va saltando por los impares, sin llegar nunca a Cero.

Sacale la línea DEC CX y obtendrás lo deseado.

No olvides valorar la respuesta. Suerte!
: ... probé anular como me dijiste la instrucción " dec cx " , y si bien es cierto
que logro salir al DOS, si te fijás en la 5ta línea del programa (mov cx, 25), el
hecho de haber quitado " dec cx " le ha conferido al programa un comportamiento atípico = si tomás en cuente "25" para mov cx, el programa da "55"; es decir que toma en cuenta la unidad y la repite en la decena .... probalo vos mismo con cualquier número; yo lo probé con "mov cx, 91" ´, salió a DOS con "11" como tope de
CONTADOR, que es lo que busco; también probé con los siguientes números y arrojó los siguientes resultados = 92,93,87,88,89,70,71,72,07,08,09 ....................
y saliendo al DOS cada uno dió = 22,33,77,88,99,00,11,22,77,88,99


Tangos escribió:
El problema es la instrucción:
DEC CX
si la borrás lo tendrás solucionado. La instrucción:
LOOP STERN
hace lo siguiente: Decrementa en 1 el registro CX, si el resultado es 0 continúa con la instrucción siguiente (en este caso RET), pero si no es cero salta a STERN.
Puntualmente no sales porque CX es decrementado dos veces seguidas, una por el DEC CX y otra por el LOOP. Como empezaste con CX en 25, va saltando por los impares, sin llegar nunca a Cero.

Sacale la línea DEC CX y obtendrás lo deseado.

No olvides valorar la respuesta. Suerte!
SOLUCIÓN ACEPTADA
No quiero ser duro, pero así como está escrito el programa siempre hizo lo mismo, o sea duplicar el carácter en pantalla. Es así porque estás mandando el mismo valor de AL.
Por otro lado, la doble comparación de AL con 5 no tiene sentido.
Además, las dos comparaciones sucesivas JE tampoco tiene sentido, ya que el segundo salto jamás se ejecuta por ser igual al primero.
Adicionalmente, estás indicando que el cambio en CX afecta al programa, cuando en ningún momento CX se traslada a AX.
Entiendo que quizás estés recién empezando con el assembler, pero no puedes dejar de lado la lógica al ver un programa.
Te paso una versión algo optimizada para que la pruebes:

vort segment
assume cs:vort,ds:vort ;ss:vort
org 100h
blurss:

mov cx,25 ; Inicializa el contador CX para el bucle
xor si,si ; Utilizo el registro SI en lugar del AX
STERN:
inc si ; porque INC SI es una instrucción rápida y pequeña, y SI no es afectado
mov ax,si ; lo muevo a AX
aam ; Ajuste ASCII para la multiplicación, divide AL por diez, resultado en AH, resto en AL
or ax, 3030h ; para obtener ambos ASCII
mov di, ax ; guardo el resultado en DI
mov al,ah ; muevo la decena a imprimir
mov ah,2
mov dh,8
mov dl,15 ; primero imprimo la decena
int 10h
mov ah,0eh ; imprimo la decena
int 10h
mov ax, di ; traigo el resultado guardado, AL tiene la unidad
mov ah,2
inc dl ; incremento la posición de escritura para la unidad
int 10h
mov ah,0eh ; imprimo la unidad
int 10h
loop STERN ; salto al proximo número hasta que CX llegue a cero

ret ; vuelvo al DOS

vort ends
end blurss

Probalo y comentá. Suerte!