jueves, 28 de febrero de 2019

Suma de 2 Números con Librería

Código:





Suma de 2 Numeros

Código:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
.model small
.stack 64
.data
    n1 db 0
    n2 db 0
    suma db 0
    msg1 db "Dame el primer valor",'$'
    msg2 db 10,13,"Dame 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
        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
        mov dl,suma
        int 21h
        mov ah,4ch
        int 21h
        Begin endp
        end

Resta de 2 Numeros

Código:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
.model small
.stack 64
.data
    n1 db 0
    n2 db 0
    suma db 0
    msg1 db "Dame el primer valor",'$'
    msg2 db 10,13,"Dame el segundo valor",'$'
    msg3 db 10,13,"Resta=",'$'
.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
        sub 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
        mov dl,suma
        int 21h
        mov ah,4ch
        int 21h
        Begin endp
        end



Edad Mayor o Menor

Código:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
org 100h
.model small
.stack 64 ; segmento de pila

.data
diez db 10;variable
num1 db 0;variable para edad
mens db 'Ingrese la edad: $'
mens1 db ' Eres Mayor de Edad $'
mens2 db ' Eres Menor de Edad $'

.code

    inicio proc far
        mov ax,@data ;direccionamiento
        mov ds,ax ;los datos de mueve
        ;poner el primer letrero
        mov ah,09
        lea dx,mens
        int 21h
        
        mov ah,01
        int 21h
        sub al,30h ;convertir a valor
        mul diez
        mov num1,al
        
        mov ah,01
        int 21h
        sub al,30h
        add num1,al
        mov al,num1
        
        cmp al,18
        jge mayor
        jmp menor
        
        mayor:
            mov ah,09
            lea dx,mens1
            int 21h
            jmp fin
                   
        menor:
            mov ah,09
            lea dx,mens2
            int 21h
            jmp fin
            
        fin:
            mov ax,4c00h
        
    endp
end





Repetición

Código:



Promedio - Aprobado o Reprobado

Código:





Lectura de Caracteres

Código:




Suma de un solo digito

Código:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
CODE SEGMENT

ASSUME CS:CODE, DS:CODE, SS:CODE, ES:CODE
ORG 100H

principio:
mov ah,0Fh
mov ah,0
int 10h

lea dx,mensaje_a_mostrar
mov ah,9h
int 21h
int 20h

mensaje_a_mostrar db '¡Hola Mundo!$',0

CODE ENDS
end principio





Hola Mundo 2

Código:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
CODE SEGMENT

ASSUME CS:CODE, DS:CODE, SS:CODE, ES:CODE
ORG 100H

principio:
mov ah,0Fh
mov ah,0
int 10h

lea dx,mensaje_a_mostrar
mov ah,9h
int 21h
int 20h

mensaje_a_mostrar db '¡Hola Mundo!$',0

CODE ENDS
end principio




Registro de Banderas

De los 16 bits del registro de banderas, nueve son comunes a toda la familia de procesadores 8086, y sirven para indicar el estado actual de la maquina y el resultado del procesamiento. Muchas instrucciones que piden comparaciones y aritmética cambian el estado de las banderas, algunas cuyas instrucciones pueden realizar pruebas para determinar la acción subsecuente. En resumen, los bits de las banderas comunes son como sigue:

OF (Overflow, desbordamiento). Indica desbordamiento de un bit de orden alto (mas a la izquierda) después de una operación aritmética.

DF (dirección). Designa la dirección hacia la izquierda o hacia la derecha para mover o comparar cadenas de caracteres.

IF (interrupción). Indica que una interrupción externa, como la entrada desde el teclado, sea procesada o ignorada.

TF (trampa). Permite la operación del procesador en modo de un paso. Los programas depuradores, como el DEBUG, activan esta bandera de manera que usted pueda avanzar en la ejecución de una sola instrucción a un tiempo, para examinar el efecto de esa instrucción sobre los registros de memoria.

SF (signo). Contiene el signo resultante de una operación aritmética (0 = positivo y 1 = negativo).

ZF (cero). Indica el resultado de una operación aritmética o de comparación (0 = resultado diferente de cero y 1 = resultado igual a cero).

AF (acarreo auxiliar). Contiene un acarreo externo del bit 3 en un dato de 8 bits para aritmética especializada.

PF (paridad). Indica paridad par o impar de una operación en datos de 8 bits de bajo orden (mas a la derecha).

CF (acarreo). Contiene el acarreo de orden mas alto (mas a la izquierda) después de una operación aritmética; también lleva el contenido del ultimo bit en una operación de corrimiento o de rotación.





Examen Unidad 1

* 1.2 Procesador y sus registros internos

