practica 15 ensamblador 80386

20
LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15 AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS 15-1 PRÁCTICA 15 ENCRIPTADO DE ARCHIVOS, CLASIFICACIÓN POR MÉTODO DE PARTICIÓN / INTERCAMBIO 1. INTRODUCCIÓN Esta práctica ayudará a familiarizarse con el encriptado de archivos y las ventajas que se pueden tener del mismo, así como la ordenación de números o cadenas y el uso del programa MAKE de BORLAND para ensamblar y ligar un programa con los módulos que contienen las rutinas que usa. 2. OBJETIVOS Al término de esta práctica el alumno: 2.1 Aprenderá a usar técnicas básicas, pero efectivas, para encriptar o desencriptar cualquier archivo. 2.2 Aprenderá a usar el programa MAKE que forma de manera automática un programa ejecutable. 2.3 Aprenderá a generar y ensamblar de modo condicional un programa que implementa el algoritmo de Hoare, Quicksort, que ordena registros de números o alfanuméricos. 2.4 Verá cómo se puede hacer una rutina que se pueda llamar a sí misma para implementar la recursividad. 3. DESARROLLO 3.1 Capturar el siguiente módulo y salvarlo con el nombre CIFRAR.ASM. ;CIFRAR encripta un archivo de datos usando una variación de la técnica ;cifradora de Vernam, que XORea cada carácter de un mensaje con cada carácter ;de una clave. Su sintaxis es: ; ; CIFRAR [d:][camino]NomArch "clave" ; ;donde "NomArch" (sin comodín) es el nombre del archivo a encriptar y "clave" ;es la frase usada para encriptar el archivo. Dicha frase debe estar encerrada ;en comillas dobles y puede ser tan larga como lo permita la linea de comandos ; ;Los archivos cifrados son decifrados usando CIFRAR de nuevo con ;la misma frase. Si dicha frase se olvida, no hay modo de recuperar ;el archivo original. ; ;El ejecutable es tipo .COM. Ensamblar y ligar mediante: ;>tasm /zi cifrar ;>tlink /t cifrar

Transcript of practica 15 ensamblador 80386

Page 1: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-1

PRÁCTICA 15

ENCRIPTADO DE ARCHIVOS, CLASIFICACIÓN POR MÉTODO DE PARTICIÓN / INTERCAMBIO

1. INTRODUCCIÓN

Esta práctica ayudará a familiarizarse con el encriptado de archivos y las ventajas que se pueden tener del mismo, así como la ordenación de números o cadenas y el uso del programa MAKE de BORLAND para ensamblar y ligar un programa con los módulos que contienen las rutinas que usa.

2. OBJETIVOS

Al término de esta práctica el alumno:

2.1 Aprenderá a usar técnicas básicas, pero efectivas, para encriptar o desencriptar cualquier archivo.

2.2 Aprenderá a usar el programa MAKE que forma de manera automática un

programa ejecutable.

2.3 Aprenderá a generar y ensamblar de modo condicional un programa que implementa el algoritmo de Hoare, Quicksort, que ordena registros de números o alfanuméricos.

2.4 Verá cómo se puede hacer una rutina que se pueda llamar a sí misma para

implementar la recursividad. 3. DESARROLLO

3.1 Capturar el siguiente módulo y salvarlo con el nombre CIFRAR.ASM.

;CIFRAR encripta un archivo de datos usando una variación de la técnica ;cifradora de Vernam, que XORea cada carácter de un mensaje con cada carácter ;de una clave. Su sintaxis es: ; ; CIFRAR [d:][camino]NomArch "clave" ; ;donde "NomArch" (sin comodín) es el nombre del archivo a encriptar y "clave" ;es la frase usada para encriptar el archivo. Dicha frase debe estar encerrada ;en comillas dobles y puede ser tan larga como lo permita la linea de comandos ; ;Los archivos cifrados son decifrados usando CIFRAR de nuevo con ;la misma frase. Si dicha frase se olvida, no hay modo de recuperar ;el archivo original. ; ;El ejecutable es tipo .COM. Ensamblar y ligar mediante: ;>tasm /zi cifrar ;>tlink /t cifrar

Page 2: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-2

IDEAL MODEL tiny

; EQUs.. rc equ 13 ;retorno de carro nl equ 10 ;nueva linea coma equ 2ch ;ASCII de "," tab equ 9 ;ASCII del tabulador

