viernes, 23 de marzo de 2018



En el Mundo del lenguaje ensamblador, este tipo de operaciones lógicas son un poco más complicadas que en un lenguaje de alto nivel, debido a su bajo nivel de abstracción; lo cual nos hace requerir de un mayor esfuerzo a nivel de código, pero los programas son mucho más eficientes.

Este sencillo ejemplo se trata de:

 Ingresar dos números cualesquiera a la consola y la operación lógica que se desea realizar con ellos (<, = , >), por ejemplo: 3 > 2  y éste imprimirá como resultado un mensaje diciendo que la operación es verdadera en caso de serla, o falsa en caso de no serla. Esto se logra utilizando la instrucción CMP, que permite comparar dos operandos.

Veamos:


.MODEL Small ;modelo pequeño de compilación 
.Stack 100h  ;Segmento de pila: Pila 256 posiciones
cr equ 13    ;Declaración de Constante
lf equ 10    ;Declaración de constante

.DATA        ;Comienzo del segmento de datos

    titulo DB 10,13,'Operaciones logicas utilizando <,>,=',cr,lf,'$'
    Descripcion DB       'comparaciones con dos numeros',cr,lf,'$'
    line DB       '------------',cr,lf,'$'
             
 msg1 db "Ingresar primer numero ",10,13,"$"
 msg db 10,13,"Ingresar operacion logica a realizar  (<, >, = ) ",10,13,"$"
 msg2 db 10,13,"Ingresar segundo numero ",10,13,"$"
  msg3 db 10,13,"-----------------",10,13,"$"
 msg4 db 10,13,"La Operacion es falsa ",10,13,"$"
 msg5 db 10,13,"La Operacion es verdadera!!",10,13,"$"
 msg6 db 10,13,"La operacion erronea",10,13,"$"


 menor equ   12      ; 0C - 12 equivalente al signo '<'
 igual equ 13        ; 0D  - 13 equivalente al signo '=' 
 mayor equ   14      ; 0E - 14 equivalente al signo '>'

 
 n1 db 0
 n2 db 0
 opr db 0
                       

.CODE
Inicio:
;... nombre y descripcion ...
mov ax,@data
mov ds,ax ; DS ahora apunta al segmento de datos.
mov ah,9 ; Función del DOS para impresión de cadenas.
mov dx,OFFSET titulo ; Apuntador al Nombre
int 21h  ;Llamada a DOS por medio de la interrupción

mov ax,@data
mov ds,ax
mov ah,9
mov dx,OFFSET Descripcion 
int 21h

mov ax,@data
mov ds,ax
mov ah,9
mov dx,OFFSET line
int 21h

Operacion:

    mov ax, @data
 mov ds, ax ;referenciamos el segmento de datos

 ;primer numero
 mov ah, 9
 lea dx, msg1
 int 21h

 mov ah, 01
 int 21h

 sub al, 30h
 mov n1, al

 ;operacion logica
 mov ah, 9
 lea dx, msg
 int 21h

 mov ah, 01
 int 21h

 sub al, 30h
 mov opr, al

 ;segundo numero
 mov ah, 9
 lea dx, msg2
 int 21h

 mov ah, 01
 int 21h

 sub al, 30h
 mov n2, al 

 ;imprimiendo lineas
 mov ax,@data
    mov ds,ax
    mov ah,9
    mov dx,OFFSET msg3
    int 21h

             
;..iniciando opr logica..

   mov al, n1
   cmp al, n2  ;compara n1 con n2

   jg es_mayor  ;si n1 es mayor a n2 salta a la etiq. es_mayor
   je es_igual  ;si n1 es igual a n2 salta a la etiq. es_igual
   jmp es_menor ;si n1 es menor a n2 salta a la etiq. es_menor

es_mayor:   


            mov al, opr
            cmp al, menor
           
            je falso
            cmp al, igual
            je falso
           
            cmp al, mayor
            je verdadero
   jmp error
 
es_menor:
   mov al, opr
   cmp al, mayor
 
   je falso
   cmp al, igual
   je falso
 
   cmp al, menor
            je verdadero
   jmp error   
 
 
es_igual: 

            mov al, opr
   cmp al, mayor
 
   je falso
   cmp al, menor
   je falso
           
            cmp al, igual
            je verdadero
   jmp error
falso:

            mov ah, 9
   lea dx, msg4
   int 21h
   jmp fin
 
verdadero:

            mov ah, 9
   lea dx, msg5
   int 21h
   jmp fin
 
error:
            mov ah, 9
   lea dx, msg6
   int 21h
   jmp fin
 

;..fin opr..


; --------------------- fin del programa --------------------------

fin:

mov ah,4Ch   ; Transferencia del control al DOS. Función
             ;“Retornar a DOS”
int 21h      ;Interrupción que llama a DOS para terminar el
              ;programa
   
   
END Inicio