Los registros del procesador se emplean para controlar instrucciones en ejecución, manejar direccionamiento de memoria y proporcionar capacidad aritmética. Los registros son direccionables por medio de un nombre.

Los registros de propósito general AX, BX, CX y DX son únicos en el sentido de que se puede direccionarlos como una palabra o como una parte de un byte. El ultimo byte de la izquierda es la parte "alta", y el ultimo byte de la derecha es la parte "baja". Por ejemplo, el registro AX consta de una parte AH (alta) y una parte AL (baja), Lo mismo es aplicable a los otros tres (BX en BH y BL, CX en CH y CL y DX en DH y DL).

Registro AX. El registro AX, el acumulador principal, es utilizado para operaciones que implican entrada/salida y la mayor parte de la aritmética. Por ejemplo, las instrucciones para multiplicar , dividir y traducir suponen el uso del AX. También, algunas operaciones generan código mas eficiente si se refieren al AX en lugar de a los otros registros.

Registro BX. El BX es conocido como el registro base ya que es el único registro de propósito general que puede ser índice para direccionamiento indexado. También es común emplear el BX para cálculos.

Registro CX. El CX es conocido como el registro contador. Puede contener un valor para controlar el número de veces que un ciclo se repite o un valor para corrimiento de bits, hacia la derecha o hacia la izquierda. El CX también es usado para muchos cálculos.

Registro DX. El DX es conocido como l registro de datos. Alguna operaciones de entrada/salida requieren uso, y las operaciones de multiplicación y división con cifras grandes suponen al DX y al AX trabajando juntos.

* 1.3 Definición de la memoria RAM

La memoria de acceso aleatorio (RAM por sus siglas en inglés) es utilizada por la mayor parte del software para llevar a cabo sus funciones.

Todas las instrucciones que ejecuta una computadora necesitan ser previamente cargadas a esta memoria, para posteriormente ser ejecutadas por el procesador. La razón de esto es que la RAM es la tercera memoria más rápida a la que puede acceder el procesador, siendo los primeros los registros del procesador y las memorias cache, las cuales aunque más rápidas que la memoria RAM, cuentan con una capacidad de almacenamiento muy baja.

La memoria de acceso aleatorio es volátil. Eso significa que los datos se conservan en la RAM mientras la computadora está encendida, pero se pierden cuando la computadora es apagada.


1.4 El concepto de interrupciones definición y un poco de código

Una interrupción es una instrucción que detiene la ejecución de un programa para darle tiempo de procesador a otro proceso más importante. El utilizar una interrupción en ensamblador permite al procesador llevar a cabo funciones especiales predefinidas por ensamblador llamadas servicios, las cuales permiten entre otras cosas el desplegar información. Las interrupciones se separan en dos tipos, que son de DOS (dependientes del sistema operativo) y de BIOS (dependientes del hardware).
Cuando un periférico desea acceder a un recurso, envía un pedido de interrupción al procesador para llamar su atención, los periféricos cuentan con un número de interrupción que se denomina IRQ (Interrupt Request).

Para utilizar una interrupción en ensamblador se utiliza la instrucción int seguida del número de la interrupción, por ejemplo: int 10h.

1.5 Llamadas a servicios del sistema

Los servicios del sistema son funciones predefinidas, que pueden ser utilizadas en los programas. Por medio de las llamadas a estos servicios es posible que exista la comunicación entre un programa en ejecución y el sistema operativo, las llamadas a servicios se encuentran en manuales de ensamblador y dependen de la arquitectura en la que se esté programando.

Cuando una llamada al sistema es invocada, la ejecución del programa que invoca es interrumpida y sus datos son guardados, en el bloque de control de proceso o PCB (Process Control Block) para poder continuar ejecutándose posteriormente.

Las categorías de las llamadas a servicios son las siguientes:

Comunicaciones:
Esta categoría consta de las acciones relacionadas con mensajes, como es crear la conexión, enviar y recibir mensajes, transferir información de estado y eliminar la conexión.

Control de proceso:
Consta de crear, cargar, ejecutar, abortar y terminar un proceso, así como obtener y establecer atributos, liberar memoria o esperar un suceso.

Manipulación de archivos:
Esta categoría consiste de crear, abrir, leer, obtener atributos, establecer atributos, cerrar y eliminar archivos.

Manipulación de información:
Acciones que requieren obtener datos del sistema, como por ejemplo la fecha y hora pertenecen a esta categoría.

Manipulación de periféricos:
Cualquier acción que requiera utilizar un periférico, como solicitar, escribir, leer, obtener y establecer atributos y liberar periférico pertenece a esta categoría.

1.6 Modos de direccionamiento

Los llamados modos de direccionamiento son las diferentes maneras de especificar en informática un operando dentro de una instrucción en lenguaje ensamblador.