codeseg org 100h

inicia:

jmp programa saludo db "CIFRAR 1.1 Copyright (c) 1993 Jeff Prosise",rc,nl

db "Adaptado de: PC Magazine DOS 6 Techniques and Utilities" db " por S. Saucedo",rc,nl,"$"

ayuda db "Encripta un archivo de datos, por seguridad."

db "Usa la tecnica de Vernam.",rc,nl,rc,nl db "CIFRAR [d:][camino]NomArch ",22h,"clave",22h db rc,nl,rc,nl db "NomArch Nombre del archivo a encriptar.",rc,nl db "clave frase para cifrar archivo (no olvidarla!).",rc,nl db rc,nl db "Para decifrar un archivo, correr CIFRAR otra vez con " db "la misma frase.",rc,nl,"$"

msjerr1 db "Sintaxis: CIFRAR [d:][camino]NomArch "

db 22h,"clave",22h,rc,nl,"o bien: CIFRAR /?",rc,nl,"$" msjerr2 db "Archivo no hallado o camino invalido",rc,nl,"$" msjerr3 db "Archivo no puede ser abierto para lectura",rc,nl,"$" msjerr4 db "Archivo no puede ser abierto para escritura",rc,nl,"$" msjerr5 db "Lectura de archivo con error",rc,nl,"$" msjerr6 db "Escritura de archivo con error",rc,nl,"$" msjerr7 db "Error de disco lleno",rc,nl,"$" msjerr8 db "Falta memoria",rc,nl,"$" msg db "fue exitosamente (des)encriptado",rc,nl,"$" NomArch dw ? ;direccion del nombre del archivo HandleLec dw ? ;handle para archivo de lectura HandleEsc dw ? ;handle para archivo de escritura clave dw ? ;direccion de la frase clave largo dw ? ;largo de la frase TamBloque dw ? ;Tamaño del bloque para E/S de arch BytLeidos ? ;Bytes leidos desde arch de entrada PROC programa

cld ;limpia bandera de direccion

; Procedimiento PROGRAMA

Page 3: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-3

mov si,81h ;SI apunta a linea de comando call BuscaSw ;Busca el switch /? jnc @@10 ;Brinca si no mov ah,09h ;exhibe mensaje de ayuda mov dx,offset ayuda ;y sale int 21h mov ax,4C00h int 21h

@@10:

mov ah,09h ;exhibe saludo mov dx,offset saludo int 21h

mov dx,offset msjerr8 ;asegurarse que hay suficiente cmp sp,0A000h ;memoria para correr el programa ja parse

error: mov ah,09h ;saca mensaje de error int 21h ;sale con ERRORLEVEL=1 mov ax,4C01h int 21h

; Parsea la línea de comandos.. parse:

call HallaCar ;halla 1er parámetro jnc @@20 ;Brinca si hallado

error1: mov dx,offset msjerr1 ;Error si no jmp error

@@20:

cmp [byte ptr si],22h ;Error si doble comilla je error1 mov [NomArch],si ;Salva dirección call HallaDelim ;halla fin de cadena jc error1 ;Error si fin de linea mov [byte ptr si],0 ;Convierte a ASCIIZ inc si ;Avanza SI

call HallaCar ;halla siguiente parámetro jc error1 ;Error si fin de linea cmp [byte ptr si],22h ;Error if NO hay doble comilla jne error1 ;por ahora inc si ;Salta la doble comilla mov [clave],si ;Salva dirección xor cx,cx ;Inicia contador

@@30: lodsb ;halla doble comilla final cmp al,0Dh ;y sale con error je error1 ;si fin de linea es cmp al,22h ;encontrado primero je @@40

Page 4: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-4

inc cx jmp @@30

; halló doble comilla.. @@40:

jcxz error1 ;Error si largo es 0 mov [largo],cx ;Salva largo de la clave

; Abre archivo con handles separados para lectura y escritura.

mov ax,3D00h ;abre arch para lectura mov dx,[NomArch] ;usa DOS con función 3Dh int 21h mov [HandleLec],ax ;Salva handle de archivo jnc abierto ;Continuar si no hubo error mov dx,offset msjerr3 ;Determina cual fue el error cmp ax,2 ;y usa DX para apuntar jb SaltaError ;a mensaje apropiado cmp ax,3 ;de error ja SaltaError mov dx,offset msjerr2 ;DX → mensaje de error

