• Sábado 9 de Noviembre de 2024, 03:44

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - sergiojr

Páginas: [1]
1
ASM (Ensamblador) / cronometro digital
« en: Martes 14 de Diciembre de 2010, 23:33 »
Buenas noches estoy haciendo un cronometro digital divido en dos
La segunda parte del cronometro nose si tengo las interrupciones bien o mal ni el clock es que ya no tengo ni idea como continuar alguien me podria ayudar?
 la primera es la siguiente  :
;************************************
; DEFINICIO DE VALORS CONSTANTS
;*************************************
escape      equ   1bh        ; Codi escape
fila_cron   equ   9bh       ; Posicio fila icolumna
col_cron    equ   9bh       ; dels digits delcronometre
fila_cont   equ   14bh       ; Posicio fila i columna
col_cont    equ   3Ah        ; controls cronometre
fila_conts  equ   15h        ; Posicio fila i columna

;******************************************
; DECLARACIO DE VARIABLES.
;******************************************
.data

;-------- Variables del Sistema ------------
hores       db 23h            ; Registres cronometre codificats en BCD
minuts      db 59h            ; inicialitzats al valor 23h:59m:06s
segons      db 06h
flag        db 00h
PUBLIC        hores, minuts, segons,flag
                                                           
;-------- Taula de visualitzacions ---------------
buf_cron    db    15 dup ('$')      ; Buffer visualitzacio cronometre

miss_tit    db     'C R O N O M E T R E   D I G I T A L   $'
miss_esc    db     '<ESC>: Sortir               $'                 ; Missatge escape
miss_strt   db     '  <S>:  Start/Stop          $'                 ; Missatge Start/Stop
miss_clr    db     '  <C>:   Clear              $'                 ; Missatge Clear
miss_aut    db     'Autors: Pere Ortega i Sergi Jimenez   $'       ; Missatge autors
miss_dat    db     'DATA: 12/11/2010            $'                 ; Missatge data
;*********************************************
; INICI PROGRAMA. SEGMENT DE CODI
;*********************************************
.code

entrada:    mov   ax,@data          ; Alinea segment de dades
            mov   ds,ax
            call  borra_pant        ; Borra pantalla monitor        
            call  vis_gen           ; Visualitza controls cronometre

bucle:      call  omp_buf           ; Omple buffer crono
            call  vis_cron          ; Visualitza valors crono


;***************************************************************
;     BUCLE PRINCIPAL: GESTIO CONTROL CRONOMETRE
;***************************************************************
; Bucle continu que controla el funcionament del
; cronometre. Es detecta la tecla que s'ha premut i s'executa el
; comandament associat:
;     <ESC> : Sortir del programa (implementar)
;     <S> o <s>: Engega i/o atura el cronometre (de moment no implementar)
;     <C> 0 <c>: Borra el crono. Tot a zero.  (implementar)
;****************************************************************
gescont:
     
            mov ah,10h
            int 16h

            cmp al,'S'
       jne no_s
            not flag

no_s:       cmp al,'s'
       jne C
       not flag
         
 
C:       cmp al,'C'
       jne no_c
        mov hores,00h
            mov minuts,00h
            mov segons,00h
           
no_c:       cmp al,'c'         
       jne  exit
            mov hores,00h
            mov minuts,00h
            mov segons,00h
             
           
exit:         cmp al,escape
            jne bucle              
       mov   ax,4c00h          ; Finalitza el programa, i sortida al MS-DOS
            int   21h
       

;****************************************
;          S U B R U T I N E S
;****************************************
;****************************************
; ESBORRAT DE PANTALLA
;****************************************
borra_pant:

               mov   ah,06h
      mov   al,00h
      mov   bh,07h
      mov   ch,00h
      mov   cl,00h
      mov   dh,18h
      mov   dl,4Fh
      mov   ah,06
      int   10h
      ret


;******************************************
; SUBRUTINA VISUALITZACIO GENERAL
;******************************************
vis_gen:
;------- Visualitza titol -------------

               mov AH, 02h
                mov BH, 00h
                mov DH, 01h
                mov DL, 15h
      int 10h      
      mov Dx, OFFSET miss_tit
      MOV AH, 09h
      int 21h

;------- Visualitza autors--------------------------------
      mov AH, 02h
                mov BH, 00h
                mov DH, 0Bh
                mov DL, 11h
      int 10h
      mov DX,OFFSET miss_aut      
      MOV AH,09h          
      int 21h

;------- Visualitza data  ----------------------------------

               mov AH, 02h
                mov BH, 00h
                mov DH, 0Bh
                mov DL, 38h
      int 10h
      MOV AH, 09h            
      mov Dx, OFFSET miss_dat
      int 21h

;------- Visualitza start/stop----------------------------

               mov AH, 02h
                mov BH, 00h
                mov DH, 14h
                mov DL, 30h
      int 10h
      MOV AH, 09h
      mov Dx,OFFSET miss_strt
      int 21h


;------- Visualització clear--------------------------------

               mov AH, 02h
                mov BH, 00h
                mov DH, 15h
                mov DL, 30h
      int 10h
      mov Dx,OFFSET miss_clr       
      MOV AH, 09h           
      int 21h
      
;------- Visualitza sortida-------------------------------

               mov AH, 02h
                mov BH, 00h
                mov DH, 17h
                mov DL, 32h
      int 10h
      MOV DX, OFFSET miss_esc      
      Mov AH, 09h
      int 21h


   

