Vistas de página en total

viernes, 13 de septiembre de 2013

SWITCH...CASE

    Como había anunciado, voy a ampliar la cabecera Hi_LEVEL. Vamos a crear un conjunto de macros para poder realizar el SWITCH...CASE de forma más cómoda.
   A partir de ahora, igual que sucede con el FOR y el WHILE,  podremos utilizar estas macros que funcionan como generador de código para escribir el programa de forma más clara.

  Como todos sabemos, uno de los problemas del ensamblador es su linealidad. As ser tan lineal, resulta plano. Es decir, en un programa, no distinguimos de forma clara la estructura. Dado que las funciones son las mismas en todos los caso, perdemos la visión de conjunto.  Esta macro, junto con todos las que están en HI_LEVEL, tienen la misión de aclarar un poco el programa de manera que sea fácil distinguir las estructuras de programa, bucles y cases.

   Como ya se habrá visto, esta es una gran preocupación para mí. por eso me molesto tanto en crear macros para cada función. Quiero que el programa quede lo más claro, sin necesidad de comentarios, de manera que pueda ser leído e interpretado fácilmente aunque pase mucho tiempo.

   Parece que esta filosofía ha funcionado, pues lo que estoy poniendo hace 20 años que lo hice, y me está siendo muy sencillo recuperarlo e incluso ampliarlo con programas nuevos según voy escribiendo este Blog.

   Empecemos pues.

 Las macros a incorporar a HI_LEVEL son estas.

;inicio del switch. Se indica la varible a mirar.
;esta varialbe debe de ser un byte
switch macro var
       mov al,var
      ifndef $h
          $h = 0
       endif
       $h = $h + 1
endm


; se compara con val, usando la operación indicada y si es cierta se llama
; a la subrutina indicada
case macro val,op,rutina
local sigue
      cmp al,val
       j&op sigue
      call &rutina
     $recup1 %$h
      jmp $simbolo
sigue:
endm


;marca la parte que será ejecutada siempre que no se cumpla ningún case
; el código se colocará siempre dentro del switch
default macro
endm


; Marca fin de witch
endswitch macro
     $salvar1 %$h
endm 


EJEMPLO
 Aquí voy a poner un ejemplo para ver el uso de la estructura. Si se compila y linka con Turbodebuger se podrá ver lo que se genera. Pero este programa no tiene una funcionalidad. Simplemente permitirá ver la estructura creada.

; Copyright (C) 2013  José Ángel Moneo Fernández

;    This program is free software: you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;   (at your option) any later version.

;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.

;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <http://www.gnu.org/licenses/>.
include main.mac
include stdio.mac
include Hi_level.mac

.model compact,pascal
.stack 100

.data

op db 0

.code

p proc
      main
     clrscr
     getch op
  switch  op                           ; comienza el switch indicando la variable a comparar
       case 'h',e,casoh             ; caso de ser = a h llama a la subrutina casoh
       case 'l',be,casol           ; caso de ser <= a l llama a la subrutina casol       

  default
          mov ah,50              ; secuencia en caso de no cumplirse nada
   endswitch                      ; fin del swirch

 
     getch op


;Segundo switch  
       switch  op
       case 'm',e,casoh
       case 'n',be,casol 
       default

          mov ah,40
    endswitch 
     exit 0
p endp
casoh proc near
     ;falta el código pues es un ejemplo

    ret
endp
casol proc near
    ;falta el código pues es un ejemplo
    ret
endp
end p


No hay comentarios:

Publicar un comentario

Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.