PRCTICA 11
PRCTICA 11
SUMA, RESTA, MULTIPLICACIN Y DIVISIN DE DOS NMEROS ENTEROS POSITIVOS DE HASTA 20 DGITOS DECIMALES
1. INTRODUCCIN
Mediante esta prctica, trabajaremos con nmeros binarios de hasta veinte dgitos decimales y haremos las operaciones bsicas de suma, resta, multiplicacin y divisin de dos nmeros enteros positivos, donde el primer nmero debe ser mayor que el segundo
2.
OBJETIVOS
Al trmino de esta prctica el alumno podr:
Trabajar con rutinas aritmticas multidgito Realizar operaciones bsicas y exhibir el resultado Hacer que un programa sea ms robusto, es decir, que no falle.
3.
DESARROLLO
3.1.
Capturar los siguientes mdulos con el nombre MBIN.ASM, ensamblarlo y meterlo a la librera REM.
CUATRO OPERACIONES FUNDAMENTALES EN NMEROS DE 8 BYTES
%TITLE
small
doble dd
SumaBin,RestaBin,MultiBin,DivideBin,CompBin MbinAsc,MbinAscD,CopiaBin,EntraBin
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
11-1
PRCTICA 11
SUMA DE DOS NMEROS BINARIOS DE 64 BITS SI = direccin del primer nmero DI = direccin del segundo nmero BX = direccin del resultado Resultado donde se peda Ninguno
PROC
;salva todo ;pone nmero de palabras ;limpia CF ;trae palabra del primer nmero ;apunta a siguiente palabra ;suma palabra de segundo nmero ;apunta a siguiente palabra ;pone palabra resultante ;apunta a siguiente palabra
mov clc @@10: mov inc inc adc inc inc mov inc in loop pop ret
;recupera ;retorno
ENDP
;RestaBin ; ;Entrada: ; ; ;Salida: ;Registros:
RESTA DOS NMEROS BINARIOS DE 64 BITS SI = direccin del primer nmero (sustraendo) DI = direccin del segundo nmero (minuendo) BX = direccin del resultado (segundo primero) Resultado en su lugar, banderas se afectan segn resultado Ninguno
PROC
push mov clc @@10: mov in inc sbb pushf inc inc mov inc inc
RestaBin si di bx cx ax cx,4
;Salva todo ;resta cuatro palabras ;borra prstamo ;trae palabra de segundo nmero ;apunta a siguiente palabra ;sustrae palabra ;salva banderas ;apunta a siguiente palabra ;salva resultado ;apunta a siguiente palabra
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
11-2
PRCTICA 11
;recupera banderas
@@10 ax cx bx di si RestaBin
MULTIPLICA DOS NMEROS BINARIOS DE 64 BITS SI = direccin del primer factor DI = direccin del segundo factor BX = direccin para resultado Resultado de 128 bits Ninguno ;repone
ENDP
;MultiBin ; ;Entrada: ; ; ;Salida: ;Registros:
PROC
;
MultiBin push si di bx cx ax
Limpia rea de resultado
;salva todo
push mov mov cld @@10: mov inc inc loop pop mov @@20: push mov inc inc
bx x,0 cx,8
;salva apuntador ;pone ceros ;es de doble precisin ;hacia delante ;limpia una palabra ;apunta a siguiente palabra ;16 bytes ;recobra direccin ;trae nmero de palabras ;salva contador externo ;trae palabra del primer factor ;apunta a siguiente palabra
;salva registros durante lazo interno ;pone nmero de palabras ;restaura directorio a dividendo ;SI apunta a divisor temporal
mov
;
cx,1
;conteo de uno
normaliza divisor
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 11
inc jmp
;
cx @@10
@@20: call ja call stc jmp @@30: cic @@40: call call loop pop ret
;compara divisor contra dividendo ;salta si muy grande ;lo resta si cabe ;nuevo bit de cociente es uno ;salta a fin de lazo ;nuevo bit de cociente es cero
;recobra
ENDP PROC
;salva registros ;pone contador ;limpia CF ;corre una palabra un bit ;apunta a siguiente palabra ;hace todo el divisor ;repone
ENDP PROC
CorreCoc push bx cx mov cx,4 rcl [word bx],1 inc bx inc bx loop @@10 pop ret cx bx CorreCoc
;salva registros ;precisin sencilla ;corre palabra de cociente una vez ;apunta a siguiente palabra
;restaura
ENDP
;
PROC
CorreD push si cx
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 11
add mov clc @@10: rcr dec dec loop pop ret
si,14 cx,8
;apunta a final de divisor temporal ;para doble precisin ;limpia CF ;rota una palabra a la vez ;apunta a siguiente palabra ;para todo el divisor ;repone
ENDP
;
PROC
Sustrae push si di cx
;salva todo ;limpia acarreo final ;resta ocho palabras ;trae palabra del divisor ;apunta a siguiente palabra ;sustrae de palabra de dividendo ;apunta a siguiente palabra
clc mov @@10: mov inc inc sbb inc inc loop pop ret
;recupera
ENDP
;CompBin ; ;Entrada: ;Salida: ; ;Registros:
COMPARA DOS NMEROS BINARIOS DE 128 BITS SI apunta a NUM1, DI apunta a NUM2 Registro de banderas se afecta segn comparacin: CMP, NUM1, NUM2 Banderas
PROC
push std add add mov repz pop ret
;salva ;compara ms significativo primero ;apunta al final ;dem ;hasta ocho palabras ;compara palabra a palabra ;repone
ENDP
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
11-5
PRCTICA 11
COPIA UN NMERO BINARIO DE 64 BITS SI apunta a NUM1, DI apunta a NUM2 Registro de banderas se afecta segn comparacin: CMP, NUM1, NUM2 Banderas
PROC
CopiaBin push si di cx cld mov cx,4 rep pop ret P386N movsw cx di si
CONVIERTE UN NMERO BINARIO DE 64 BITS ASCII SI apunta a NUM1, DI apunta a cadena ASCIIZ La cadena ASCIIZ se llena de caracteres ASCII segn nmero Ninguno
PROC
;
MBinAsc push ax bx cx dx si di
Limpia la cadena
;salva
;ceros ;conteo de 20 ;pone nulo ;apunta a siguiente byte ;puede usar DIV? ;si, brinca
Lazo eterno
@@20: push si
; Divide por 10
;bandera a cero ;cuatro palabras en nmero ;inicializa residuo ;apunta a final del binario ;salva contador ;trae 16b bits ;divisor de 10 ;divide 11-6
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 11
mov or sub pop loop mov add dec pop cmp jnz pop ret
[si[,eax ebx,eax si,4 cx @@30 [di],dl [byte di],0 di si ebx,0 @@20 di si dx cx bx ax MBinAsc
;regresa 16 bits
;verifica si cero
;apunta a siguiente palabra ;repone contador
;trae dgito de residuo ;lo hace ASCII ;apunta a siguiente carcter ;restaura direccin de binario ;fue nmero cero? ;repite si no ;recupera
ENDP
;
GranDiv: mov xor mov shift: call cmo jb sub add aunno: loop mov add dec pop cmp jnz cmp jnz pop
cx,64 eax,eax ebx,10 Corre96 eax,ebx aunno aunno [word si] shift [di],al [byte di],0 di si [dword si+4],0 GranDiv [dword si],0 GranDiv di si dx cx bx ax Corre96 [dword si] [dword si+4 eax,1 Corre96
;lo hace ASCII ;apunta a siguiente carcter ;restaura direccin de binario ;fue nmero cero? ;repite si no
;recupera
PROC
shl rcl rcl ret
ENDP
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
11-7
PRCTICA 11
CONVIERTE UN NMERO BINARIO DE 128 BITS A ASCII SI apunta a NUM1, DI apunta a cadena ASCIIZ La cadena ASCIIZ se llena de caracteres ASCII segn nmero Ninguno
PROC
;
MBinAscD push ax bx cx dx si di
Limpia la cadena
;salva
Lazo eterno
@@20: push si
; Divide por 10
mov mov mov add @@30: push mov mov div mov or sub pop loop mov dec
bx,0 cx,8 dx,0 si,14 cx ax,[si] cx,10 cx [si],ax bx,ax si,2 cx @@30 [di],di di
;bandera a cero ;ocho palabras en nmero ;inicializa residuo ;apunta a final del binario ;salva contador ;trae 16 bits ;divisor de 10 ;divide ;regresa 16 bits ;verifica si es cero ;apunta a siguiente palabra ;repone contador
ENDP
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
11-8
PRCTICA 11
ENTRA UN NMERO BINARIO DADO EN DECIMAL HASTA DE 18 DGITOS SI = direccin del nmero Dato donde se peda Ninguno
PROC
push call mov mov pop ret
ENDP
;Dec64 ; ;Entrada: ;Salida: ;Registros:
RECIBE DESDE EL TECLADO UN NMERO DECIMAL Y REGRESA 64 BITS Ninguna Binario de 64 bits en DX:BX Ninguno
PROC
push xor mov @@10: mov int sub jl cmp jg call and add adc jmp @@99: pop ret
;
Dec64 ax cx ebx,ebx edx,ebx ah,1 21h al,30h @@99 al,9 @@99 near ptr mten eax,offh. ebx,eax edx,0 @@10 cx ax
;salva registros ;limpia EBX ;y EDX ;mete carcter del teclado ;con DOS ;resta 0 ;salir si no es dgito decimal ;salir si no es dgito decimal ;multiplica por 10 res previa ;Para sumar 32 bits ;suma dgito ;por si es muy grande
;recobra
mten: shl rcl mov mov shl rcl shl rcl add ebx,1 edx,1 [dword doble],ebx [dword doble+4],edx ebx,1 edx,1 ebx,1 edx,1 ebx,[dword doble]
;por 2 ;salva por 2 ;por 4 ;por 8 ;por 10 11-9
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 11
adc ret
Capturar el programa ABIN.ASM, ensamblarlo y crear el programa ejecutable. SUMA, RESTA, MULTIPLICA Y DIVIDE NMEROS BINARIOS
small
Programa ABIN.ASM que hace aritmtica binaria. Ensamblarlo con TASM /zi ABIN ligarlo con: TLINK /v ABIN,,,REM
rc nl
EQU EQU
13 10
DATASEG DB claveFin 0 DB Este programa encuentra la suma, la resta, el producto, saludos DB el cociente entero y,rc,nl DB su residuo de dos nmeros decimales enteros, teclear DB primeroel mayor de ellos.,rc,nl,0 DB El programa requiere por lo menos un 80386,rc,nl,0 RepCPU fuente destino suma resta multi ResSuma ResResta CadSuma CadResta Apr1er Apr2do ResMulti CadMulti dividendo divisor cociente CadCociente ResCociente CadResiduo ResResiduo DQ DQ DQ DQ DQ DB DB DB DB DB DB DB DB DQ DQ DQ DB DB DB DB
;8 bytes para binario 99898999264 ;dem para destino 17581480361 ;suma en BCD 0 ;resta en BCD 0 2 dup (0) ;resultado de la suma 22 dup (0) ;resultado de resta 22 dup (0) La suma es ..:,0 La resta es...:,0 Teclear primero nmero decimal:,0 Teclear segundo nmero decimal:.0 35 dup (0) El producto es.:,0 0 0 0 El cociente es.:,0 22 dup (0) El residuo es.:,0 22 dup (0)
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
11-10
PRCTICA 11
CODESEG EXTRN EXTRN EXTRN Inicia: mov mov mov call call cmp jae mov call mov int @@10: mov call mov call mov call call mov call mov call call
;
ax,@data ds,ax es,ax NuevaLinea cpul ax,386h @@10 di,offset RepCPU SacaCadena ah,4ch 21h
di,offset saludo SacaCadena di,offset Apr1er SacaCadena si,offset fuente EntraBin NuevaLinea di,offset Apr2do SacaCadena si,offset destino EntraBin NuevaLinea
;bienvenida e instrucciones
;pide nmero mayor ;apunta a buffer de nmero mayor ;recibe los dgitos ;salta lnea ;repite para segundo nmero
mov add mov mov adc mov mov mov call mov call mov call call
;
eax,[dword destino] eax,[dword fuente] [dword suma],eax eax,[dword destino+4] eax,[dword fuente+4] [dword suma+4] di,offset ResSuma si,offset Suma MBinASC di,offset CadSuma SacaCadena di,offset ResSuma PoneBlancos SacaCadena
;trae 32 bits ;y los suma ;salva parte baja ;trae 32 bits ;los suma con CF ;salva ;apunta a cadena ASCIIZ ;apunta a suma en binario ;convierte a ASCII ;exhibe letrero de resultado ;de suma ;exhibe dgitos de suma ;elimina algunos ceros
realiza la resta..
call
NuevaLinea
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 11
mov sub mov mov sbb mov mov mov call mov call mov call call
;
eax,[dword fuente] eax,[dword destino] [dword resta],eax eax,[dword fuente+4] eax,[dword destino+4 [dword resta+4] di,offset ResResta si,offset Resta MBinASC di,offset CadResta SacaCadena di,offset RestaBin PoneBlancos SacaCadena
;trae 32 bits ;resta 32 bits ;salva parte baja ;trae 32 bits altos ;resta 32 bits ;salva ;apunta a cadena ASCIIZ ;apunta a resta en binario ;convierte a ASCII ;exhibe letrero de resultado ;de resta ;exhibe dgitos de resta ;omite algunos ceros ;exhibe resta
producto..
call mov mov mov call mov mov call mov call mov call call
;
NuevaLinea si,offset fuente bx,offset multi di,offset destino MultiBin di,offset ResMulti si,offset multi MBinAscD di,offset CadMulti SacaCadena di,offset ResMulti PoneBlancos SacaCadena
;Salta lnea ;apunta a fuente (mayor) ;multi es nuevo destino ;apunta a nmero menor ;multiplica binarios ;apunta a cadena ASCIIZ ;apunta a producto en binario ;convierte a ASCII ;exhibe letrero de resultados ;de multiplicacin ;exhibe dgitos de producto ;omite ceros delanteros ;exhibe producto
divisin
divi: call mov mov mov call mov mov call mov call mov call call call mov mov call mov call NuevaLinea di,offset fuente bx,offset cociente si,offset destino DivideBin di,offset ResCociente si,offset Cociente MbinAsc di,offset CadCociente SacaCadena di,offset ResCociente PoneBlancos SacaCadena NuevaLinea di,offset ResResiduo si,offset fuente MbinAsc di,offset CadResiduo SacaCadena
;salta lnea ;apunta a fuente (dividendo) ;resultado en cociente ;apunta a nmero divisor ;divide binarios ;apunta a cadena ASCIIZ ;apunta a cociente en binario ;convierte a ASCII ;exhibe letrero de resultado ;de divisin ;exhibe dgitos de producto ;omite ceros delanteros ;exhibe cociente
;para poner ASCII del residuo ;apunta a residuo en binario ;convierte a ASCII ;exhibe letrero de resultado ;de divisin (residuo) 11-12
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 11
;exhibe dgitos de residuo ;omite ceros delanteros ;exhibe residuo ;fin de programa con funcin de DOS
PONE HASTA DIEZ ESPACIOS EN CERO DELANTEROS DI = direccin de cadena ASCIIZ con resultados Aumenta a DI el nmero de ceros delanteros Ninguno
PROC
push mov mov mov cld @@10: cmp jne stob loop @@99: pop ret
;repone registros
ENDP
;MultBin ; ;Entrada: ; ;Salida: ;Registros:
MULTIPLICA DOS NMEROS SIN SIGNO DE 64 BITS DI = direccin del primer factor, SI = direccin del segundo factor BX = direccin de resultado de 128 bits rea de salida con el resultado Ninguno
PROC
mov mov mov mult mov mov mov mul add adc mov mul add
MultiBin [dword bx+12] [dword bx +8],0 eax,[dword si] [dword di] [dword bx],eax [dword bx+4].edx eax,[dword si] [dword di+4] [dword bx+4],eax [dword bx+8],edx eax,[dword si+4] [dword di] [dword bx+4],eax
;limpia resultado ;trae 32 bits bajos ;multiplica por bits bajos ;llena parte baja
;trae 32 bits bajos ;multiplica por bits altos ;suma en rea de resultados
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 11
[dword bx+8],edx eax,[dword si+4] [dword di+4] [dword bx+8] [dword bx+12],edx
;suma con CF ;trae 32 bits altos ;por 32 bits bajos ;suma ;suma con acarreo
ENDP
MultiBin
C:\SEM386>abin Este programa encuentra la suma, la resta, el producto, el cociente entero y su residuo de dos nmeros decimales enteros. Teclear primero el mayor de ellos. Teclear primer nmero decimal: 12345679 Teclear segundo nmero decimal: 63 La suma es..: 00012345742 La resta es : 00012345616 El producto es: 000000000000000777777777 El cociente es.: 00000195963 El residuo es: 00000000010 C:\SEM386> C:\SEM386>abin Este programa encuentra la suma, la resta, el producto, el cociente entero y su residuo de dos nmeros decimales enteros. Teclear primero el mayor de ellos. Teclear primer nmero decimal: 99898999 Teclear segundo nmero decimal: 1758148 La suma es..: 00101657147 La resta es : 00098140851 El producto es: 000000000175637225293852 El cociente es.: 00000000056 El residuo es: 00001442711 C:\SEM386> C:\SEM386>abin Este programa encuentra la suma, la resta, el producto, el cociente entero y su residuo de dos nmeros decimales enteros. Teclear primero el mayor de ellos. Teclear primer nmero decimal: 29990217983 Teclear segundo nmero decimal: 1602070822 La suma es..: 31592288805 La resta es : 28388147161 El producto es: 000048046453175983992026 El cociente es.: 00000000018 El residuo es: 01152943187 C:\SEM386>
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
11-14
PRCTICA 11
C:\SEM386>abin Este programa encuentra la suma, la resta, el producto, el cociente entero y su residuo de dos nmeros decimales enteros. Teclear primero el mayor de ellos. Teclear primer nmero decimal: 1125899906842624 Teclear segundo nmero decimal: 281474977056334 La suma es..: 1407374883898958 La resta es : 844424929786290 El producto es: 316912650446256178371720380416 El cociente es.: 00000000003 El residuo es: 281474975673622 C:\SEM386>
3.4.
Este programa se puede depurar con turbo debugger mediante el siguiente comando: C>TD ABIN.EXE Ejecutar paso a paso las rutinas Dec64 y MBinASC y estudiar cmo trabajan
3.5.
Poner los registros en 32 bits y visualizar las variables fuente y destino, en decimal.
4.
TAREAS
4.1.
Introducir al programa el procedimiento Confirma y llamarlo para verificar la opcin de realizar otro clculo.
2n 256 512 1 024 2 048 4 096 8 192 16 384 32 768 65 536 131 072 262 144 524 288 1 048 576 2 097 152 4 194 304 8 388 608 16 777 216 n 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 20 24 28 212 216 220 224 228 232 236 240 244 248 252 256 260 264 = = = = = = = = = = = = = = = = = 160 161 162 163 164 165 166 167 168 169 1610 1611 1612 1613 1614 1615 1616 n 1 0 16 1 256 2 4 096 3 65 536 4 1 048 576 5 16 777 216 6 268 435 456 7 4 294 967 296 8 68 719 476 736 9 1 099 511 627 776 10 17 592 186 044 416 11 281 474 976 710 656 12 4 503 599 627 370 496 13 72 057 594 037 927 936 14 1 152 921 504 606 846 976 15 16n
4.2.
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 11
4.3.
4.4.
En el mdulo MBIN.ASM aadir una rutina para recibir nmeros decimales enteros negativos y otra para recibir enteros decimales de hasta 32 bits.
4.5.
Hacer que el programa ABIN elimine todos los ceros delanteros al desplegar los resultados.
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
11-16