jueves, 28 de febrero de 2019
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 |
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.
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.
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:
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.
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 |
Suscribirse a:
Entradas (Atom)