SaltaError: jmp error ;sale si error

abierto:

mov ax,3D01h ;abre arch para escritura mov dx,[NomArch] ;usa DOS con función 3Dh int 21h mov [HandleEsc],ax ;Salva handle de arch mov dx,offset msjerr4 ;Brinca si error jc error

; Lee el archivo, lo cifra, y lo escribe otra vez a disco.

mov ax,8000h ;Computa largo de bloque para xor dx,dx ;E/S de archivos div [largo] ;cociente en AX mul [largo] ;Producto en AX (<8000h) mov [TamBloque],ax ;Salva tamaño

; Lee bloque.. @@50:

mov ah,3Fh ;lee un bloque usando mov bx,[HandleLec] ;DOS con función 3Fh mov cx,[TamBloque] mov dx,offset buffer int 21h mov dx,offset msjerr5 ;DX → mensaje de error jc SaltaError ;Error si llamada fallo or ax,ax ;acabo si cero bytes leídos jz salir mov [BytLeidos],ax ;Salva cantidad de bytes leídos

Page 5: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-5

call encripta ;Encripta el bloque mov ah,40h ;escribe un bloque usando mov bx,[HandleEsc] ;a DOS con función 40h mov cx,[BytLeidos] mov dx,offset buffer int 21h mov dx,offset msjerr6 ;DX -> mensaje de error jc SaltaError ;Error si llamada fallo cmp ax,[BytLeidos] ;Procede si bytes escritos je checa ;igual a bytes leídos mov dx,offset msjerr7 ;DX -> mensaje de error jmp error ;Terminar

checa:

mov ax,[BytLeidos] ;Loopea si cmp ax,[TamBloque] ;bytes leídos son menos jnb @@50 ;que los pedidos

; Cierra archivos y sale. salir:

mov ah,3Eh ;cierra archivo de lectura mov bx,[HandleLec] int 21h

mov ah,3Eh ;Cierra handle de escritura mov bx,[HandleEsc] int 21h

mov si,[NomArch] ;exhibe mensaje anunciando

TraeCar: lodsb ;que lo hizo bien or al,al jz SacaMsj cmp al,"a" jb SacaCar cmp al,"z" ja SacaCar and al,0DFh

SacaCar: mov ah,02h mov dl,al int 21h jmp TraeCar

SacaMsj: mov ah,09h mov dx,offset msg int 21h

mov ax,4C00h ;sale con ERRORLEVEL = 0 int 21

ENDP programa PROC HallaCar ;HALLACAR avanza SI al siguiente carácter. Al retornar, CF = "1" ;indica que el final de la linea fue alcanzado.

Page 6: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-6

lodsb ;trae otro carácter cmp al,tab ;otro si tabulador je HallaCar cmp al,20h ;otro si espacio je HallaCar cmp al,coma ;otro si coma je HallaCar dec si ;apunta con SI al carácter cmp al,0Dh ;sale con acarreo en "1" si je @@10 ;fin de linea alcanzado

;limpia acarreo y sale ret

@@10:

stc ;pone acarreo y sale ret

ENDP HallaCar PROC HallaDelim

lodsb ;trae el carácter siguiente cmp al,tab ;sale si tabulador je @@10 cmp al,20h ;sale si espacio je @@10 cmp al,coma ;sale si coma je @@10 cmp al,rc ;hace mas si el fin jne HallaDelim ;de linea no alcanzado dec si ;pone acarreo y salir stc ret

@@10: dec si ;limpia acarreo y salir clc ret

ENDP HallaDelim PROC BuscaSw

push si ;Salva SI @@10:

lodsb ;trae un carácter cmp al,rc ;sale si fin de linea je @@20 cmp al,"?" ;Loopea si no "?" jne @@10 cmp [byte ptr si-2],"/" ;itera si no "/" jne @@10 add sp,2 ;limpia la pila

;HALLADELIM avanza SI al siguiente carácter "blanco". Al retornar, ;CF = "1" indica que el fin de la linea fue alcanzado.

;BUSCASW barre la linea de comando por un switch /?. Si lo halla CF retorna ;en "1" y SI contiene el sesgo del switch. Si no, el acarreo retorna en "0".

Page 7: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-7

sub si,2 ;Ajusta SI stc ;pone acarreo y sale ret

