miércoles, 30 de octubre de 2013

lunes, 28 de octubre de 2013

Instrucciones de Desplazamiento, Rotación y Adeudos.


Bits de un operando un determinado número de posiciones a la izquierda o a la derecha. La estructura de los operandos manejados por estas instrucciones y su significado es idéntico para las cuatro instrucciones. Todas ellas trabajan sobre un operando fuente y un operando destino.
El Operando Destino contiene el dato que va a ser objeto del desplazamiento y debe ser del tipo, registro o memoria.
El Operando Fuente determina la cantidad de posiciones que va a ser desplazado el operando destino. El operando fuente sólo puede ser un dato inmediato de 8 bits (I8) o bien el registro CL.
SHL (Shift Left = desplazamiento a la izquierda)
Se desplazan a la izquierda los bits del operando destino tantas posiciones como indique el operando fuente. El desplazamiento de una posición se realiza de la siguiente forma: el bit de mayor peso del operando se desplaza al bit CF del registro de estado, el resto de los bits se desplazan una posición hacia la izquierda, y la posición de menor peso se rellena con un 0. Este proceso se representa en la figura siguiente.



SHR (Shift Right = desplazamiento a la derecha)
La instrucción shr funciona de la misma forma que shl, pero desplazando los bits a la derecha en lugar de a la izquierda, tal y como se muestra en la figura siguiente.

SAR (Shift Arithmetic Right = desplazamiento aritmético a la derecha)
Esta instrucción desplaza los bits del operando destino a la derecha tantos bits como indique el operando fuente. Esta forma de funcionamiento es similar a la de la instrucción shr; sin embargo, ambas instrucciones se diferencian en que sar, en vez introducir ceros por la izquierda del operando, replica el bit de mayor peso (bit de signo) en cada desplazamiento. esquemáticamente, la instrucción sar trabaja de la siguiente forma:



El desplazamiento a la derecha realizado por la instrucción sar recibe el nombre de aritmético porque sirve para dividir un operando entre una potencia entera de 2.
El desplazamiento aritmético a la derecha de un operando (considerado con signo) n posiciones equivale a la división entera del operando entre 2n.

SAL (Shift Arithmetic Left = desplazamiento aritmético a la izquierda)
El objetivo de un desplazamiento aritmético a la izquierda es multiplicar un operando, interpretado con signo, por una potencia de 2.

Para llevar a cabo este tipo de desplazamiento, hay que desplazar los bits del operando hacia la izquierda introduciendo ceros por su derecha. En realidad, este tipo de desplazamiento es idéntico al llevado a cabo por la instrucción shl; por tanto, sal y shl son, de hecho, la misma instrucción y se codifican con el mismo codigocodigo

Instrucciones de Rotación
digo máRCL DESTINO,CONTADOR ;Rota destino a través de carry a la izquierda contador veces
RCR DESTINO,CONTADOR ;Rota destino a través de carry a la derecha contador veces
ROL DESTINO,CONTADOR ;Rota destino a la izquierda contador veces
ROR DESTINO,CONTADOR ;Rota destino a la derecha contador veces
SAL DESTINO,CONTADOR ;Desplaza destino a la izquierda contador veces y rellena con ceros
SAR DESTINO,CONTADOR ;Desplaza destino a la derecha contador veces y rellena con bit SF
SHR DESTINO,CONTADOR ;Desplaza destino a la derecha contador veces y rellena con ceros
NOTA: El DESTINO va a ser la dirección y el CONTADOR es el número de veces que se repite la instrucción.


miércoles, 23 de octubre de 2013

Ejercicio Reverse

Tecleamos el código:




Ensamblado y enlazado:





 Ejecución con debug:



ejecución sin el debug:


martes, 22 de octubre de 2013

Ejercicio Modificar programa instrucción JMP

modificar el programa para que se ejecute  10 veces 

Programa Original:



Programa modificado:



Ensamblado y enlazado:


Ejecución con debug:





Instrucción LOOP

Tecleamos el código y lo guardamos como .asm


Análisis del código:
1. Se define con la instrucción PAGE el numero máximo de lineas para una página.
2. Con TITLE definimos el titulo que le daremos
3. Definimos el modelo de memoria, en este caso SMALL
4.Indicamos inicia el código
5.Nuestro codigo que vamos a generar iniciara con un desplazamiento de direccion 100
6.Entramos a iniciar nuestro proceso  PROC NEAR
7.Inicializamos AX, Transfiere 01 a AX
8.Transfiere a BX 01
9.Transfiere a DX 01
10. Transfiere a CX 01;Iniciar.
11.Una etiqueta la cual representa el numero de iteraciones.
12. Sumar 01 a AX
13.Sumas AX a BX
14. SHL Multiplicar por dos a DX
15. Decrementar CX (Iterar si este es diferente de cero)
16.Transferir 4c00h a AX
17.Interrupción 21, salida a dos
18. fin del begin
19. Fin del programa

