Mostrando entradas con la etiqueta Sumas. Mostrar todas las entradas
Mostrando entradas con la etiqueta Sumas. Mostrar todas las entradas

jueves, 28 de febrero de 2019

1. Uso de libreria emu8086 (parte 2)

Programa 1: Al introducir la edad, compara si es mayor o menor de edad.

Código:

;De : Ambrocio Isaias
org 100h

.model small
.stack
.data                        
include "emu8086.inc"            
num1 db 0; variable para la edad
.code
inicio proc far
    
    ;poner el primer letrero
    print " Ingrese su edad: ";macro print
    
    ;lectura del valor
    call scan_num ;llamada al proc de la libreria para pedir un valor
    mov num1,cl
    
    ;lectura segundo valor
    

    xor ax,ax ;limpiar el registro ax
    mov al,num1
    cmp al,18d ;Si lo que se encuentra en al>18 
    JGE mayor ;salta a mayor
    JMP menor ;sino ve a menor  
    
    mayor:
        printn " "
        print "Eres mayor de edad"
        jmp final
    menor:
        printn " "
        print "Eres menor de edad"
               
        jmp final
           
           
    final:  
         print " "
         printn " "
         print "Presiona enter para salir..."
         mov ah,0 ;servicios de lectura de una pulsación de teclado
         int 16h  ;Invoca a servicios de teclado
         mov ah,4ch
         int 21h
         ret
define_print_string
define_print_num
define_print_num_uns ;para recibir numeros decimales
define_scan_num  ;del procedimiento scan_num
endp inicio

end


Resultado:





Programa 2: Nos permitirá mostrar si hemos aprobado o reprobado alguna asignatura en base a una calificación.

Código:


;De : Ambrocio Isaias
.MODEL SMALL
.STACK 64
.DATA  
    include "emu8086.inc"
    
    nota db 0

    
.CODE   
OPERACIONES PROC FAR ;DECLARACION DE PROCEDIMIENTO    
 
    ;MUESTRO EL MENSAJE         
    print " " ;usa macro print para un espacio
    print "Ingrese la calificacion: " ;macro imprime
    
    call scan_num    ;Leo el numero
    mov nota,cl      ;lo guardo en nota
    
    xor ax,ax        ;borro el contenido de ax
    mov al,nota      ;muevo nota a al
    
    CMP AL,70d       ;comparo al con 70
    JGE MAYOR        ;si es mayor o igual pasa a mayor
    JMP MENOR        ;si no a menor
        
   MAYOR:
    printn " "    
    print "Aprobado"
    JMP SALIR 
        
   MENOR:   
    printn " "    
    print "Reprobado"
    JMP SALIR
    
   SALIR:
         print " "
         printn " "
         gotoxy 10,10  ;coloco el cursor en las coordenadas 10x,10y
         print "Presiona enter para salir..." ;imprimo despues este mensaje
         mov ah,0  ;servicio de lectura de pulsacion de tecla
         int 16h   ;invoca servicios de teclado
         mov ah,4ch
         int 21h
         ret
       
OPERACIONES ENDP   

define_print_string
define_print_num
define_print_num_uns
define_scan_num    
    
END   



Resultado:





Programa 3: Suma de dos números, uso de la libreria emu8086.inc.


Código:

;De: Isaias Ambrocio
org 100h

name "suma de dos numeros"
include "emu8086.inc"
org 100h

.data
suma db 2 dup (?) ;manera de declarar un arreglo de 2 lugares 
.code
sumas proc     
    
    print " Introduce el primer numero: " ;macro de la lib
    call scan_num ;llamada a un procedimiento para pedir un num
    mov suma[0],cl ;mueve el valor de cl a la posicion 0 del array   
    printn " " ;macro que imprime un espacio 
    print " Introduce el segundo numero: " ;macro que imprime un letrero
    
    call scan_num ;llamada a un procedimiento para pedir num
    mov suma[1],cl ;;mueve el valor de cl a la posicion 1 del array   
    xor ax,ax ;xor nemonico que limpia registros
    
    add al,suma[0] ;valor de suma pos 0 []
    add al,suma[1] ;valor de suma pos 1
    
    printn " " ;macro de la libreria pone un espacio y retorno 
    print " La suma es: " ;macro que imprime un letrero 
   
    call print_num ;llamada a un procedimiento para imprimir un num del reg ax
