Académique Documents
Professionnel Documents
Culture Documents
PRCTICA 2
PRCTICA 2
CONVERSIN DE UN NMERO DECIMAL A BINARIO Y HEXADECIMAL Y VICEVERSA
1. INTRODUCCIN
En esta prctica convertiremos un nmero decimal, introducido por el teclado, a binario y hexadecimal y viceversa. Usaremos mdulos anteriores y veremos mdulos nuevos.
2.
OBJETIVOS
Al trmino de esta prctica el alumno sabr:
2.1 Leer una cadena de caracteres mediante servicio 0AH, de la interrupcin 21H.
2.2
2.3
2.4
3.
3.1
DESARROLLO
Procedimiento para leer cadenas.
PUBLIC
;LeeCadena ; ;Entrada: ; ; ;Salida: ;Registros:
LeeCadena
LEE CADENA CON TECLAS DE EDICIN DI = direccin destino de la cadena CL = lmite mximo de cadena sin incluir terminador nulo Si CL = 0, LeeCadena no hace nada Cadena copiada de la entrada estndar en el buffer ninguno
PROC
and jz push
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 2
push push push mov mov mov int xor mov mov mov call pop pop
bx dx si [Buffer.maxlon],cl ah,0ah dx,offset Buffer.maxlon 21h bh,bh bl,[Buffer.cadlon] [bx + Buffer.carac],ASCnulo si,offset Buffer.carac CopiaCad si dx bx ax
;Pone byte de largo mximo ;Entrada de cadenas con DOS ;DS:DX apunta a la estructura ;DOS captura la cadena ;Parte alta de BX a cero ;BX = nmero de caracteres en el Buffer ;Cambia RC a ASCII nulo (0) ;Apunta al buffer con SI ;Copia cadena al buffer del ;usuario ;Repone registros
@@99:
ret
;Regresa a programa fuente
ENDP
LeeCadena
Mediante este procedimiento se introducir el nmero a convertir. Utilizaremos la interrupcin 21H, servicio 0AH para introducir caracteres por el teclado y para capturar la cadena oprimimos RETURN.
3.2
PUBLIC
;CopiaCad ; ;Entrada: ; ;Salida ;Registros:
CopiaCad, MueveIzq
COPIA UNA CADENA EN OTRA SI = direccin de cadena fuente, cad1 DI = direccin de cadena destino, cad2 Caracteres en cad1 copiados en cad2 Ninguno
PROC
push push push xchg call
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 2
;Ms uno para incluir terminador ;Repone SI y DI ;ndice de la fuente = 0 ;ndice del destino = 0 ;Copia fuente a destino ;Repone registros
ENDP
;MueveIzq ; ;Entrada: ; ; ; ; ;Salida: ;Registros:
CopiaCad
MUEVE BLOQUE DE BYTES A LA IZQ. (HACIA ABAJO) EN MEMORIA SI = direccin de cadena fuente, cad1 DI = direccin de cadena destino, cad2 BX = ndice de cad1,i1 DX = ndice de cad2,i2 CX = nmero de bytes a mover (K) Se mueven K bytes de cad1 [i1] a cad2 [i2] Ninguno
PROC
MueveIzq jcxz @@99 push cx push si push di add si,bx add di,dx cld rep movsb pop di pop si cx
;Salir si K = 0 ;Salva registros modificados
;Agrega ndice ;Agrega ndice al destino ;incrementando direcciones ;Mover mientras CX <> 0
@@99:
ret
ENDP
MueveIzq
Con estos procedimientos copiamos la cadena original en otra para posteriormente eliminar ceros delanteros (ceros a la izquierda).
3.4
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
2-3
PRCTICA 2
3.5
PUBLIC PUBLIC
;BinSAscDec ; ;Entrada: ;Salida: ;Registros:
CONVERTIR BINARIO CON SIGNO A CADENA ASCII DECIMAL Misma que BinAscHex (AX es ahora de 16 bits, signado) Ninguna AX, CX
PROC
push push cmp jge neg mov inc
@@10:
mov call pop ret bx,10 NumAsc di bx
;Pone base igual a 10 ;Convierte AX a ASCII ;Recupera registros
ENDP
;BinSscBin ; ;Entrada: ;Salida: ;Registros:
BinSAscDec
CONVIERTE VALOR BINARIO A CADENA ASCII DE DGITOS BINARIOS Misma que BinAscHex Ninguna AX, CX (indirectamente)
PROC
push mov call pop ret
ENDP
BinAscBin
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
2-4
PRCTICA 2
CONVIERTE CADENA ASCII A BINARIO DI = cadena ASCII a convertir a binario H al fin de cadena = hexadecimal B al fin de cadena = binario D al fin de cadena = decimal _ indica nmero negativo No se permiten blancos en la cadena CF = 1: carcter ilegal. AX es irrelevante CF = 0: AX = valor binario AX
PROC
push call call xor jcxz mov add cmp pushf jne inc
AscBin bx cx dx si MayusCad LargoCad ax,ax @@99 si,di si,cx [byte di],'-' @@10 di
;Salva registros ;Convierte cadena a mayscula ;CX = largo de cadena en DI ;Resultado parcial = 0 ;S largo = cero. AX= 0 CF= 0 ;Direccin cadena con SI ;Avanza Si al terminador nulo ;Verifica si es negativo ;Salva banderas de comparacin ;Brinca si es positivo ;Brinca al signo de menos
@@10:
call call rcl popf jne neg dec CarBase AscNum bx,1 @@20 ax di
;Pone BX = nmero base. SI = ltimo digito ;Convierte ASCII a nmero ;Salva CF en BX ;Repone banderas de comparacin ;Forma complemento a 2s de AX ;Repone DI a cabeza de cadena
@@20:
rcr bx,1
;Repone CF desde BX
@@99:
pop ret si dx cx bx
;Repone registros ;Regresa
ENDP
AscBin
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
2-5
PRCTICA 2
SI apunta al terminador nulo al fin de la cadena BX = 2 (binario), 10 (decimal), 16 (hexadecimal) SI = direccin del ltimo dgito de la cadena BX, DL, SI
PROC
mov mov cmp je mov cmp je mov cmp jne
CarBase dl,[byte si-1] bx,16 dl,'H' @@10 bx,2 dl,'B' @@10 bx,10 dl,'D' @@20 ;
;Trae ltimo carcter de la cadena ;Pone si es hexadecimal ;Es cadena hex ? ;Si, brinca ;Por si es binario ;Es binario? ;Si, brinca ;Pon si es decimal ;Es decimal ? ;Brinca si no
@@10:
dec si
;Ajusta SI
@@20:
ret
ENDP
;AscNum ; ;NOTA: ;Entrada: ; ; ; ;Salida: ; ;Registros:
CarBase
CONVIERTE CARACTERES ASCII A BINARIO
Rutina privada para AscBin. No llamarla directamente
AX = valor inicial (0) BX = base (2=binario, 10=decimal, 16=hexadecimal) DI = direccin de cadena no asignada (cualquier formato) SI = direccin de ltimo dgito de la cadena CF = 0: AX valor binario sin signo CF = 1: conversin no fue posible AX, CX, DX, SI
PROC
mov
AscNum cx,1
;Inicia multiplicador
@@10:
cmp je dec mov call jc si,di @@99 si dl,[byte si] ValCar @@99
;Al inicio de la cadena ;Procesa siguiente carcter a la izquierda ;Pone carcter en DL ;Convierte a valor en DX ;Sale si error (carcter ilegal)
2-6
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 2
;AX = multiplicador CX = res. parcial ;DX,AX = valor dgito*multiplicador ;CX = nuevo valor parcial ;Repone multiplicador ;DX.AX = mult*base ;AX = res. parcial CX = nuevo ;multiplicador
@@99:
ret
ENDP
;VarCar ; Entrada: ; ;Salida: ; ;Registros:
AscNum
CONVIERTE DE DGITO EN ASCII A VALOR BINARIO DL = dgito ASCII 0.9, A.F BX = base (2= binario, 10=decimal, 16=hexadecimal) CF = 0: DX = valor binario equivalente CF = 1: mal carcter para esta base (DX es irrelevante) DX
PROC
cmp jbe sub
@@10:
sub test jnz xor cmp dl,'0' dl,0f0h @@99 dh,dh dx,bx
;Convierte ASCII a decimal ;Verifica 4 bits altos (CF = 0) ;Brinca si error (no dgito o A-F) ;Convierte DL a 16 bits ;Compara con no. base (CF = 1 si bien)
@@99:
cmc ret
;Complementa para fijar bandera de error ;Regresa
ENDP
ValCar
El procedimiento BinSASCDec convierte un nmero negativo a cadena ASCII decimal anteponiendo el signo negativo al exhibirlo. El procedimiento BinASCBin convierte una cadena binaria a cadena ASCII de nmeros binarios, colocando en el registro BX la base de conversin. El procedimiento ASCBin convierte la cadena de entrada a maysculas, luego cuenta los
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
2-7
PRCTICA 2
caracteres de la cadena; si no hay caracteres este procedimiento no hace nada y sale. Adems prueba si la cadena tiene el signo "-", si es as salva el signo y llama a CarBase. Luego llama al procedimiento ASCNum, el cual convierte caracteres ASCII a binario; si CF es uno el carcter encontrado es ilegal. El procedimiento ValCar convierte dgito ASCII a binario, CF es uno el carcter es ilegal.
3.6
3.7
%TITLE
small
LargoCola ColaCmndo
EQU EQU
0080h 0081h
DATASEG
NumParam params DW DB ? 128 DUP (?)
;Nmero de parmetros ;128 bytes para las cadenas
CODESEG PUBLIC
;Separa ; ;Entrada: ;Salida: ;Registros:
DS: SI apunta a carcter a verificar ZF = 1 (je) carcter es blanco, tabulador o retorno de carro ZF = 0 (jne) carcter separador AC
PROC
mov cmp
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 2
je cmp je cmp
@@10:
ret
;Regresa
ENDP
Separa
REGRESA CONTEO DE LOS PARMETROS INTRODUCIDOS Ninguna DX = nmero de parmetros en lnea de comando Al usar TraeUnPar, CX debe ser menor que el valor retornado DX
PROC
mov ret
CuentaPar dx,[NumParam]
;Trae valor de la variable ;Regresa
ENDP
;TraePar ; ;Entrada: ; ; ;Salida: ; ;Registros:
CuentaPar
OBTIENE LOS PARMETROS DE LA LNEA DE COMANDOS DS = PSP = prefijo del segmento del programa ES = segmento de datos del programa Llamar esta rutina antes de iniciar DS Parmetros globales llenos de cadenas ASCIIZ DS = segmento de datos del programa AL, BX, DX, SI, DS
PROC
;
TraePar
Inicia contador (CX), y registros ndice (SI,DI)
;Parte alta de CX a cero ;CX = nmero de bytes introducidos ;Incluir RC al final ;Apunta a parmetros con SI
@@10:
call jne inc Separa @@20 si
;Salta tabs. y espacios ;Brinca si no espacio ni tabulador ;Salta este carcter
2-9
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 2
loop
;
@@10
@@20:
push jcxz cld rep
;
cx @@30 movsb
;Salva CX para ms tarde ;Omite movsb si cuenta = 0 ;Autoincrementa ;Copia CX bytes de DS:SI a ES:DI
@@30:
push pop pop xor jcxz mov es ds cx bx,bx @@60 si,offset params
;Salva ES en pila ;Hace DS = ES ;Inicia conteo de parmetros ;Omite bucle si largo = 0 ;Apunta a parmetros con SI
@@40:
call jne mov inc Separa @@50 [byte ptr si],0 bx
;Verifica si blanco, tabulador o retorno de carro
@@50:
inc loop si @@40
;Apunta a siguiente carcter ;Sigue hasta agotar CX
@@60:
mov ret [NumParam],bx
; Salva nmero de parmetros
ENDP
;TraeUnPar ; Entrada: ; ;Salida: ;Registros:
TraePar
OBTIENE DIRECCIN DEL PARMETRO PEDIDO POR NMERO CS = nmero de parmetros (0 = primero)
NOTA: CX debe ser menor que el nmero de parmetros
PROC
xor mov
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 2
@@10:
scasb jnz @@10 loop @@10
;Examina si es nulo ;Repite hasta hallarlo ;Hasta agotar CX
@@99:
ret
ENDP END
3.9
TraeUnPar
;Fin de mdulo PARAMS.ASM
3.10
C>TLIB REM,CON
3.12 Capturar el programa para convertir un nmero decimal a binario, hexadecimal; decimal sin signo y con signo.
%TITLE
small 256
FDC rc nl LarMax
0 13 10 40
;Fin de cadena ;Ret. de carro ;ASCII para nueva lnea ;Mximo largo de cadena de entrada
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
2-11
PRCTICA 2
DATASEG
ClaveFin Saludo DB DB DB DB DB DB DB DB DB DB DW DB
;Cdigo de error de DOS 0 Convierte valores decimales, binarios y hex' rc,nl,' rc,nl,'Dar el nmero a convertir en decimal' rc,nl,'Dar ENTER para salir',rc,nl,FDC rc,nl,nl,nl,'Nmero a convertir? ',FDC rc,nl,'ERROR: carcter ilegal en lnea',FDC rc,nl,'Binario ............ :',FDC rc,nl,'Hexadecimal ........ :',FDC rc,nl,'Decimal sin signo .. :',FDC rc,nl,'Decimal con signo .. :',FDC ;Resultado de AscBin ? LarMax +1 DUP (?) ;Cadena para entrada/respuesta del ;usuario
CODESEG
; De MANCADE.OBJ
EXTRN
;
LargoCad:proc,CopiaCad:proc
De CADENAS.OBJ
EXTRN
;
LeeCadena:proc,SacaCadena:proc,NuevaLinea:proc
De BINASC.OBJ
EXTRN EXTRN
;
BinAscHex:proc,BinSAscDec:proc,BinAscDec:proc BinAscBin:proc,AscBin:proc
De PARAMS.OBJ
EXTRN Inicia:
mov mov call mov call and je mov call mov xchg call jmp
TraePar:proc,CuentaPar:proc,TraeUnPar:proc
ax,@data es,ax TraePar ds,ax CuentaPar dx,dx normal cx,0 TraeUnPar si,offset Respuesta di,si CopiaCad short rep1
;Inicia ES con segmento de datos ;Trae parmetros de lnea de comando ;inicia segmento ;Hubo parmetros ? ;No, brinca ;Trae primer parmetro ;SI apunta a buffer de entrada ;1er parmetro en cadena de entrada ;Salta a repetir (omite saludo)
normal:
mov di,offset saludo
;Apunta a bienvenida
2-12
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 2
call
;
SacaCadena
;Exhibe bienvenida
Apronta al usuario
Repite:
mov call mov mov call di,offset apronta SacaCadena di,offset Respuesta cx,LarMax LeeCadena
;Apunta apronta ;Exhibe apronta ;Trae respuesta del usuario ;Mxima longitud
rep1:
call call jcxz call mov jnc mov call jmp NuevaLinea LargoCad Salir AscBin [valor],ax seguir di,offset error SacaCadena repite
;Exhibe otra lnea ;Usuario dio ENTER ? ;Si, sale (CX = 0) ;Convierte cadena a AX ;Pone resultado en variable ;Brinca si CF es 0 (no error) ;Caso contrario saca mensaje error. ;Exhibe error.
seguir:
mov call mov mov mov call call mov call mov mov mov call mov call mov mov mov call call mov call mov mov mov call call di,offset binario Sacacadena ax,[valor] cx,16 di,offset respuesta BinAscBin Sacacadena di,offset hex Sacacadena ax,[valor] cx,4 di,offset respuesta BinAscHex di,offset decimal Sacacadena ax,[valor] cx,1 di,offset respuesta BinAscDec Sacacadena di,offset decimalS Sacacadena ax,[valor] cx,1 di,offset respuesta BinSAscDec Sacacadena
;Apunta a etiqueta para binario ;Exhibe cadena ;Trae valor a convertir ;Exhibe 16 dgitos por lo menos ;Usa misma cadena de resultado ;Halla dgitos binarios ;Exhbelos ;Apunta a etiqueta para hexadecimal ;Exhibe cadena ;Trae valor a convertir ;Exhibe 4 dgitos por lo menos ;Usa misma cadena de resultado ;Halla dgitos hex. call Sacacadena ;Exhbelos ;Apunta a etiqueta para decimal ;Exhibe cadena ;Trae valor a convertir ;Exhibe un dgito por lo menos ;Usa misma cadena de resultado ;Halla dgitos decimales ;Exhbelos ;Apunta a cadena ;Exhibe cadena ;Trae valor a convertir ;Exhibe un dgito ;Usa misma cadena de resultado ;Halla dgitos decimales ;Exhbelos
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
2-13
PRCTICA 2
Salir:
mov mov int ah,4ch al,[ClaveFin] 21h
; Fin de mdulo CONVI.ASM
END inicia
El programa exhibe el saludo y comentarios, por medio de otro letrero espera la entrada del nmero a convertir; una vez introducido el nmero, se llama a los procedimientos que se encuentran en el mdulo BINASC.ASM, los cuales se encargan de hacer las operaciones pertinentes.
3.13
C>LINK CONVI,,,REM
3.14 Ejecutar el programa con el comando:
C>CONVI
y:
C>CONVI 34567
3.15 Este programa se puede depurar con Turbo Debugger mediante el siguiente comando:
C>TD CONVI.EXE
3.16 Ir a la ventana VIEW, en la opcin REGS oprimir la tecla ENTER, hacer ms chica la ventana con el ratn. Con F8 correr un procedimiento, con F7 ir paso a paso y con F9 correr el programa. Analizar con cuidado la conversin de un nmero ASCII a binario.
4.
4.1
TAREAS
Extender hasta 24 bits los nmeros binarios soportados, segn sugiere la tabla dada ms abajo.
4.2
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 2
4.3
Hacer que el programa sea ms informativo con el usuario y exhibir un letrero con opcin de realizar otro clculo antes de salir del programa.
4.4
Introducir al programa el procedimiento Confirma y llamarlo para verificar la salida del programa, por si hay error. Hacer un programa que escriba su propio nombre, incluyendo la ruta, de tal modo que si es cambiado de nombre con el comando REN de DOS reporte en nombre nuevo. Lo mismo si es movido o copiado a otro directorio.
Cuando se hagan modificaciones en un programa hay que ensamblarlo, meterlo a la librera o crear el ejecutable, segn sea el caso.
4.5
NOTA:
5
DEC H E X 0 1 2 3 4 5 6 7 8 9 A B C D E F
4
DEC H E X 0 1 2 3 4 5 6 7 8 9 A B C D E F
3
DEC H E X 0 1 2 3 4 5 6 7 8 9 A B C D E F
2
DEC H E X 0 1 2 3 4 5 6 7 8 9 A B C D E F
1
DEC
0 1,048,576 2,097,152 3,145,728 4,194,304 5,242,880 6,291,456 7,340,032 8,388,608 9,437,184 10,485,760 11,534,336 12,582,912 13,631,488 14,680,064 15,728,640 7 6 5 4
0 65,536 131,072 196,608 262,144 327,680 393,216 458,752 524,288 589,824 655,360 720,896 786,432 851,968 917,504 983,040 3 2 1 0
0 4,096 8,192 12,288 16,384 20,480 24,576 28,672 32,768 36,864 40,960 45,056 49,152 53,248 57,344 61,440 7654
0 256 512 768 1,024 1,280 1,536 1,792 2,048 2,304 2,560 2,816 3,072 3,328 3,584 3,840 3210
0 16 32 48 64 80 96 112 128 144 160 176 192 208 224 240 7654
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 3210
BYTE MAYOR
BYTE MEDIANO
BYTE MENOR
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
2-15
PRCTICA 2
EJEMPLOS DE CORRIDAS
C:\SEM386>convi
Nmero a convertir?
C:\SEM386> C:\SEM386>convi 34567 Binario Hexadecimal Decimal sin signo Decimal con signo 1000011100000111 8707 34567 -30969
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
2-16
PRCTICA 2
Nmero a convertir?
C:\SEM386>
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
2-17
Nombre de archivo: practica 2 ensamblador 80386 Directorio: C:\Computacion V\practicas 80386 Plantilla: C:\WINDOWS\Application Data\Microsoft\Plantillas\Normal.dot Ttulo: PRCTICA 2 Asunto: Prcticas de laboratorio de Computacin V Autor: M. en C. Salvador Saucedo Flores Palabras clave: Comentarios: Fecha de creacin: 05/07/02 04:00 P.M. Cambio nmero: 31 Guardado el: 22/07/02 12:46 P.M. Guardado por: Pablo Fuentes Ramos Tiempo de edicin: 646 minutos Impreso el: 29/07/02 01:46 P.M. ltima impresin completa Nmero de pginas: 17 Nmero de palabras: 2,442 (aprox.) Nmero de caracteres: 13,925 (aprox.)