Ensamblado y enlazado:


Con el comando TYPE se puede ver la estructura del programa


Y por ultimo ejecutamos con el debug




Instrucción JMP

Tecleamos el código:


análisis por linea:
1. Se define con la instrucción PAGE el numero máximo de lineas para una página.
2. Con TITLE definimos el titulo que le daremos
3. Definimos el modelo de memoria, en este caso SMALL
4. Indicamos inicia el código
5.Nuestro código que vamos a generar iniciara con un desplazamiento de dirección 100
6.Entramos a iniciar nuestro Main y proceso PROC NEAR
7. Inicializamos AX, Transfiere 01 a AX
8.Transfiere a BX 01
9. Transfiere a CX 01;
10. Etiqueta A20:
11. Sumar a AX: 01
12 Sumar a BX lo contenido en AX
13.Multiplicar por dos a CX
14.Saltar a la etiqueta A20.
15. Fin del main
16. Fin del programa

Ensamblado y enlazado

Ejecución





viernes, 18 de octubre de 2013

jueves, 17 de octubre de 2013

Primer programa en ensamblador. "Hola mundo"

Primero tecleamos el código en cualquier editor de texto


Después guardamos nuestro código con un nombre corto, para que pueda ser ejecutado mas delante, y con una extensión .asm


Antes de ejecutar el código, debemos copiar la carpeta de masm (compilador se debe descargar antes) en C:/......
Con la carpeta en C:/ , abrimos el cmd ponemos las instrucciones:

*cd/
*cd masm
*masm hola.asm
*damos enter a las tres siguientes que nos aparecen
*nos fijamos no tener errores
*escribimos link hola para ligar nuestro programa
*volvemos a dar enter a los tres siguientes otra vez
ya tenemos en ejecutable
*hola.exe
y aparece nuestro hola mundo




martes, 15 de octubre de 2013

Unidad II. Preguntas capitulo 4

1.     Cuáles son las diferencias entre un compilador y un ensamblador?
Un compilador
es un programa que, a su vez, traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente. Usualmente el segundo lenguaje es código máquina, pero también puede ser simplemente texto. Este proceso de traducción se conoce como compilación.

Ensamblaje
El término ensamblador (del inglés assembler) se refiere a un tipo de programa informático que se encarga de traducir un fichero fuente escrito en un lenguaje ensamblador, a un fichero objeto que contiene código máquina, ejecutable directamente por la máquina para la que se ha generado. El propósito para el que se crearon este tipo de aplicaciones es la de facilitar la escritura de programas, ya que escribir directamente en código binario, que es el único código entendible por la computadora, es en la práctica imposible. La evolución de los lenguajes de programación a partir del lenguaje ensamblador originó también la evolución de este programa ensamblador hacia lo que se conoce como programa compilador.

  2.- Que es una palabra reservada en un lenguaje ensamblador?
  Ciertas palabras en lenguaje ensamblador están reservadas para propósitos propios, y son usadas solo bajo condiciones especiales. Por categorías, las palabras reservadas incluyen
Instrucciones, cómo MOV y ADD, que son operaciones que la computadora puede ejecutar;
Directivas, como END o SEGMENT, que se emplean para proporcionar comandos al ensamblador;
Operadores, como FAR y SIZE, que se utilizan  en expresiones; y
Símbolos preferidos, como @Data y @Mod que regresan información a su programa.
El uso de una palabra reservada para un propósito equivocado que el ensamblador genere un mensaje de error. El apéndice C muestra una lista de palabras reservadas del lenguaje ensamblador.

3.- Cuales son los dos tipos de identificadores?
Un identificador es un nombre que se aplica a elementos en el programa. Los dos tipos de identificadores son: nombre, que se refiere a la dirección de un elemento de dato, y etiqueta, que se refiere a la dirección de una instrucción. Las mismas reglas se aplican tanto para los nombres como para las etiquetas.

4.- Determine cuáles de los nombres siguientes son válidos?
a) PC_AT
b) $50
c)@$_Z
d) 34B7 No es válido por que inicia con número
e) AX solo es válido si se prefiere al registro AX



