miércoles, 20 de febrero de 2019

1. División en lenguaje ensamblador

Uso de div

Programa: Realiza una división.

Uso de div:

La operación div en este programa divide "ax" entre "bx", guardando el resultado en el registro "ax".

Programa 1.

Código:

org 100h
mov ax, 9
mov bx, 9
div bx ; tomara ax y bx se dividira

ret


Resultado:

Como se muestra 9 decimal se guardan en el registro "ax" y "bx" en formato hexadecimal.



El resultado de la division de 9/9 es 1, se puede apreciar en el registro "ax".



Programa 2.

Código:

org 100h

mov ax, 100
mov bx, 5
div bx ; tomara ax y bx se dividira

ret





Resultado:


Primero el valor 100 y 5 se guardaran en los registros "ax" y "bx", respectivamente en formato hexadeximal.



Al realizar la división, nos da como resultado 14 hexadecimal (en el registro "ax"), en decimal su equivalente es 20.







Referencia:

1. Programa que compara si es mayor de edad


Condicionales

Programa 1: 

Compara al ingresar la edad si es mayor o menor de edad.

Código:

org 100h

.model small

.stack ; segmento de pila


.data 

diez db 10; variable para poder imprimir dos caracteres(se multiplica por el 1 valor) 
num1 db 0 ; variable para edad
mens db 'Ingrese la edad: $'
mens1 db 10, 13, 'Eres mayor de Edad $'
mens2 db 10, 13, 'Eres menor de Edad $'

.code
    inicio proc Far
        mov ax, @data ; direccionamiento del seg
        mov ds, ax ;los datos se mueven al registro de ax
       
        ; poner el primer letrero  


        mov ah, 09 ;impresion
        lea dx, mens
        int 21h

        
        mov ah, 01
        int 21h  
        sub al, 30h ;convierte el valor 
        mul diez ;se multiplica el numero ingresado para las decenas
        mov num1, al

        ;pedir segundo valor
        
        mov ah, 01
        int 21h
        sub al, 30h ;resta lo que se guardo en al con 30h
        add num1, al ; se suma a las decenas obtenidas 
        mov al, num1 ;
        
        cmp al, 18 ; compara si en el registro al es 18    

        ;en caso de que sea mayor jge mayor o igual
        jge mayor ;en caso de que sea mayor va a la etiqueta
        jmp menor ;va a la etiqueta menor, si es menor el num 18
        
        mayor:
            mov ah, 09
            lea dx, mens1
            int 21h      
            jmp fin 

        menor:  
            mov ah, 09
            lea dx, mens2
            int 21h      
            jmp fin  ;va a la etiqueta fin
          
        fin: ; fin de programa
            mov ax, 4c00h   
      
 inicio endp

    end inicio

ret


Resultado:




martes, 19 de febrero de 2019

1. Uso de multiplicación con ensamblador

Multiplicación en ensamblador 8086.


Uso de mul:

La operación mul en este programa multiplicara "ax" por "bx", guardando el resultado en "ax". Como se vera a continuación.

Programa que usa mul.



Código:

org 100h

mov ax, 8 ;se asigna a ax 8 decimal
mov bx, 9 ; se asigna a bx 9 decimal

mul bx ;multiplica ax por bx 
ret


 Resultado:


Se asigna 8 a "ax" y 9 a "bx" a los registros valores decimales.





Se multiplican los valores asignados en "ax" y "bx" con mul, obteniendo 48 hexadecimal en el registro "ax", equivalente a 72 decimal.



Versión 2:

Código:


prog

org 100h

mov ax, 9 ;se asigna ax=9
mov bx, 9 ;bx=9

mul bx ;ax por bx
ret


;-----------
;Versión 3:
org 100h
 
         
mov ax, 80;ax=80
mov bx, 10;bx=10

mul bx
ret

Resultado v3:

Como se muestra se asigna en 80 decimal a "ax" en hexadecimal equivalente a 50 en hexadecimal.



Y en "bx" se guarda en el registro 10 decimal equivalente a A hexadecimal.


Como podemos ver el resultado de 80 x 10 = 800,equivalente a 320 a hexadecimal. 



Versión 4:

Código:


org 100h
 
         
mov ax, 80
mov bx, 1000

mul bx
ret



Al momento de realizar la operación 80 x 1000 o más, el resultado supera el rango definido para guardar valores.

Referencia:
https://linterfazgmo.blogspot.com/2019/02/tabla-de-registros-y-condicion-if.html




1. Tabla de registros y condición if ()

Tabla Registros del Propósito General (procesador)



Prefijo que se debe de agregar al registro para poder tener una mayor capacidad de almacenamiento de valores.