sumas endp
exit:
    print " "
    printn " "
    print "Presiona enter para salir..."
    mov ah,0  ;servicio de pulsación de teclado
    int 16h   ;invoca a servicios de taclado
    ret
define_print_string ;no se uso
define_print_num ;es del print_num
define_print_num_uns ;conversion a decimal del scan_num
define_scan_num ;procedimiento del scan_num(macro)
end

ret


Resultado:


lunes, 25 de febrero de 2019

1. Programa que realiza: suma, resta, división y multiplicación



Programa: Suma, resta, división y multiplicación

Código:

;por: alex gutierrez 
; suma, resta, multiplicacion y division sin tomar en cuenta el acarreo
; el 13,10 es un salto de linea

.model small
.stack 100
.data
msj1 db 'Numero 1: ','$'
msj2 db 13,10,'Numero 2: ','$'
msj3 db 13,10,'Suma: ','$'
msj4 db 13,10,'Resta: ','$'
msj5 db 13,10,'Multiplicacion: ','$'
msj6 db 13,10,'Division: ','$'
linea db 13,10,'$'
var1 db 0
var2 db 0
.code
.startup

call limpia
mov ah,09h
lea dx, msj1 ;desplegar numero 1:
int 21h

call leer ;lee primer numero
sub al,30h ;restar 30h para obtener el numero
mov var1,al ;lo guardo en var1
mov ah,09h
lea dx, msj2 ;desplegar numero 2:
int 21h

call leer ;lee segundo numero
sub al,30h ;restar 30h para obtener segundo valor
mov var2,al ;guardar en var2
mov bl,var2 ;mover a bl

;******************* SUMA
add bl,var1 ; realizo la suma de var2(bl) y var1 y el resultado queda en bl
mov ah,09h
lea dx,msj3 ;imprimir suma
int 21h
mov dl,bl ;pongo en dl el numero a imprimir var2(bl)
add dl,30h ; agrego 30h para obtener el caracter    
mov ah,02h ;imprime un caracter
int 21h

;******************RESTA
mov bl,var1
sub bl,var2
mov ah,09h
lea dx,msj4 ;desplegar resta:
int 21h
mov dl,bl ;mover resta a dl para imprimir
add dl,30h ;sumar 30 para obtener caracter
mov ah,02h ;imprimir un caracter
int 21h

;******************MULTIPLICACION
mov ah,09h
lea dx,msj5 ;desplegar mult
int 21h

mov al,var1 
mov bl,var2
mul bl ;mult al=al*bl
mov dl,al ;mover al a dl para imprimir
add dl,30h ;sumar 30 para obtener caracter
mov ah,02h ;imprimir caracter
int 21h

;*****************DIVISION
mov ah,09h
lea dx,msj6 ;desplegar div
int 21h
xor ax,ax ;limpiamos el registro ax. 
mov al,var2
mov bl,al
mov al,var1
div bl ; divide AX/BX el resultado lo almacena en AX, el residuo queda en DX
mov bl,al
mov dl,bl
add dl,30h
mov ah,02h
int 21h
.exit

; ****************PROCEDIMIENTOS
salto proc near
mov ah,09h
lea dx,linea
int 21h
mov dl,00h
ret
salto endp

leer proc near
mov ah,01h;leer caracter desde el teclado
int 21h;lee primer caracter
ret
leer endp

limpia proc near
mov ah,00h
mov al,03h
int 10h
ret
limpia endp
end




miércoles, 20 de febrero de 2019

1. Uso de libreria emu8086 (parte 1)



Programas con Uso de librerías en Ensamblador 


Para facilitar la programación, hay algunas funciones comunes que pueden incluirse en su programa. Para hacer que su programa utilice funciones definidas en otro archivo, debe usar la directiva INCLUDE seguida de un nombre de archivo. El compilador busca automáticamente el archivo en la misma carpeta donde se encuentra el archivo de origen, y si no puede encontrar el archivo allí, busca en la carpeta Inc. 

Para usar cualquiera de las funciones en emu8086.inc, debe tener la siguiente línea al comienzo de su archivo fuente: 

 include 'emu8086.inc' 