5.- Cuales son las diferencias entre una directiva y una instrucción?
Directivas: son órdenes para el ensamblador y no tienen
Traducción a código máquina.
INTERRUPCIONES
­ Se  producen  mediante  la  activación  de  los  terminales #IPL2­0  que 
Codifican  el  nivel de petición (desde  nivel 0, ausencia  de  petición, 
Hasta nivel 7, máxima prioridad o NMI).
­ Una interrupción se atiende si su nivel de petición supera al fijado en 
La máscara de interrupción (bits I2­0 del registro SR), excepto para 
El nivel 7, que siempre se atenderá
6.- Que comandos hacen que el ensamblador:
(a)   imprima un encabezado en la parte superior de una página en el listado de un programa
TITLE
(b)   salte a una nueva pagina  


7.- Cual es el objetivo de cada uno de los tres segmentos descritos en este capítulo?


   Define los elementos de datos y un segmento de código.
   1. Tipo alineación: Nos dice el limite en el que inicia el segmento.
  2. Tipo combinar: Indica si el segmento se combina con otros segmentos son                enlazados después de enlazar. 
  3. Tipo clase: Agrupa segmentos cuando se enlazan.


8.- El formato de la directiva SEGMENT es
              Nombre SEGMENT alineación combinar clase
     Explicar el objetivo de (a) alineación: (b) combinar: (c) clase.

(a)   Provoca alineación de un segmento en una frontera, tal como la de un párrafo.

9.-(a) Cual es el objetivo de un procedimiento? (b) Como define el inicio y el final de un procedimiento? (c) Cuando define un procedimiento como FAR y cuando como NEAR?
(a) Proporciona una sección de código relacionado, como una subrutina

10.- Explique qué enunciados END particulares tratan la finalización de (a) un programa; (b) un  procedimiento; (c) un segmento.
(a) END; (c) ENDS

11.- Establezca las diferencias entre los enunciados que finalizan un encabezado y los enunciados que finalizan una ejecución.
La directiva END le indica al ensamblador que no existen más instrucciones por ensamblar, instrucciones que hagan el control regrese al sistema operativo son MOV AX, $C00H e INT 21H

12.-De los nombres  STKSEG, DATSEG y CDSEG a los segmentos de la pila, de los datos y del código, respectivamente, y codifique el ASSUME necesario
ASSUME SS: STKSEG, DS: DATASEG, CS: CDSEG

13.- considere las instrucciones MOV AX, 4C00H utilizadas con INT 21H. (a) Que hace la instrucción (b) Cual es la finalidad del 4C y el 00?

14.- para las directivas simplificadas de segmentos, la directiva, MODEL proporciona los modelos  TINY, SMALL, MEDIUM, COMPACT y LARGE. Bajo qué circunstancias se utiliza cada uno de estos modelos?

15.- De las longitudes, en bytes, generadas por las siguientes directivas de datos (a)DD (b)DW  (c)DT  (d)DQ  (e)DB
a.-4 c.-10 e.-1
16.-Defina una cadena de caracteres con nombre TITLE que contenga la constante RGB electrónicos.
TITLE1  DB RGB electrónicos
17.- Defina los valores numéricos siguientes en elementos de datos  FIELDA a FIELDE, respectivamente
(a)Un elemento de cuatro bytes con el equivalente hexadecimal de 215 decimales
(b) Un elemento de un byte con el equivalente hexadecimal de 35 decimales.
(c) Un elemento de dos bytes con un valor no definido
(d) Un elemento de un  byte con el equivalente binario de 25 decimales
(e) Un DW con los valores consecutivos 17, 19, 21,26 y 31
  a.- FLDA DD73H
  c. - FLDC DW?
  E.-FLDE DW 17, 19,21,26,31



18.-Muestre el código objeto hexadecimal  generado por (a) DB 28 (b) DB 28
a.-ASCII 3238; b.- ex IC

19- Determine el código objeto hexadecimal ensamblado por (a) DB 28H (b) DW 2845H (c) DD 2833AH (d) DQ 28733AH

                a.-28 c.-3A732800











jueves, 10 de octubre de 2013

Ejercicio : Saltos

Tecleamos el código y lo guardamos como .asm


Ensamblamos y enlazamos



Ejecutamos usando debug y escribimos las sig. instrucciones para ver el contenido en algunas partes de la memoria:

1.
-D SS:0
( Área de memoria del El registro de segmento de pila iniciando en el desplazamiento en 0)
2. 
-D DS:0
(Área de memoria del El registro de segmento de datos iniciando en el desplazamiento en 0)
3.
-D CS:0 
( Área de memoria del El registro de segmento de código iniciando en el desplazamiento en 0)



4.Después utilizamos el comando R para mostrar el contenido de los registros.
-R
5. Después utilizamos el comando T para rastrear la ejecución del programa.
-T
hasta llegar a la interrupción