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.