Búsqueda personalizada
Regístrate gratis para participar de los foros, o si ya estás registrado haz login.
| comentario del autor | Lun Jun 08, 2009 12:23 pm | |
|
stacksg segment para stack 'stack' dw 52 dup (?) stacksg ends datasg segment para 'data' namepar label byte maxlong db 8; maximo tamaño de entrada taman db 0 texto db 8 dup(0) mensa1 db ' Primer numero : $' mensa2 db ' Segundo numero : $' mensa3 db ' SUMA = $' asc1 db 7 dup('0') ;tamaño del numaro a entrar asc2 db 7 dup('0') asc3 db 7 dup('0') haycarry db '0' asc4 db 7 dup('0') bcd1 db 4 dup('0') bcd2 db 4 dup('0') bcd3 db 4 dup('0') ;bcd4 db 4 dup('0') suma db 8 dup('0') linea db 10,13,'$' tfin db " Si desea salir pulse [s] .....",10,13 db " Para repetir suma pulso otro....",10,13,'$' titulo db ' SUMA DE DOS NUMEROS NATURALES',10,13 DB ' =============================',10,13,10,13 db ' 7 digitos con acarreo:$' datasg ends codesg segment para 'code' begin proc far otro: assume cs:codesg,ds:datasg,ss:stacksg,es:datasg push ds sub ax,ax push ax mov ax,datasg mov ds,ax ;Aqui cominenza el codigo call q10clr ;Limpia la pantalla mov dx,0000H call q20curs lea dx,titulo call b10prmp mete1: mov dx,0700H call q20curs;inicializa cursor lea dX,mensa1 call b10prmp ;imprime string usa int09h call d10inpt ;ingresa string usa int0Ah,guarda en texto ;Leer dato y enviar asc1 lea si,texto lea di,asc1 CALL COPIA; copia a asc1 texto ingresado lea bx,asc1 call traslada mete2: mov dx,0900H call q20curs lea dx,mensa2 call b10prmp call d10inpt ;Leer dato y enviar asc2 lea si,texto lea di,asc2 CALL COPIA; copia a asc2 texto ingresado lea bx,asc2 call traslada ;convierte asc1 en bcd1 lea si,asc1+4 ;4 lea di,bcd1+2 ;2 call bioconv ;convierte asc2 en bcd2 lea si,asc2+4; 4 lea di,bcd2+2 ;2 call bioconv ;suma bcd1 con bcd2 ;usando suma por bcd y acarreo ;la suma lo guarda en bcd3 call c10add jc carry jmp convierte carry: mov al,'1' mov haycarry,al ;convierte bcd3 en asc3 cambia de word a byte convierte: mov al,haycarry push ax lea si,bcd3+2 ;2 lea di,asc3+4 ;4 call bioconv1 ;convierte byte a ascii en asc4 suma 30h lea si,asc3+4 ;4 lea di,asc4+4 ;4 call bioconv2 ;imprime mensa3 a pantalla mov dx,0b02H call q20curs lea dx,mensa3 call b10prmp ;coloca '$' para se¤alar final de string asc4 mov ah,'$' mov si,6;6 mov byte ptr[asc4+si],ah; ;byte ptr[XXXXX],XX ->Significa que solo ;se estan trabajando con bytes ;se puede cambiar byte por word, qwart .... ;dependiendo de la variable con la que tratemos pop ax mov haycarry,al lea dx,haycarry mov ah,9 int 21h lea dx,linea mov ah,9 int 21h lea dx,tfin mov ah,9 int 21h mov ah,7 int 21h cmp al,'s' jz salir cmp al,'S' jz salir lea di,asc1 call pone30 lea di,asc2 call pone30 mov al,'0' mov haycarry,al jmp otro salir: mov ah,4ch int 21h ret begin endp ;convierte asc en bcd bioconv proc near mov cl,04H mov dx,03H b20: mov ax,[si] xchg ah,al shl al,cl shl ax,cl mov [di],ah dec si dec si dec di dec dx jnz b20 ret bioconv endp ;suma en bcd c10add proc near xor ah,ah lea si,bcd1+2;2 lea di,bcd2+2;2 lea bx,bcd3+2 mov cx,03H c20: mov al,[si] adc al,[di] daa mov [bx],al dec si dec di dec bx loop c20 ret c10add endp ;limpia la pantalla segun indica dx, cx ;coordenas de donde a donde se limpia q10clr proc near mov ax,0600H mov bh,07H mov cx,0000H mov dx,184eH int 10H ret q10clr endp ;coloca el cursor en la pantalla segun indica dx ; dh:fila dl:columna q20curs proc near mov ah,02H mov bh,00H int 10H ret q20curs endp ;imprite string a pantalla usando la funcion 9 de int21h ;previamente en dx debe tener el offset del mensaje ; mov dx,offset DIRECCION ; lea dx,DIRECCION b10prmp proc near mov ah,09 int 21H ret b10prmp endp ;ingreso de string con la funcion 0ah ;los datos los almacena en namepar d10inpt proc near lea dx,namepar mov ah,0aH int 21H ret d10inpt endp ;convierte de word a byte bioconv1 proc near mov cl,04H mov dx,04H z20: mov ah,[si] shr ax,cl shr al,cl xchg ah,al mov [di],ax dec si dec di dec di dec dx jnz z20 ret bioconv1 endp ;*********************** suma 30h bioconv2 proc near mov dx,04H p20: mov ax,[si] add ah,30H add al,30H mov [di],ax dec si dec si dec di dec di dec dx jnz p20 ret bioconv2 endp ;****************COPIA de SI a DI *********************** ;Copia el contenido de SI a DI (datos en memoria) copia proc near push ax mov al,byte ptr [taman] mov ah,0 mov cx,ax repasc: mov ah,byte ptr ds:[si];guarda un byte de si a ah mov byte ptr ds:[di],ah inc si inc di loop repasc POP AX ret copia endp ;*************************** traslada ************** ;rellena de 30 al lado derecho del ascX ; traslada proc near push cx push ax mov al,byte ptr [taman] mov ah,0 mov cx,ax tras1: push cx mov di,0 mov cx,5 tras2: mov ax,word ptr [bx+di] xchg ah,al mov word ptr [bx+di],ax inc di loop tras2 pop cx loop tras1 pop ax pop cx ret traslada endp pone30 proc near mov cx,6;6 rellena: mov al,30h mov [di],al inc di loop rellena ret pone30 endp codesg ends end begin |
||