Vistas de página en total

martes, 3 de septiembre de 2013

PROBLEMA PLANTEADO POR LECTOR

En respuesta a una solicitud hecha en la entada "Concatenar cadenas" colocaré este inciso como ejemplo.

Lo he programado todo en el mismo fichero y he utilizado el formato actual de TASM 2.0.

En este ejemplo uso la macro string para crear las variables de entrada y la función scanf para tomar los textos. Es a diferencia del gets me permite definir el tamaño máximo de la cadena, para evitar que se introduzcan más caracteres de los definidos.

He colocado, como decía antes todo en un solo fichero. aunque he marcado en azul lo que podría ser nueva función para nuestra librería. por un lado estaría la macro de llamada, que la añadiríamos al fichero de macros string.mac, y por el otro la función de inversión que la compilaremos por separado y la añadiríamos a la librería mediante lib.exe.

  


;Problema planteado por lector
;DADO QUE EXISTEN DOS ARREGLOS NUM1 Y NUM2 LOS CUALES SE DEBEN CARGAR Y LUEGO CONCATENARLOS DE MANERA INVERSA EN UN TERCER ARREGLO NUM3 EJEMPLO
;NUM1 1425
;NUM2 123
;NUM3 5421321


SOLUCIÓN
; 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
include stdio.mac

; macro de llamada
invstr macro cadena
     lea ax,cadena        
     push ax
     call _invstr
endm

.model compact,pascal
.stack 100

.data
  ;uso la macro "string" para poder usar  "scanf"
  ; la diferencia entre scanf y gets, es que scanf limita el número de caracteres
  ; de entrada por teclado a los defindidos con la macro string
  ;el formato de string es max_caracteres,lon_cad,cadena,0
string  num1,5    ;cadena de 5 caracteres
string  num2,3    ;cadena de 3 caracteres
num3  DB 15 DUP(0)  ; bufer de salida, usaré puts
aux db 50 dup(0)
.code

p proc
      main
     clrscr
     scanf num1
     scanf num2
     invstr num1+2 ;saltamos el 1º byte que representa el tamaño máximo de lacadena
     invstr num2+2
     strcat num3,num1+2,num2+2
     PUTS num3
     exit 0
p endp

;invierte una cadenaproc _invstr near uses si di,cadena

        MOV SI,cadena
        MOV DI,CADENA
        STRLEN [DI] 
        LEA DI,aux
        ADD DI,AX
        MOV AL,0
        MOV [DI],AL
   MAS: MOV AL,BYTE PTR [SI]
        MOV BYTE PTR [DI-1],AL
        INC SI
        DEC DI
        CMP BYTE PTR [SI],0
        JNZ MAS
        mov di,cadena
        STRCPY [di],AUX
        ret
_invstr 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.