Referencias externas al módulo: 


Son imprescindibles si se hace un programa en alto nivel con procedimientos en assembler. Hay tres: PUBLIC, EXTRN e INCLUDE. 

PUBLIC nombre[, nombre...]: Estos nombres simbólicos se escriben en el archivo objeto. Durante una sesión con el linker, los símbolos en diferentes módulos pero con los mismos nombres tendrán la misma dirección. 

EXTRN nombre:tipo [,nombre:tipo...]: Define una variable externa con el nombre y tipo (NEAR, FAR, BYTE, WORD, DWORD o ABS (número constante especificado con la directiva EQU o =)) especificado. El tipo debe ser el mismo que el del ítem indicado con la directiva PUBLIC en otro módulo. 
INCLUDE nombre_de_archivo: Ensambla las sentencias indicadas en dicho archivo. 

emu8086.inc define las siguientes macros : 

PRINT string - macro con 1 parámetro, imprime una cadena. 
PRINTN string - macro con 1 parámetro, imprime una cadena. Lo mismo que PRINT pero agrega automáticamente "retorno de carro" al final de la cadena. 
PUTC char - macro con 1 parámetro, imprime un carácter ASCII en la posición actual del cursor. 
GOTOXY col, fila - macro con 2 parámetros, establece la posición del cursor. 
CURSOROFF - apaga el cursor de texto. 
CURSORON - enciende el cursor de texto.


Ensamblador: Suma de dos números


Este código fue tomado del siguiente vídeo:


Código:


;include para añadir librerias http://jbwyatt.com/253/emu/asm_tutorial_05.html
;gmo
name 'Suma de dos numeros'
include 'emu8086.inc' ;nombre del programa 
org 100h              ;agregamos libreria emu8086.inc

.data     ;se abre el bloque de datos
suma db 2 dup (?) ;arreglo suma de 2 espacios(byte)

.code    ;directiva indica la continuacion del prog
Sumas proc     ;proceso Sumas
    printn " "
    print "Introduce el primer numero ==>"
    call scan_num  ;recibe los valores
    mov suma[0], cl;recibe de scan_num cl y se mandan a las posiciones del arreglo
    printn " "
    print "Introduce el segundo numero ==>"
    call scan_num
    mov suma[1], cl
    printn " "
    xor ax, ax  ;limpia el registro ax
    add al, suma[0]   ;manda la suma al registro al para poder imprimir con print_num
    add al, suma[1]
    printn " "
    print "La suma es: "
    call print_num
Sumas endp

exit:       ;etiqueta salir
    print ""
    printn ""
    print "Presiona enter para salir...  "
    mov ah, 0  ;termina el programa
    int 16h
    ret
    
define_print_string ;comando definido emu8086.inc  
define_print_num
define_print_num_uns
define_scan_num     
end


Resultado:


La suma de los valores 12 y 7 decimal da 19. Como se puede ver se guarda en el registro "ax" como 13 equivalente en hexadecimal.



Referencia:


domingo, 10 de febrero de 2019

1. Programa de suma de dos números(vídeo)


Servicios a utilizar:
Servicio 01 de la interrupcion 21h para leer caracteres guardados en el registro AL

Ejemplo de lectura:
mov ah,01 ;-Con esto se invoca al servicio 01: el cual guarda el contenido leido por teclado en AX
int 21h; invoca la interrupcion para salida por pantalla

*Notas:
-solo es posible leer un solo carecter (no cadenas) por este metodo.
-Los elementos leidos son cargados bajo su interpretación en codigo ascii en formato hexadecimal o decimal (dependiendo de la maquina), de esta manera para cualquier calculo numerico se debera hacer uso de una operacion aritmetica (la resta de 48 o 30h al valor leido por teclado para obtener su valor numerico real).
        Esto ultimo seria mediante los comandos:
        sub AL,48     o   sub AL,30h
        De igual manera para la Impresion sera necesario hacer la operacion contrarea:
        add AL,48    o    sub AL,30h
-Para mandar a impresion se usan las siguientes lineas:
        mov ah,02 ;  -Se invoca al servicio 02: que permite la manipulacion del display (pantalla)
        mov DL,AL ; -Se pasa la información de AL a DL para impresion

        int 21h;        -Uso la interrumpción 21h para la salida por pantalla