@@20:

pop si ;Restaura SI clc ;limpia acarreo y sale ret

ENDP BuscaSw PROC encripta

mov di,offset buffer ;apunta con DI al buffer mov si,[clave] ;apunta con SI a la clave mov cx,[BytLeidos] ;Inicia CX

@@10:

lodsb ;trae de la clave un carácter cmp al,22h ;Brinca si no doble jne nodoble ;comilla mov si,[clave] ;Repone SI lodsb ;trae otro carácter

nodoble: xor [di],al ;Encripta un byte inc di ;Avanza puntero de buffer loop @@10 ;Loopea hasta acabar

;Hace la segunda pasada a traves del archivo..

mov di,offset buffer ;apunta con DI al buffer mov si,offset BuscaSw ;apunta con SI a BuscaSw mov cx,[BytLeidos] ;Inicia CX

@@20:

lodsb ;trae un carácter cmp al,0C3h ;Brinca si valor es jne noC3 ;diferente a C3h mov si,offset BuscaSw ;Repone SI lodsb ;trae otro carácter

noC3: xor [di],al ;Encripta un byte inc di ;Avanza puntero del buffer loop @@20 ;Loopea hasta terminar ret ;Retorna

ENDP encripta

buffer =$ ;buffer de E/S de archivos END inicia ;fin de programa CIFRAR.ASM

;CIFRAR encripta un bloque de datos usando un algoritmo tipo XOR

Page 8: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-8

3.2 Capturar lo siguiente (o algo parecido) en el archivo CIFR.TXT:

abcdefghijklmnopqrstuvwxz 1234567890 ABCDEFGHIJKLMNOPQRSTUVWXZ !”·$%&/()= <,.Ñ’+>;:_ñ^*?¿ NUESTRAS VIDAS SON LOS RIOS QUE VAN A DAR A LA MAR..

3.3 Ensamblar CIFRAR.ASM y hacerlo ejecutable mediante:

C:\SEM386>tasm /zi cifrar C:\SEM386>tlink /t cifrar

3.4 Ejecutar el programa CIFRAR y observar cómo encripta el archivo CIFR.TXT. A

continuación se muestran tres ejemplos de corrida del programa CIFRAR. Correrlo encriptando y desencriptando otros archivos, también.

C:\SEM386>type cifr.txt

abcdefghijklmnopqrstuvwxz 1234567890 ABCDEFGHIJKLMNOPQRSTUVWXZ !”·$%&/()= <,.Ñ’+>;:_ñ^*?¿ NUESTRAS VIDAS SON LOS RIOS QUE VAN A DAR ALA MAR..

C:\SEM386>cifrar cifr.txt “esime”

CIFRAR 1.1 Copyright © 1993 Jeff Prosise Adaptado de: PC Magazine DOS 6 Techniques and Utilities por S. Saucedo CIFR.TXT fue exitosamente (des)encriptado

C:\SEM386>type cifr.txt

