Vistas de página en total

martes, 1 de octubre de 2013

CONSULTA- IMPRIMIR LONGITUD DE UNA CADENA

En respuesta a la consulta de Carlos Tovar, pongo este programa que imprime la longitud de una cadena.

  Definimos la cadena con la macro string, para que sea más simple de definir. Esta macro definirá la cadena como una array de bytes con una longitud de 30+2. 30 son los bytes pedidos y 2 son los bytes de control. El primero se guarda con la longitud máxima de la cadena y el segundo será en el que introducirá la longitud la función gets (servicio 0Ah de la Int 21h).

    Posicionamos los textos con gotxy y pedimos el texto a medir con gets.
    Para calcular su longitud hay dos maneras. La primera es usar la función strlen, lña cual te da la longitud de la cadena. Este sería el caso también de querer imprimir la longitud de una cadena que está en la memoria.
    Como en este caso la cadena la pedimos por teclado mediante la función 0Ah de la  Int 21h. Existe también la posibilidad de tomar directamente la longitud, del bufer de entrada. Ya que la int 21h lo guarda en el segund byte.
   Por ello existen dos opciones:

     Opción 1, usando la función de contaje de cadena strlen.
    Como los dos primeros byte del bufer string son usados como datos de control, cuando usamos la función strlen debemos direccionar dos byte más adelante. Por eso, la dirección indicada para strlen es "cadena+2"
    Este método puede servir para cualquier cadena guardada de otro modo, como puede ser leída de un fichero.

     Opción 2, aprovechando la propia función int21. En este caso simplemente leemos el segundo byte del bufer y su valor lo pasamos a un bufer DD, en este caso compuesto por dos DW, que nos servirá para que prinf imprima su valor.
   


IMPRIMIR LONGITUD DE UNA CADENA
; 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 string.mac

.model compact,pascal

.stack 250

.data
string cadena 30
longitud dw 0,0
msgtexto db "Introduce un texto",0



.code
 p proc far
      main
      clrscr
      gotoxy 10,9
      puts msgtexto
      gotoxy 10,10
      gets cadena

     ;opción 1                         ; opcion 2
                                            ; xor ax,ax
      strlen cadena+2            ;mov ax,cadena+1
      mov longitud,ax           ; mov longitud,ax
      gotoxy 20,12
      printf longitud
      getch al

      ret
 p endp

end p