Google Búsqueda personalizada

Regístrate gratis para participar de los foros, o si ya estás registrado haz login.

hola quisiera ayuda con ensamblador

comentario del autor Lun Jun 08, 2009 12:23 pm
   
hola quisiera que por favor me ayudaran a identificar el problema que tiene mi codigo este recibe cuatro numeros de siete digitos desde el teclado , es que se supone que el deberia sumarme siete numeros con acarreo y arrojarme el resultado de ocho digitos, pero me devuelve solo siete digitos y me devuelve mal la suma. me dijeron que seria mejor si los pasaba a bcd y luego los sumara asi que eso hice pero si hay una forma mejor y mas facil se les agradeceria que por favor me la dijeran. este es el codigo . de anta mano mil gracias

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

a_xahia

Reputación



Hacer una pregunta

Boletín de Noticias

Reciba noticias de tecnología, tips de reparación y ofertas exclusivas.



Reglamento / P+F

Foros

Miembros / Expertos