Código:


org 100h

.model small
.stack 64
.data
 n1 db 0
 n2 db 0
 suma db 0
 msg1 db "Ingrese el primer valor:", '$'
 msg2 db 10,13, "Ingrese el segundo valor:", '$'
 msg3 db 10,13, "Suma=", '$'
 .code

 begin proc far
    ;direccionamos al segmentos de datos
    mov ax,@data
    mov ds,ax
    
    ;solicitamos el primer digito
    mov ah,09
    lea dx,msg1
    int 21h  
    ;se lee el primer valor
    mov ah,01
    int 21h
    sub al,30h; convierte el caracter en numero
    mov n1,al        
    
    ;solicitamos el segundo digito
    mov ah,09
    lea dx,msg2
    int 21h
    mov ah,01
    int 21h
    sub al,30h;convierte el caracter en numero
    mov n2,al
    
    ;operacion
    mov al,n1 ;lo que esta en n1 lo asigna a al
    add al,n2 
    add al,30h;convierte a caracter
    mov suma,al
    mov ah,09
    lea dx,msg3
    int 21h
    
    ;se imprime el caracter con el servicio 02 de la int 21h
    mov ah,02  ;valor que se usa para poner algo en pantalla
    mov dl,suma 
    int 21h
    mov ah,4ch
    begin endp  ;final del procedimiento 

 end     ;final del bloque de codigo
    
    
ret



Resultado:





martes, 5 de febrero de 2019

1. Programas de operaciones en ensamblador suma, resta

Programa 1: 

Donde se realizara una serie de operaciones matemáticas simples en formatos hexadecimales y decimales.

Código:

org 100h
;suma de un solo digito

mov ax, 8h ;asignar valor a los registros
mov bx, 4h ;
add ax,bx ;suma de dos registros
mov bx, 5 ;se da bx un valor de 5
sub ax,bx ;resta
mov bx, 3 ;se da bx a 3
inc bx

mov ax, 6 ;se da valor en ax
hlt ; terminar proceso



Para comprender  mejor este programa, a continuación paso a paso se detallara como funciona.
Comenzamos con el programa donde se sumara un solo dígito. En la cuarta linea vemos "ax", al registro que se le asignara 8 en hexadecimal.





En el registro "bx" se le asigna el valor 4 hexadecimal.


Luego, se suma "ax" y "bx", guardando el resultado en ax (add = suma).


El resultado sera dado en hexadecimal:
8 + 4 = 12 en hexadecimal es C


En la siguiente instrucción ahora a "bx" se le asigna 5 (hexadecimal).


Para después ver que se realizara la operación de resta del registro "ax" y "bx". Siendo el resultado ahora 7 en el registro ax. 


Se cambia el valor anterior de "bx" ahora por un 3.


Con un inc se realiza un incremento en uno al registro "bx", siendo ahora 4.


Para terminar la ultima instrucción indica cambio de valor de "ax" en un 6.







OTRO PROGRAMA
Programa 2:

En este programa solo cambia de valor hexadecimal a decimal.

Código:

ORG 100h


mov ax, 80  ; AX =80 d 
mov bx, 450 ; BX=450 d
inc bx     ;BX++ bx 451
add ax, 80  ; AX=AX+80
mov cx, 200 ;CX=200
sub cx, ax  ; CX=CX-ax 200-160=40  

ret         ;retorno de subrutina


 ;ax=80
 ;valor de bx en hex 450 equivale 1C2
 ;inc bx 451
 ;add ax, 80 ax=160
 ;cx=200
 ;sub cx,
 ;sub cx, ax=120



Resultado:










Programa 3: versión en hexadecimal

org 100h  
;los valores proximos son valores decimales
;estos se convierten a hexadecimal en memoria

mov ax,80h      ;ax=80h
mov bx,450h     ;bx=450h
inc bx         ;bx++
add ax,80h      ;ax=80h
mov cx,200h     ;cx=200h
sub cx,ax      ;cx=cx-ax

ret          ;Retorno de subrutina 



Resultado:










3. Colores Modificado 9

Modificación del programa # 9 " Colores " Por mi compañero Ambrocio isaias Laureano CR EQU 13 ;Declaro retorno de carro LF...