Está en la página 1de 13

INSTITUTO TECNOLÓGICO

SUPERIOR DE MISANTLA

Lenguajes de interfaz
Unidad 1: Introducción al lenguaje
ensamblador

INGENIERIA EN SISTEMAS
COMPUTACIONALES
P R E S E N T A
Valentina García Luna

Docente: MSC. Antonio de Jesús


Romero C. de Vaca

MISANTLA, VERACRUZ Abril 2022


Índice

Modos de direccionamiento a memoria en ensamblador ............................... 5

Direccionamiento por registro .............................................................................. 5

Direccionamiento indirecto ................................................................................... 5

Direccionamiento directo ...................................................................................... 6

Direccionamiento indexado .................................................................................. 7

Direccionamiento inmediato ................................................................................. 8

Ejemplo Direccionamiento indirecto: ............................................................. 10

Bibliografía........................................................................................................ 12

2
Índice de tablas

Tabla 1.1 Tabla de direccionamiento ...................................................................... 9

3
Índice de imágenes

Imagen 1.1 Código utilizado ................................................................................. 10


Imagen 1.2 Ejecución del código en turbo Assembler ........................................... 11
Imagen 1.3 Ejecución del código en emu8086 ...................................................... 11
Imagen 1.4 Resultados del código ........................................................................ 12

4
Modos de direccionamiento a memoria en ensamblador

Direccionamiento por registro

Se habla de direccionamiento por registro, sin más calificativos, cuando en la operación la


información procede de un registro y el destino es otro registro. Dicho de otra forma: la
transferencia tiene lugar en el interior del microprocesador, sin emplear en ningún
momento los buses de datos o direcciones.
Un ejemplo de direccionamiento por registro sería el siguiente:
MOV AH, AL
En este caso se traslada el contenido del registro AL al registro AH, lo que también
equivale a copiar los 8 bits de menor peso del registro AX en los 8 bits de mayor peso.
Obviamente el contenido que tuviese anteriormente AH se pierde de forma definitiva. Una
de las operaciones más habituales en las que se ve implicado este tipo de
direccionamiento es la inicialización de registros de segmento, para establecer por
ejemplo el área de datos de un programa. Asumiendo que en el registro AX se tuviese la
dirección del segmento de datos, una de las primeras instrucciones del programa sería la
siguiente:
MOV DS, AX
Al usar este tipo de direccionamiento deben tenerse en cuenta las reglas siguientes:
• El registro de destino y el de origen ser del mismo tamaño, por lo que no sería válida una
instrucción como MOV AH, DX, ya que AH es un registro de 8 bits y DX de 16. Esta regla
es aplicable en general a cualquier transferencia de información.
• Determinados registros no pueden aparecer como destino en un direccionamiento por
registro. Los casos más significativos son CS e IP, siendo inválidas instrucciones como
MOV IP, BX, por poner un ejemplo.
• No es posible usar como origen y destino un registro de segmento, siendo incorrectas
instrucciones del tipo MOV DS, CS. La alternativa sería un código como:
MOV AX, CS
MOV DS, AX
Otra alternativa sería enviar el origen a la pila y recogerla de ésta en el registro de
destino, pero ya no se estaría utilizando direccionamiento por registro que es el método
más rápido.

Direccionamiento indirecto
Se trata de un direccionamiento similar al anterior, dado que de lo que se trata es de
transferir un dato desde o hacia la memoria, pero en este caso la dirección no se facilita
en la propia sentencia, de ahí que cuando el microprocesador vaya a ejecutar la

5
instrucción no pueda realizar directamente esa transferencia. En su lugar la dirección está
almacenada en un registro que, desde el punto de vista del programa, actuaría como un
puntero. Por ejemplo:
MOV AL, [RX]
Como en el direccionamiento directo, el tamaño de uno de los operandos marca el
número de bytes a transferir. La dirección de memoria puede ser el destino o el origen,
también como en el direccionamiento directo. Para ejecutar una instrucción como la
anterior el microprocesador tiene que obtener el código de operación y descodificarlo. En
ese momento sabe que uno de los operandos, en el caso anterior el registro BX, contiene
una dirección que debe colocar en el bus de direcciones, llevando a cabo la lectura o
escritura.
Una variante de este tipo de direccionamiento es la que incluye un desplazamiento sobre
la dirección base contenida en el registro. La forma de expresar el desplazamiento sería la
siguiente:
MOV AL, [BX+4]
Asumiendo que el registro BX contuviese la dirección donde está alojada una cierta
estructura de datos que el programa necesita utilizar, el desplazamiento adicional sería
útil para acceder a campos de dicha estructura.

Direccionamiento directo

En este tercer modo de direccionamiento uno de los operandos, puede ser el destino o
bien el origen, es una dirección de memoria. Esta, al igual que ocurre con el dato
inmediato del modo de direccionamiento previo, es recuperada durante la descodificación
de la instrucción, por lo que el procesador la tiene a su disposición cuando va a ejecutar la
operación. En ese momento la coloca en el bus de direcciones e indica a la memoria si
tiene que leerla, y poner su contenido en el bus de datos, o bien si debe recuperar la
información enviada por el bus de datos y escribirla en esa dirección.
Para diferenciar un dato de 16 bits, como puede ser 12 8 0 h, de la dirección de memoria
12 8 Oh, ya que el ensamblador no puede saber ante una instrucción como MOV AX, 12 8
Oh si el segundo operando es un dato inmediato o bien una dirección de memoria, existen
dos posibilidades:
• Colocar la dirección entre corchetes, de manera que la instrucción quedaría como
MOVAX, [1280h].
• Declarar la dirección como una etiqueta, una capacidad que ofrecen todos los
ensambladores, de forma que la instrucción sería del tipo MOV AX, Valor, siendo Valor la
etiqueta previamente definida.