Un modo de direccionamiento especifica la forma de calcular la dirección de memoria efectiva de un operando mediante el uso de la información contenida en registros y / o constantes, contenida dentro de una instrucción de la máquina o en otra parte.

* 1.7 proceso de ensamblado ligado

El programa utiliza un editor de texto para crear un archivo de texto ASCII, conocido como archivo de código fuente.

El ensamblador lee el archivo de código fuente y produce un archivo de código objeto, una traducción del programa a lenguaje máquina. De manera opcional, produce un archivo de listado. Si ocurre un error, el programador debe regresar al paso 1 y corregir el programa.

El enlazador lee el archivo de código objeto y verifica si el programa contiene alguna llamada a los procedimientos en una biblioteca de enlace. El enlazador copia cualquier procedimiento requerido de la biblioteca de enlace, lo combina con el archivo de código objeto y produce el archivo ejecutable. De manera opcional, el enlazador puede producir un archivo de mapa.

La herramienta cargador (loader) del sistema operativo lee el archivo ejecutable y lo carga en memoria, y bifurca la CPU hacia la dirección inicial del programa, para que éste empiece a ejecutarse.



* 1.8 desplegado de mensajes en el monitor


Para poder desplegar un mensaje en el monitor es necesario que el texto a desplegar se escriba en la RAM de visualización de video, para después ser enviado al monitor mediante el controlador de video. El controlador de video es en sí un microprocesador de propósito especial, que libera a la CPU principal del trabajo de controlar el hardware de video.

Para hacer esto se pueden utilizar varios de los servicios con los que cuenta el lenguaje ensamblador, los cuales se describen con detalle en el apéndice A.

Para detener la pantalla y permitir al usuario ver lo que se ha desplegado en la misma se utiliza el servicio 00 de la interrupción 16h.

Ejemplo:

mov dx,65 -> Asignar el Valor 65 ASCII al registro DX

mov ah,02h -> Asignar el valor 02h al registro AH, que corresponde al servicio de impresión de un caracter.

int 21h -> Llamada a la interrupción 21h, de la que se ejecutará el servicio 02h.

Ejemplos con la libreria emu8086.inc


Primer Ejemplo .-


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
include emu8086.inc

ORG    100h

PRINT 'Hello World!'

GOTOXY 10, 5

PUTC 65           ; 65 - en código ASCII es 'A'
PUTC 'B'

RET               ; regresa al sistema operativo.
END               ; se detiene el compilador.



Segundo Ejemplo.-



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
; demonstrate get_string and print_string
;----------------------------------------
include 'emu8086.inc'
ORG    100h

LEA    SI, msg1       ; set up pointer (SI) to msg
                      ; to ask for the number
CALL   print_string   ; print message that SI points to

LEA    DI, buffer     ; set up pointer (DI) to input buffer
MOV    DX, bufSize    ; set size of buffer
CALL   get_string     ; get name & put in buffer

LEA    SI, newln      ; point at CR/LF / Hello message 
CALL   print_string   ; print message that SI points to

RET                   ; return to operating system.

; data
msg1   DB "Enter your name: ", 0  
newln  DB 13, 10
       DB "Hello, "
buffer DB 20 DUP (0)  ; input buffer for get_string   
bufSize = $-buffer    ; calculates size of buffer

DEFINE_GET_STRING
DEFINE_PRINT_STRING
END                   ; directive to stop the compiler.


Tercer Ejemplo.-


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
; demonstrate scan_num, print_num, pthis
;----------------------------------------
include 'emu8086.inc'
ORG    100h

LEA    SI, msg1       ; ask for the number
CALL   print_string   ;
CALL   scan_num       ; get number in CX.

MOV    AX, CX         ; copy the number to AX.

; print the following string:
CALL   pthis
DB  13, 10, 'You have entered: ', 0

CALL   print_num      ; print number in AX.

RET                   ; return to operating system.

; data
msg1   DB  'Enter the number: ', 0

; macros to define procs
DEFINE_SCAN_NUM
DEFINE_PRINT_STRING
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS  ; required for print_num.
DEFINE_PTHIS

END                   ; directive to stop the compiler.


miércoles, 27 de febrero de 2019

Libreria emu8086.inc

Código:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
name 'hola mundo'

include 'emu8086.inc'

org 100h
  
.code 
gotoxy 6,10 ; usando la macro de la librería 
print " " ;macro que imprime una cadena
print "hola mundo"
gotoxy 6,12
print " " 
printn "hola mundo 2"
gotoxy 6,14
print " "
print "letrero fin"
gotoxy 6,16
print " "
putc 'A'
gotoxy 9,16

call print_string

DEFINE_PRINT_STRING

call scan_num ;pide un numero

define_scan_num

ret