• Viernes 15 de Noviembre de 2024, 06:54

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - @lex

Páginas: [1]
1
ASM (Ensamblador) / Calculadora En Asm
« 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...

Páginas: [1]