6
Al acceder a memoria la dirección efectiva (real) se obtiene a partir de un registro de
segmento y la dirección indicada en la instrucción, que sería el desplazamiento. Cada
instrucción asume un registro de segmento por defecto, registro que puede ser cambiando
por otro indicado explícitamente en la propia instrucción. En capítulos posteriores
conocerá con exactitud la forma en que se generan estas direcciones y la función que
tienen los registros de segmento, tanto en modo real (16 bits) como en modo protegido
(32 bits).
El número de bytes transferidos desde o hacia la memoria, cuando se utiliza este
direccionamiento directo o cualquier otro que opere sobre memoria, será deducido por el
propio ensamblador siempre que sea posible, observando el tamaño del otro operando.
En una instrucción como MOV AX, [ 12 8 Oh], por ejemplo, se recuperaría el contenido de
la posición de memoria indicada y la siguiente, 16 bits en total, ya que el registro AX es de
16 bits. En caso de que no sea posible deducir el tamaño, éste puede especificar
explícitamente con las palabras BYTE, WORD, DWORD, etc., que reconocen la mayoría
de los ensambladores.

Direccionamiento indexado

Es el modo de direccionamiento más sofisticado con que cuenta el 8086, permitiendo el


acceso a memoria calculando la dirección a partir de tres componentes. Es también un
direccionamiento indirecto, si bien la dirección no se obtiene sin más de un registro sino
que es calculada a partir de dos registros y, opcionalmente, un desplazamiento. Podría
decirse, por tanto, que el direccionamiento indexado es un caso particular de
direccionamiento indirecto.
Al usar el modo de direccionamiento indexado uno de los registros, normalmente BX o
BP, contendrá una dirección base a la que se sumará el contenido de un registro índice,
DI o SI.
El contenido del registro índice suele ir cambiando, incrementándose o reduciéndose, en
el interior de un bucle. Opcionalmente puede sumarse también un desplazamiento, dando
lugar a instrucciones como la siguiente:
MOV AL, [BX+SI+4]
Suponiendo que un programa tuviese alojada en memoria una lista de estructuras de
datos, el registro BX contendría la dirección base donde comienza la lista, es decir, la
dirección del primer campo de la primera estructura de esa lista. El registro SI serviría
para direccionar cada uno de los elementos de la lista, de forma que se le sumaría o
restaría, según se quiera avanzar o retroceder, un número que sería el tamaño de cada
elemento. Finalmente, el desplazamiento sería el que establecería el campo al que se
quiere acceder dentro de ese elemento.

7
Direccionamiento inmediato

Combina el modo directo e indirecto mediante registros.

De Pila: Se utiliza cuando el operando está en memoria y en la cabecera de la pila. Este


direccionamiento se basa en las estructuras denominadas Pila (tipo LIFO), las cuales
están marcados por el fondo de la pila y el puntero depila (*SP), El puntero de pila apunta
a la última posición ocupada. Así, como puntero de direccionamiento usaremos el SP. El
desplazamiento más el valor del SP nos dará la dirección del objeto al que queramos
hacer referencia. En ocasiones, si no existe C. de desplazamiento solo se trabajará con la
cima de la pila. Este tipo de direccionamiento nos aporta flexibilidad, pero, por el contrario,
es mucho más complejo que otros tipos tratados anteriormente.

8
Tabla 1.1 Tabla de direccionamiento

Modo Sintaxis Descripción


Registro Rn El operando es el contenido del registro

Indexado X(Rn) (Rn+X) apuntan al operando. X se almacena en la


siguiente palabra

Simbólico ADDR (PC+X) apuntan al operando. X se almacena en la


siguiente palabra

Absoluto &ADDR La palabra siguiente a la instrucción contiene la


dirección absoluta. X se almacena en la siguiente
palabra. Se usa el modo indexado X(SR)
Indirecto por @Rn Rn es usado como apuntador al operando
registro

Indirecto con @Rn+ Rn es usado como apuntador al operando. Rn es


auto incrementado en 1 para instrucciones .b y en 2 para
incremento instrucciones. w

Inmediato #N La palabra siguiente a la instrucción contiene la


constante inmediata N. Se usa el modo indirecto
con auto incremento @PC+

9
Ejemplo Direccionamiento indirecto:

.model small
.stack
.data
var1 db 0Ah
arreglo1 db 1,5,10,15,0Bh,0Ch,0Dh
.code
inicio:
mov ax,@data
mov ds,ax
mov al,[3]

end inicio

Imagen 1.1 Código utilizado

10
Imagen 1.2 Ejecución del código en turbo Assembler

Imagen 1.3 Ejecución del código en emu8086

11
Imagen 1.4 Resultados del código

12
Bibliografía

ualls, B. (2010). Programación de Mainframes en Ensamblador.

Charte Ojeda, Francisco. (2009). Ensamblador. Anaya multimedia.

13

También podría gustarte