1
« en: Viernes 30 de Noviembre de 2007, 19:05 »
Hola, la verdad es ke no tengo ninguna experiencia en assembler, salvo lo que estoy haciendo ahora, una calculadora basica, sin embargo el codigo que tengo no sirve y no se porque, megustaria que me digeran porque, de antemano muchas gracias:
.286
.model small
.stack 64h
.data
mens1 db 2 Dup(10,13)
db " P@$TU$OFT & CO CALCULATOR",10,13 ;0A,0D
db " ======== =======",10,13,10,13
db " [1] Ingresa Numeros ",10,13
db " [2] Opercaiones ",10,13
db " [3] Salir ",10,13,10,13
db "elija una opcion ...$"
mens2 db 2 Dup(10,13)
db " Que quieres hacer?",10,13 ;0A,0D
db " ====================",10,13,10,13
db " [1] suma ",10,13
db " [2] resta ",10,13
db " [3] multiplicaion ",10,13,10,13
db " [4] division ",10,13
db "Elija una opcion ...$"
mens3 db 2 dup (10,13)
db "Ingresa Numero -> $"
merror_c db " Error !!!!",10,13
db " Solo debes ingresar Numeros $"
linea db 10,13," $"
NUMERO label byte
nmax db 3
nmet db ?
met db 3 dup (?)
numeros db 15 dup(0)
orden db 15 dup(0)
.code
mov ax,@data
mov ds,ax
de_nuevo:
call CLS
mov dx,offset mens1
mov ah,9
int 21h
ingreso1:
mov ah,7 ;Ingreso de caracter sin ECO
int 21h
cmp al,'1' ;OPCION INGRESAR
jz ingresar;;;;;;;;;;;;;;;;;;;;;;;;;;;
cmp al,'2'
jz operar;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cmp al,'3'
jz salir;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov dl,7
mov ah,2
int 21h
jmp ingreso1
salir: call CLS
mov ah,4ch
int 21h
ingresar: call ingresando
jmp de_nuevo
operar: call operando
jmp de_nuevo
;*****************************************************************************************
CLS PROC NEAR ;*
pusha ;*
MOV AX,0600H ;*
MOV BH,07H ;*
MOV CX,0000H ;*
MOV DX,184FH ;*
INT 10H ;*
MOV DX,0 ;*
MOV AH,02 ;*
MOV BH,00 ;*
INT 10H ;*
popa ;*
RET ;*
CLS ENDP ;*
;*****************************************************************************************
;*****************************************************************************************
comprueba proc near ;*
mov al,byte ptr met[0] ;*
cmp al,'0' ;*
jl error_c ;*
cmp al,'9' ;*
jg error_c ;*
cmp nmet,2 ;*
jz es_2 ;*
ret ;*
es_2: mov al,byte ptr met[1] ;*
cmp al,'0' ;*
jl error_c ;*
cmp al,'9' ;*
jg error_c ;*
ret ;*
error_c: ;*
mov ax,0 ;*
ret ;*
comprueba endp ;*
;*****************************************************************************************
;******************
;imprime prog near;*
; mov ah,9 ;*
; int 21h ;*
; ret ;*
;imprime endp ;*
;******************
;*************************
repite_i: push cx ;*
call CLS ;*
;*************************
;******** aki se meten los numeritos de la calculadorsita ***********************
ingresando proc near
mov cx,2
mov di,0
mov si,0
repite_i: push cx
call CLS
rep_i: lea dx,mens3
mov ah,9
int 21h
lea DX,numero
mov ah,0AH
int 21h
cmp nmet,0
jz repite_i
call comprueba ;Si he metido numeros solamente
cmp ax,0 ;Si hay error
jz repite_e_i ;Salto a error en ingreso
sigue_i1: ;Caso contrario continuo
cmp nmet,1
jz es_1i
mov al,byte ptr met[1]
mov ah,byte ptr met[0] ;tengo en AX, numero metido
and ax,0F0Fh
jmp fin_i
es_1i: mov al,byte ptr met[0]
mov ah,0 ;tengo en AX, numero metido
and ax,0F0Fh
fin_i: SHL AL,4
SHR AX,4
mov numeros[si],al
inc si
pop cx
loop repite_i
ret
repite_e_i:
call CLS
lea DX,merror_c
mov ah,9
int 21h
jmp rep_i
ingresando endp
;******** Aki se operan los numeritos ***************************************
operando proc near
call CLS
mov dx,offset mens2
mov ah,9
int 21h
ingreso_o:
mov ah,7 ;Ingreso de caracter sin ECO
int 21h
cmp al,'1' ;sumita que llaman
jz sumar
cmp al,'2'
jz restar
cmp al,'3'
jz multiplicar
cmp al,'4'
jz dividir
cmp al,'5'
jz salir_o
mov dl,7
mov ah,2
int 21h
jmp ingreso_o
salir_o:
ret
sumar:
call sumita
ret
restar:
call restica
ret
multiplicar:
call multi
ret
dividir:
call divi
ret
operando endp
;******** aki vamos a sumar ********
sumita proc near
; lea dl,al
; lea dh,ah
; mov bl,dl
; mov bh,ah
; mov ax,bl
; mov dx,bh
; add ax,dx
; call imprime
ret
sumita endp
;***** aki vamos a restar ***
restica proc near
; lea dl,al
; lea dh,ah
; mov bl,dl
; mov bh,ah
; mov ax,bl
; mov dx,bh
: sub ax,dx
; call imprime
ret
restica endp
multi proc near
; lea dl,al
; lea dh,ah
; mov bl,dl
; mov bh,ah
; mov ax,bl
; mov dx,bh
; add ax,dx
; call imprime
ret
multi endp
divi proc near
; lea dl,al
; lea dh,ah
; mov bl,dl
; mov bh,ah
; mov ax,bl
; mov dx,bh
; add ax,dx
; call imprime
ret
divi endp
;******** ojala valore el esfuercito profe att pastu y lore ********
los procedimientos de suma resta multiplicacion y division estan como comentarios porque me salian errores al 100, entonces decidi primero probar el menu pero ni asi
al que me colabore muchas gracias...
por cierto el codigo no es totalmente mio hay partes que me baje de internet...