;**********************************************************
; SUBRUTINA OMPLE BUFFER CRONOMETRE
; Converteix cada digit al corresponent codi ASCII
; i es construeix la tirallonga per tenir el format de
; sortida demanat.
;----------------------------------------------------------
; FORMAT SORTIDA: HHh:MMm:SSs
; Exemple:   12h:36m:54s
;**********************************************************
omp_buf:

   lea di,buf_cron
   mov al,hores
   call conversor
   mov [di],ah
   inc di
   mov [di],al
   inc di
   mov [di],byte ptr 'h'
   inc di
   mov [di],byte ptr ':'
   inc di
   mov  al,minuts
   call conversor
   mov [di],ah
   inc di
   mov [di],al
   inc di
   mov [di],byte ptr 'm'
   inc di
   mov [di],byte ptr ':'
   inc di
   mov  al,segons
   call conversor
   mov [di],ah
   inc di
   mov [di],al
   inc di
   mov [di],byte ptr 's'
   ret

;     - Es recomsnable escriure una subrutina de us local que converteixi
;     els dos digits de cada un dels camps als codis ASCII
;     corresponents. Recorda que per convertir valors nuumerics a ASCII
;     sols cal sumar 30H al valor a convertir.

;     - Utilitzeu un punter amb adrecament indirecte per anar escrivint
;     cada caracter al buffer de desti.
;     - Recordeu que l'assemblador enten com a codi ASCII
;     qualsevol dada o tirallonga tancada entre cometes ' '.

;********************************************************************
; SUBRUTINA  VISUALITZACIO  CRONOMETRE
; Subrutina que mostra el valor actual del cronometre,
; Es va refrescant continuament en el bucle gestcont: del  
; programa principal
;********************************************************************

vis_cron:

   mov ah,02h   ; Posiciona Cursor
   mov bh,00h
   mov dh,07h
   mov dl,23h

   int 10h
       
   mov ah,09h   ; Visualitza buf_cron.
   lea dx,buf_cron
   int 21h                


               
    ret            
           

;**********************************************; CONVERSIO DE HEX A ASCII
;
;********************************************************************

conversor:    mov   cl,4h
       shl   ax,cl
       and   ah,0fh
       add    ah,30h
       shr   al,cl
       and   al,0fh
       add   al,30h
   ret
                end   entrada



La segunda parte es esta:
;******************************************************
.model small

;------------ DECLARACIONS EXTERNES I PUBLIQUES -----------
   extrn   segons:byte    
   extrn    minuts:byte
   extrn    hores:byte  
   extrn    flag        
         
;------------- VARIABLES DEL MODUL ------------------------
.data
cont18      db   18h      ; Comptador auxiliar 1/18 segons
cs_antic   dw   0h
ip_antic   dw   0h

.code
             
;------- INICIALITZACIO INTERRUPCIONS ------------------
ini_int:                        
;----- Salvar interrupcio anterior          
      cli
      push         
      mov ah,35h      ; Utilitzar Funcio 35 de INT 21H
             mov al, 1Ch
int21h
      mov cs_antic,es
      mov ip_antic,Bx
      pop es
      int 21h
;----- Instal.lar nova interrupcio
      push ds
      mov ah,25h      ; Utilitzar Funcio 25 de INT 21H
          mov al,21h
      ret

;-------- RESTAURACIO INTERRUPCIONS -------------
rest_int:            
;----- Restaurar interrupcio original

      cli
      push       ; Utilitzar Funcio 25 de INT 21H
      mov ah,25h      
             mov al, 1Ch
      mov ds_antic,es
      mov dx_antic,Bx
      pop es
      int 21h
       ret

;*******************************************************
; SUBRUTINA SERVEI INTERRUPCIO DEL CRONOMETRE
;*******************************************************
; Ha d'anar incrementant els registres (hores),(minuts)
; i (segons) de manera sincronitzada entre si.
; Cal implementar contadors BCD
; Per mitja d'una variable de control "flag", es fara
; el control de marxa/paro del cronometre. Aquesta
; variable es compartida entre el programa principal
; i el servei d'interrupcio, amb el criteri segent:
;     00H   = OFF, cronometre aturat
;    0FFh   = ON, cronometre en marxa
;*******************************************************
; MOLT IMPORTANT EN ELS SERVEIS D'INTERRUPCIO:
; En els serveis d'interrupcio cal que el procediment
; sigui de tipus FAR (llunya) i que la rutina ha de ser
; transparent salvant tots els registres de la CPU que
; s'utilitzin.
; Tambe cal tornar a aliniar el segment de dades si
; es fan servir variables de memoria.
;*******************************************************
clock:

      push    ds
      mov   ax,@data   ; Alinea segment de dades
      mov   ds,ax                  

                                    ; Control Start/Stop  
      cmp flag,0
      jnbe sortida
      
                                    ; Descomptador 1/18"

               dec cont18
      cmp cont18,0h
      jnbe sortida
      
      
                                    ; Comptador de segons

      inc segons
      daa
      cmp segons,60h
      jnbe sortida
      segons=0h          ; Comptador de minuts

      inc minuts
      daa
      cmp minuts,60h
      jnbe sortida
      minuts=0h                  
                                    ; Comptador d'hores

           inc hores
      daa
      cmp hores,240h
      jnbe sortida
      hores=0h
sortida:

            iret

            end

Páginas: [1]