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