R6�t◄(>qºÄc,öü▬Æ■C░#^=_yz&»*»I*½ÌijA ë&Ì fü¶V)�↑[Ì¥[ C:\SEM386>cifrar cifr.txt

CIFRAR 1.1 Copyright © 1993 Jeff Prosise Adaptado de: PC Magazine DOS 6 Techniques and Utilities por S. Saucedo Sintaxis: CIFRAR [d:][camino][NomArch “clave” o bien: CIFRAR /?

C:\SEM386>cifrar cifr.txt “esime”

CIFRAR 1.1 Copyright © 1993 Jeff Prosise Adaptado de: PC Magazine DOS 6 Techniques and Utilities por S. Saucedo CIFR.TXT fue exitosamente (des)encriptado

C:\SEM386>type cifr.txt

abcdefghijklmnopqrstuvwxz 1234567890 ABCDEFGHIJKLMNOPQRSTUVWXZ !”·$%&/()= <,.Ñ’+>;:_ñ^*?¿ NUESTRAS VIDAS SON LOS RIOS QUE VAN A DAR ALA MAR..

C:\SEM386>

Page 9: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-9

3.5 Capturar el programa siguiente y salvarlo con el nombre ORDENA.ASM, ensamblarlo y ligarlo con MAKE usando el archivo ORDENA, dado más adelante.

%TITLE "ORDENA.ASM demostracion interactiva de HOARE.ASM" %PAGESIZE 55,132 ; ORDENA.ASM Demonstracion de Proposito General para modo IDEAL ; con TASM 3.1 y Algoritmo QuickSort en Modulo HOARE.ASM ; ; Copyright (C) 1989 Ray Duncan Adaptó: Salvador Saucedo ; ; Hacer con: MAKE -fordena

IDEAL MODEL small DOSSEG STACK 2048

Verdad equ 1 falso equ 0 enteros equ falso ;oner a verdad para demo con enteros,

;y a falso para demo con cadenas cadenas equ verdad ;poner a verdad para demo con cadenas,

;y a falso para demo con enteros EnEst equ 0 ;handle para entrada estandar SalEst equ 1 ;handle para salida estandar ErrEst equ 2 ;handle para error estandar Rc equ 0dh ;ASCII para retorno de carro Nl equ 0ah ;ASCII para saltar linea

if cadenas TamArtic equ 35 ;bytes por cada cadena endif

if enteros TamArtic equ 2 ;bytes por cada entero endif n_artic equ 30 ;art. maximos a ordenar

codeseg assume cs:_text,ds:@data

extrn itoa:near extrn atoi:near extrn hoare:near

PROC ordena mov ax,@data ;hacer al segmento de datos mov ds,ax ;direccionable...

Page 10: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-10

cld ;fija seguridad de cadenas primero @@10: ;inicia entrada de datos

mov [ix1],0 ;inicia arreglo de indices

push ds ;forza ES = segmento de datos pop es mov di,offset artic ;inicia arreglo de datos mov cx,(n_artic*TamArtic) xor al,al rep stosb

;exhibe "Meter hasta xxx a ordenar"

mov dx,offset msj1 ;DS:DX = direc. del mensaje mov cx,msj1_len ;CX = largo del mensaje mov bx,SalEst ;BX = handle mov ah,40h ;Fcn 40H = escribe int 21h ;transfiere a MS-DOS

@@20: ;convierte numero de art. a ASCII

mov ax,[ix1] ;hace numero de art. basado en 1 mov bx,offset msj3a ;direc. para cadena call BinADec ;lo convierte

;exhibe numero de articulo

mov dx,offset msj3 ;DS:DX = mensaje direc. mov cx,msj3_len ;CX = largo mov bx,SalEst ;BX = handle mov ah,40h ;Fcn 40H = escribe int 21h ;transfiere a MS-DOS

if enteros ;si version de enteros

;lee entrada de teclado | mov dx,offset BufEnt ;DS:DX = buffer de entr. | mov cx,80 ;CX = largo max. entr . | mov bx,EnEst ;BX = handle | mov ah,3fh ;Fcn 3FH = leer | int 21h ;transfiere a MS-DOS |

; | cmp ax,2 ;algo fue entrado? | je @@30 ;linea vacia, salir |

; | mov si,offset BufEnt ;convierte entrada a | call atoi ;binario en reg. AX |

; | mov bx,[ix1] ;pone datos en arreglo | shl bx,1 ;(numero art * 2) | mov [word bx+artic],ax ; |

endif ; ----------------------------------------- if cadenas ;si version de cadenas----------- mov ax,[ix1] ;calcula sego d arreglo | mov dx,TamArtic ;para cadena recibida | imul dx ; |

Page 11: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-11

mov dx,ax ; | add dx,offset artic ;DS:DX = direc arreglo | mov cx,TamArtic ;CX = largo max. entr. | mov bx,EnEst ;BX = handle | mov ah,3fh ;Fcn 3FH = leer | int 21h ;transfiere a MS-DOS |

; | cmp ax,2 ;algo fue entrado? | je @@30 ;linea vacia, salir |

endif ; ----------------------------------------

inc [ix1] ;cuenta arts. salvados cmp [ix1],n_artic ;sin exceder el maximo jne @@20 ;trae otra entrada

@@30: ;linea vacia entrada

cmp [ix1],0 ;¿hay datos en el arreglo? je @@50 ;no, salirse

;si si, ordenar datos... mov si,offset artic ;DS:SI = primer articulo mov ax,[ix1] ;DS:DI = ultimo articulo dec ax mov di,TamArtic imul di mov di,ax add di,si mov bx,_text ;ES:BX = direc. de mov es,bx ;rutina de comparacion if enteros mov bx,offset compi

endif if cadenas mov bx,offset comps

endif mov ax,TamArtic ;AX = bytes por articulo call hoare ;llama a rutina QuickSort

;exhibe datos ordenados...

mov [ix2],0 ;inicia indice del arreglo

;exhibe "Aquí están las xxx ordenadas..."

mov dx,offset msj2 ;DS:DX = dir. del mensaje mov cx,msj2_len ;CX = largo de mensaje mov bx,SalEst ;BX = handle mov ah,40h ;Fcn 40H = escribe int 21h ;transfiere a MS-DOS

@@40: ;exhibe sgte articulo ;convierte numero de articulo en ASCII

mov ax,[ix2] ;hace numero de art. basado en 1

Page 12: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-12

inc ax mov bx,offset msj3a ;direc. para cadena call BinADec ;la convierta

;exhibe numero de articulo

mov dx,offset msj3 ;DS:DX = mensaje direc. mov cx,msj3_len ;CX = largo de mensaje mov bx,SalEst ;BX = handle mov ah,40h ;Fcn 40H = escribe int 21h ;transfiere a MS-DOS

if enteros ;si version de enteros ------------ mov bx,[ix2] ;calc. sesgo de arreglo | shl bx,1 ;y trae datos | mov ax,[word bx+artic] ; |

; | ;convierte dato a ASCII |

mov cx,10 ;usa base 10 | mov si,offset BufSal ;direc. para cadena | call itoa ;la convierte |

; | ;exhibe entero |

mov cx,ax ;CX = largo de cadena | mov dx,si ;DS:DX = dir. de cadena | mov bx,SalEst ;BX = handle | mov ah,40h ;Fcn 40H = escribe | int 21h ;transfiere a MS-DOS |

endif ; ----------------------------------------- if cadenas ;si modo para cadena------------ mov ax,[ix2] ;calcula dir. arreglo | mov dx,TamArtic ;DS:DX = un elemento | imul dx ; | mov dx,ax ; | add dx,offset artic ; | push ds ;busca fin de cadena | pop es ; | mov di,dx ; | mov cx,-1 ; | xor al,al ; | repnz scasb ; | not cx ;CX = largo sin | sub cx,3 ;rc y nl | mov bx,SalEst ;BX = handle | mov ah,40h ;Fcn 40H = escribe | int 21h ;transfiere a MS-DOS |

endif ;------------------------------------------

inc [ix2] ;avanza en el arreglo mov ax,[ix2] ;¿acabo con el arreglo? cmp ax,[ix1] jne @@40 ;no, exhibe otro

jmp @@10 ;reinicia entrada del usuario

@@50:

Page 13: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-13

mov ax,4c00h ; salida final a MS-DOS int 21h

ENDP ordena ; BINADEC Convierte valor binario 0-99 a 2 caracteres ASCII ; ; Entrada: AL = dato ; BX = direc. para salvar 2 caracteres ; ; Retorna: Nada ; ; Destruye: AX PROC BinADec near

aam ;divide AL por 10, dejando ;AH=cociente, AL=residuo

add ax,'00' ;convierte a ASCII mov [bx],ah ;salva digito de decenas mov [bx+1],al ;salva digito de unidades ret ;retorna

ENDP BinADec ; COMPI - Compara Dos Enteros (para usar con HOARE.ASM) ; ; Entrada: DS:SI = direccion del entero 1 ; ES:DI = direccion del entero 2 ; CX = largo de los datos (no usados aqui) ; ; Retorna: Resultado en banderas del CPU ; ; Destruye: AX

if enteros PROC compi far

mov ax,[si] cmp ax,[di] ret

ENDP compi endif ; COMPS Compara dos cadenas (para usar con HOARE.ASM) ; ; Entrada: DS:SI = direc. de cadena 1 ; ES:DI = direc. de cadena 2 ; CX = largo de datos ; ; Retorna: Resultado en indicadores del CPU ; ; Destruye: CX

if cadenas PROC comps far

push si

Page 14: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-14

push di repz cmpsb pop di pop si ret

ENDP comps

endif dataseg

msj1 db rc,nl,nl

if enteros db 'Meter hasta 30 números menores a 65535 a ordenar...'

endif if cadenas

db 'Meter hasta 30 cadenas de menos de 32 caracteres a ordenar...' endif

db rc,nl msj1_len = $ - msj1 msj2 db rc,nl

if enteros db 'Aquí están los números en orden...'

endif if cadenas

db 'Aquí están las cadenas en orden...' endif

db rc,nl msj2_len = $ - msj2 msj3 db rc,nl,'Artic' msj3a db 'xx: ' msj3_len = $ - msj3 BufEnt db 40 dup (?) ;buffer para entrada del teclado BufSal db 40 dup (?) ;buffer para conversion de salida artic db (n_artic * TamArtic) dup (0) ;tiene datos a ordenar ix1 dw 0 ;numero de articulos en elarreglo ix2 dw 0 ;puntero a arreglo de salida

end ordena

Page 15: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-15

3.6 Capturar el siguiente módulo con el nombre HOARE.ASM que es una rutina que puede llamarse a sí misma y que clasifica una serie de artículos con el método "Quicksort", propuesto por Hoare:

;HOARE.ASM Algoritmmo Quick Sort (partición / trueque) de Propósito General ; ; Copyright (C) 1989 Ray Duncan adaptó Salvador Saucedo ; ; Entrada: DS:SI = direccion de primer articulo a ordenar ; DS:DI = direccion de ultimo articulo a ordenar ; ES:BX = direc de rutina de comparacion ; AX = largo de cada articulo ; ; Retorna: Nada (datos ordenados en su lugar) ; ; Destruye: Nada ; ; La rutina externa para comparar debe ser declarada como 'far' ; y ella debe aceptar los siguientes parametros: ; DS:SI = direc de 1er articulo a comparar ; ES:DI = direc de 2nd articulo a comparar ; CX = largo a comparar ; La rutina de comparacion debe retornar DS:SI y ES:DI sin cambios y ; el resultado de la comparacion en las banderas del CPU: ; ZF = 1 si articulo 1 = articulo 2 ; ZF = 0, SF = 1 si articulo 1 < articulo 2 ; ZF = 0, SF = 0 si articulo 1 > articulo 2 codeseg assume cs:_text,ds:Nothing,es:Nothing ;variables de pila compara equ [dword ptr bp-4] ;direc de rutina de comparar TamArtic equ [bp-6] ;bytes por articulo Primer equ [bp-8] ;primer articulo a ordenar Ultimo equ [bp-10] ;ultimo articulo a ordenar Public hoare PROC hoare near Cmp di,si ;si ultimo <= primero Na @@50 ;solo sale Push bp ;prepara la pila mov bp,sp ;y variables locales

push es ;salva direccion de push bx ;rutina de comparacion push ax ;salva bytes por articulo push si ;sesgo de 1er articulo push di ;sesgo ultimo articulo push cx dx ;salva demas registeros push ds ;hace a los datos direccionables por pop es ;ES para rutina de intercambio

Page 16: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-16

sub si,TamArtic ; SI = i = primer - 1 ;DI = ultimo mov bx,di ;BX = j = ultimo @@10: ;particiona el arreglo con el ;valor del articulo en extremo derecho @@20: ;barre a la derecha por articulo ;>= valor de particion add si,TamArtic ;incrementa i mov cx,TamArtic call compara ;mientras(articulo[i] < articulo[ultimo]) jl @@20 xchg bx,si ;SI = j, BX = i, DI = ultimo @@30: ;barre primero por articulo ;<= valor de particion sub si,TamArtic ;decrementa j cmp si,primer ;mientras(articulo[j] > articulo[ultimo]) jna @@40 ;y que (j > primer)

mov cx,TamArtic call compara jg @@30 @@40: xchg bx,di ;SI = j, DI = i, BX = ultimo mov cx,TamArtic call trueca ;trueca los articulos xchg si,di ;SI = i, DI = j, BX = ultimo xchg di,bx ;SI = i, DI = ultimo, BX = j cmp bx,si ;mientras(j > i) ja @@10 ;(hacer hasta que punteros se crucen) xchg bx,di ;SI = i, DI = j, BX = ultimo mov cx,TamArtic call trueca ;deshace el ultimo trueque xchg bx,di ;SI = i, DI = ultimo, BX = j mov cx,TamArtic call trueca ;pone elemento de particion ;en posicion push si ;salva i mov di,si ;hoare(primer, i-1) sub di,TamArtic mov si,primer les bx,compara mov ax,TamArtic call hoare pop si ;hoare(i+1, ultimo) add si,TamArtic

Page 17: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-17

mov di,ultimo les bx,compara mov ax,TamArtic call hoare pop dx cx di si ax ;restaura registros pop bx es bp @@50: ret ;retorna a llamador ENDP hoare ; trueca: trueca dos datos o articulos ; ;Entrada: DS:SI = direc de primer articulo ; DS:DI = direc de segundo articulo ; CX = largo del articulo ; ;Retorna: Nada ; ;Destruye: AX, CX PROC trueca near cmp cx,2 ;¿los articulos son cadenas? Jne @@10 ;no, salta Mov ax,[di] ;articulos son cadenas, Xchg ax,[si] ;la trueca rapido Mov [di],ax

ret @@10: push si di ;salva direcciones @@20: mov al,[di] ;trueca articulos xchg al,[si] ;byte por byte mov [di],al inc si inc di loop @@20 pop di si ;restaura direcciones ret ENDP trueca end

Page 18: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-18

3.7 Capturar el siguiente módulo en el archivo ORDENA (sin extensión) que constituye el archivo que procesa MAKE para formar el ejecutable:

3.8 Pedir al asistente los archivos ATOI.ASM e ITOA.ASM y ejecutar el comando:

C:\SEM386>make -fordena

A continuación se formará el archivo ORDENA.EXE mismo que se debe ejecutar para probarlo, primero en la versión de cadenas; reeditar ORDENA.ASM para probar la versión de números.

ordena.exe : ordena.obj atoi.obj itoa.obj hoare.obj tlink /v ordena+hoare+atoi+itoa; atoi.obj: atoi.asm tasm /zi atoi itoa.obj: itoa.asm tasm /zi itoa hoare.obj: hoare.asm tasm /zi hoare ordena.obj: ordena.asm tasm /zi ordena

Page 19: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-19

C:\SEM386>ordena Meter hasta 30 cadenas de menos de 32 caracteres a ordenar... Item 01: kasparov garry Item 02: karpov anatoli Item 03: anand viswanatand Item 04: ivanchuk vassili Item 05: shirov alexei Item 06: salov valeri Item 07: short nigel Item 08: gelfand boris

EJEMPLO DE CORRIDA DE ORDENA PARA CADENAS:

Item 09: bareiev eugenei Item 10: georgiev kiril Item 11: epishin vladimir Item 12: topalov vesselin Item 13: jalifman alexander Item 14: kamsky gata Item 15: smirin ilya Item 16: kramnik vladimir Item 17: kaidanov alexander Item 18: tiviakov sergei Item 19: malaniuk victor Item 20: gulko boris Item 21: adams michel Item 22: azmaparasvili zoltan Item 23: polgar judith Item 24: illescas miguel Item 25: korchnoi victor Item 26: nikolic pedrag Item 27: timman jan Aquí están las cadenas en orden... Item 01: adams michel Item 02: anand viswanatand Item 03: azmaparasvili zoltan Item 04: bareiev eugenei

Page 20: practica 15 ensamblador 80386

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

15-20

4. TAREAS

4.1 Modificar CIFRAR.ASM para que pueda encriptar más de un archivo con una sola clave; es decir que el nombre del archivo pueda tener comodines.

4.2 Hacer que el programa ORDENA clasifique usando el algoritmo "Q", que consiste

en clasificar los subarchivos menores a ocho artículos por el método de inserción directa y clasificar a los mayores o iguales a ocho por el método ya visto.

4.3 Hacer un programa, SORTEA, que trabaje abriendo un archivo ASCII. Que cree

otro donde se pongan los registros del primero ya clasificados.

Item 05: epishin vladimir Item 06: gelfand boris Item 07: georgiev kiril Item 08: gulko boris Item 09: illescas miguel Item 10: ivanchuk vassili Item 11: jalifman alexander Item 12: kaidanov alexander Item 13: kamsky gata Item 14: karpov anatoli Item 15: kasparov garry Item 16: korchnoi victor Item 17: kramnik vladimir Item 18: malaniuk victor Item 19: nikolic pedrag Item 20: polgar judith Item 21: salov valeri Item 22: shirov alexei Item 23: short nigel Item 24: smirin ilya Item 25: timman jan Item 26: tiviakov sergei Item 27: topalov vesselin Meter hasta 30 cadenas de menos de 32 caracteres a ordenar... Item 01: C:\SEM386>