Los registros ax, en este caso que usamos con un espacio limitado de 16 bits, al momento de guardar valores mas grandes supera el rango de emu8086 son capaces de soportar.
Si multiplicamos cifras mas grandes como 100 x 50000 el resultado supera el rango.
Por lo tanto es necesario ampliar el registro, lo hacemos añadiendo un nemonico diferente, sin embargo hay que tener en cuenta la compatibilidad de la arquitectura  para su uso.


Referencia:

https://es.slideshare.net/erwinmeza/ia32-introduccion



Programación en lenguaje ensamblador (x86-64)




Condiciones de if en Lenguaje Ensamblador





El presente libro presenta los prefijos comunes 
que se utilizan para que el espacio de almacenamiento de un registro 
crezca todo en función a la arquitectura de su procesador.

Referencia:


https://www.exabyteinformatica.com/uoc/Informatica/Estructura_de_computadores/Estructura_de_computadores_(Modulo_6).pdf

martes, 12 de febrero de 2019

1. Programa que al ingresar una calificación, muestra si has aprobado o reprobado


Programa: Calificación 

Al ingresar una calificación, muestra si has aprobado o reprobado

Al ingresar un calificación al sistema, se mostrara un mensaje aprobado o reprobado, al introducir uno y dos dígitos.

Código:


org 100h

.model small

.stack 64

.data ;seccion de variables
    msg1 db 'Dame una calificacion(seguida de un enter): $'
    aprobado db 13,10, 'APROBADO.$'
    reprobado db 13,10, 'REPROBADO$'
    VAR1 dw ?, '$'
    VAR2 dw ?, '$' 
    VAR3 dw ?, '$'
    
.code ;inicia el segmento de codigo 

Resultado PROC FAR ;procedimiento
    mov ax,@DATA ; como inicio
    mov ds, ax
;----------------desplegar primer mensaje
    mov ah, 09
    lea dx, msg1
    int 21h 
;----------------pedir un caracter
    mov ah, 01
    int 21h
    mov VAR1,ax
;----------------pedir segundo caracter
    mov ah, 01
    int 21h
    mov VAR2,ax
;----------------tercer caracter
    mov ah, 01
    int 21h
    mov VAR3,ax
;-----momento de evaluar la calificacion
    CMP al, 13  ; para comparar  
    JE CONTINUE ;salta si es iguala 13
    JMP MAYOR   ;salta 
;----INICIA FUNCION

CONTINUE:  ;
    mov ax, VAR1 ;valor tomado para comparar
    CMP AL, 037h ;7 es 37 en ASCII
    JGE MAYOR   ; salta si es mayor o igual a 7 va a 'mayor'
    JMP MENOR
    
MAYOR:
    mov ah, 09
    lea dx,aprobado
    int 21h
    JMP SALIR        
    
MENOR:
    mov ah, 09
    lea dx,reprobado
    int 21h
    JMP SALIR  
    
SALIR:
    mov ax, 4c00h ; o 4ch
    int 21h    

RESULTADO endp

end RESULTADO 

    ret


En el código, estamos guardando tres valores en nuestras variables. Al ingresar la calificación (80), guardamos el 8 en código ascii en una variable (var1), el 0 en otra variable(tambien en ascii, var2) y finalmente el enter en la ultima variable(var3), en cambio si ingresamos solo un dígito nos funciona el programa, ya que se compara lo que se encuentra en var1.


Ejecución 1:




Ejecución 2:





domingo, 10 de febrero de 2019

1. Programa que resta dos números 2.(vídeo)

Programa que resta dos números 


Código:

org 100h
.model small
.stack 64  
        ;declaracion de datos
.data
    n1 db 0
    n2 db 0
    resta db 0
    msg1 db "Dame el primer valor:",'$'
    msg2 db 10,13,"Dame el segundo valor:",'$'
    msg3 db 10,13,"Resta=",'$'
        ;declaracion de codigo   
.code
    begin proc far ;Defino un procedimiento
        ;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 digio
        mov ah,09
        lea dx,msg2
        int 21h
        ;se lee el segundo valor
        mov ah,01
        int 21h
        sub al,30h   ;convierte el caracter en numero
        mov n2,al 
        
        ;operacion
        mov al,n1
        sub al,n2  ;resta
        add al,30h;convierto a caracter
        mov resta,al 
        mov ah,09
        lea dx,msg3
        int 21h
        
        ; se imprime el caracter con el servicio 02 de la interrupcion 21h
        mov ah,02
        mov dl,resta
        int 21h
        mov ah,4ch  ;Devuelve el control al equipo
        int 21h
        Begin endp ;especifico el termino del procedimiento
        end      

ret



Resultado:


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:





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...