# # Autor(s) : Jordi Ferrer Plana # e-mail : jferrerp@eia.udg.es # Branch : - # # Working Group : Departament d'Electrònica, Informàtica i Automàtica # Project : Examen d'ETIS/ETIG d'Estructura i Tecnologia de Computadors, # 1era convocatòria, any 2003. # Homepage : http://eia.udg.es/etc/ # # Module : Exercici 4. Recompte amb la MS1. # # File : recompte.asm # Date : 13/06/2003 - 30/06/2003 # # Compiler : - # Libraries : - # # Notes : - El programa explora el rang d'adreces [00h .. 2Ah] ambdúes # incloses. # - El resultat s'escriu a l'adreça 30h. # - S'utilitzen les adreces finals [7Dh .. 7Fh] per valors # temporals. # - El codi pot estar a qualsevol lloc de la memòria, mentre no # no ocupi l'adreça 30h ni el rang [7Dh .. 7Fh]. En cas que el # el codi es posii en el rang [00h .. 2Ah] el programa comptarà # si hi ha valors 00FFh en el seu propi codi màquina. # # ---------------------------------------------------------------------------- # # Copyright (C) 2002-2003, Jordi Ferrer Plana # # 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 2 # 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 (http://www.gnu.org/copyleft/) # for more details. # # ---------------------------------------------------------------------------- # # Definició de les dades # 00h: XXXXh # Inici de la zona de cerca. 01h: XXXXh ... ... ... 2Ah: XXXXh # Final de la zona de cerca. 30h: 0000h # Posicio de memòria on hi ha el recompte. ... ... ... 7Dh: 0001h # Constant per incrementar 0001h. 7Eh: 7FAAh # Codi d'operacio de CMP 7Fh, 2Ah '01 1111111 0101010'. 7Fh: 00FFh # Valor que cercarem al rang d'adreces [00h .. 2Ah]. # Implementació del programa # # Ull! La primera instrucció (de l'adreça 'Loop') es modifica (automodificació de codi) # a cada iteració tot incrementant en 1 el segon operant a cada iteració. És una # forma de generar una indirecció amb la màquina senzilla, ja que no disposa # d'aquest tipus d'adreçament. # Loop: CMP 7Fh, 00h # Comprovar si a l'adreça 'actual' hi ha el valor a cercar. BEQ Increment # Són iguals -> Incrementar el comptador d'ocurrències CMP 7Fh, 7Fh # Salt incondicional en cas que la comparació falli. BEQ Seguent Increment: ADD 7Dh, 30h # S'ha trobat un nou 00FFh -> incrementar el comptador Seguent: ADD 7Dh, Loop # Modificar la instrucció de l'adreça 'Loop', incrementant # l'adreça del segon operand CMP Loop, 7Eh # Comprovar que no s'hagi acabat (instrucció de l'adreça BEQ Fi # 'Loop' és 'CMP 7Fh, 2Ah') CMP 7Fh, 7Fh # Salt incondicional a 'Loop' per fer la nova iteració BEQ Loop Fi: