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.