aspectos_basicos_de_la_programacion_en_ensamblador

Preview:

Citation preview

SIS-330 :: Programación en Assembler 1144

2. CAPITULO II: ASPECTOS BASICOS DE LA PROGRAMACION EN ENSAMBLADOR2.1. REGISTROSLos procesadores de la familia 80x81 son procesadores de 16, 32 o 64 bits, el tamaño de bits es el tamañomáximo de transferencia o tamaño máximo de manipulación de los datos que serán procesados en undeterminado tiempo.

Con relación a esto, el procesador cuenta con una serie de registros para realizar las operaciones decálculo, y como almacenamiento de datos.

Un registro es un lugar donde se almacena o guardan los datos, tiene una longitud de 16 o 32, cadaregistro tiene dos subregistros de 8 bits cada uno cuando el registro es de 16 bits, dos subregistros de 16bits cuando el registro es de 32 bits y dos subregistros de 16 bits cuando el registro es de 64 bits.

Estos registros se dividen en 5 grupos, según sus funciones:

2.1.1. REGISTROS DE PROPÓSITO GENERAL: La principal misión de estos registros es el dealmacenar datos relevantes de los programas y operandos.

AX o EAX: Registro Acumulador

Registro AX (EAX).- Esta dedicado a operaciones aritméticas (multiplicación, división), operaciones deentrada/salida, de traducción, procesamiento de cadenas (string) y transferencias.

Este registro es el más usado, siendo de propósito general; y tiene ciertas especializaciones, de ahí sunombre:

§ Es el único que puede ser usado como multiplicando en la multiplicación§ Es el único que puede ser usado como dividendo en la división§ Es el parámetro que selecciona los distintos servicios del Sistema Operativo, usados mediante

el mecanismo de Interrupciones.

BX o EBX: Registro Base

Registro BX (EBX).- Se utiliza como puntero Base, específicamente en el direccionamiento de lamemoria, entre otras actividades puede ser utilizado para almacenar la parte relativa de la dirección delsegmento, (nos referimos al desplazamiento), en este caso trabaja junto al registro DS (Data Segment).También es utilizado como índice en direccionamiento extendido, para el manejo de tablas y paraoperaciones aritméticas.

Este registro, además de las características generales de los registros de propósito general, se especializaen:

§ El acceso a memoria en combinación con los registros de índice, especialmente para el manejo dearreglos.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0AH AL

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0BH BL

SIS-330 :: Programación en Assembler 1155

CX o ECX: Registro Contador

Registro CX (ECX).- Este registro se utiliza como contador de iteraciones, en determinadasinstrucciones de repetición y desplazamientos.

Este registro, como su nombre indica, será ampliamente usado como contador. Puede ser usado comocualquier registro de propósito general, pero tiene capacidades especiales para ser usado en instrucciones:

§ de manejo de ciclos§ como contador en los corrimientos§ de manejo de memoria y strings

DX o EDX: Registro de Datos

Registro DX (EDX).- Se utiliza en operaciones aritméticas (multiplicación y división), direccionamientoindirecto, también en operaciones de entrada/salida.

Este registro de propósito general tiene como especializaciones:§ Formar con AX números de 32 bits, siendo en este caso la parte más significativa.§ El acceso a puertos. Las instrucciones IN y OUT, que permiten dicho acceso, requerirán en

ciertos casos que el número de puerto esté en DX.

2.1.2.REGISTROS DE SEGMENTO: Para el manejo de los Segmentos

CS: Registro de Segmento de Código

Registro CS.- Segmento de Código, este registro contiene la dirección inicial del segmento de código,guarda o almacena los Códigos de operación de las instrucciones, esta relacionado con el registro IP.

Este registro selecciona el área de 64 Kb. que generalmente dedicamos al código. En este caso, el CPU,siempre toma las instrucciones de esta región de memoria; por lo que cuando requerimos más de 64 Kb.de código (instrucciones), este registro tendrá que moverse, tomando distintos valores según recorremosdistintas regiones de memoria.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0CH CL

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0DH DL

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0Code Segment

SIS-330 :: Programación en Assembler 1166

DS: Registro de Segmento de Datos

Registro DS.- Segmento de datos, este registro contiene la dirección inicial donde se almacenan losdatos. selecciona una sección de 64 Kb. que se dedica generalmente a colocar en ella nuestras variables,por lo cual toma su nombre: sección de memoria dedicada a datos.

SS: Registro de Segmento de Pila

Registro SS.- A través de este registro se incrementa la zona de memoria que actúa como pila. Contienela dirección inicial del segmento de pila.

Este registro selecciona la región de 64 Kb. que va a contener la pila del sistema. Como su nombre loindica, tendremos una estructura de datos, con política LIFO (Last In, First Out = El último elemento enentrar, es el primero en salir), con instrucciones básicas PUSH y POP para su manejo. Esta estructura esusada por los programas de aplicación, pero también por el procesador para el control de instruccionesque lo requieren, tales como las llamadas a subrutinas y la atención de interrupciones.

ES: Registro de Segmento Extra (FS, GS 386+, Extra Segments)

Registro ES.- Contiene la dirección inicial del segmento de un segmento extra de datos. Generalmenteeste segmento extra es utilizado en operaciones con cadena, entradas y salidas para manejar direccionesde memoria y transferencias de datos entre segmentos.

Este registro nos permite seleccionar una sección de 64 Kb., que no está destinada a ningún usoespecífico; por lo que el programador puede aplicarla como comodín, generalmente como un segundosegmento de datos; o bien, para el acceso a regiones de memoria del sistema, tales como la memoria devideo o las variables del BIOS.

En resumen estos 4 segmentos nos indican las direcciones iniciales de los segmentos de pila, datos,código y extra.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0Data Segment

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0Stack Segment

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0Extra Segment

SIS-330 :: Programación en Assembler 1177

2.1.3. REGISTROS PUNTERO DE PILA Y REGISTROS INDICE:

SP o ESP: Registro de Apuntador de Pila

Registro SP (ESP).- Este registro contiene la dirección de la cabeza o inicio de la pila, esta asociadoestrictamente con el registro SS (Stack Segment).

Este registro también está siempre asociado al manejo de la pila. Su función especial es marcar el tope dela pila, y por tanto, indica en qué localidad de memoria se localiza la información de la pila; se incrementacuando se hace un POP, con lo que apunta al siguiente elemento en la pila; y se decrementa al hacer unPUSH, con lo que controla el acceso a la memoria de la pila.

BP o EBP: Registro de Apuntador de Base

Registro BP (EBP).- Este registro es denominado Puntero Base, permite direccionamiento a pila, porotro lado permite la referenciación de parámetros (datos o direcciones relacionados con la pila). Otro usoes para determinar el offset o desplazamiento dentro de la pila, sea como Índice o como dirección base.Este registro es usado para accesar, dentro del segmento de pila, la información. Principalmente nospermite determinar cuando hay un underflow, es decir, cuando se quiere sacar más información de la pilaque la que se ha colocado en ella; y el acceso a variables locales y parámetros.

SI o ESI: Registro Indice Fuente

Registro SI (ESI).- Significa Indice Fuente, relacionado con el registro de segmento DS (Data Segment).También se utiliza en operaciones con cadenas a través de índices, como elemento de indexación.

Este registro se especializa en el acceso a bytes o words dentro del segmento de datos; existeninstrucciones que lo toman por defecto como el registro que apunta a una localidad de memoria que se vaa leer, por lo cual toma su nombre.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0Stack Pointer

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0Base Pointer

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0Fuente Index

SIS-330 :: Programación en Assembler 1188

DI o EDI: Registro Indice Destino

Registro DI (EDI).- Indice Destino, internamente relacionado con el registro DS (Data Segment), através de estas direcciones se pueden hacer varios tipos de operaciones, operaciones con cadenas endestino.

Este registro se especializa en el acceso a bytes o words dentro del segmento de datos o el extra; existeninstrucciones que lo toman por defecto como el registro que en combinación con el ES apunta a unalocalidad de memoria que se va a escribir, por lo cual toma su nombre.

2.1.4.REGISTROS DE PUNTERO Y FLAG:

IP o EPI: Registro de apuntador de siguiente instrucción

Registro IP (EPI).- Este registro contiene la dirección del desplazamiento de la instrucción ejecutada,determinando dentro del segmento de código la dirección de la siguiente instrucción, se añade la direcciónde este registro. Este registro puede manejar direcciones solo en forma indirecta.

FLAG o EFLAG: Registro de Banderas

Registro FLAG (EFLAG).- Este registro permite determinar el estado de ejecución, íntimamenterelacionado con la ALU9 (Unidad Aritmética Lógica), consta de 16 o 32 bits, 9 de estos actúan comoseñalizadores.

bit 0 - Carry: Este bit es de acarreo, producto de operaciones aritméticas, de rotaciones y otros. (NC= no hay acarreo; CY = Sí lo hay)

bit 2 - Parity: Se utiliza para el control de la paridad en operaciones en la A.L.U. e indica el númerode par de bits, cuando este bit es 1 es par, cuando 0 es impar. (PO = paridad non; PE = paridad par)

bit 4 - Auxiliary Carry: Se utiliza para acarreos auxiliares, propiamente entre nibbles (4 bits),indica el ajuste necesario en operaciones aritméticas decimales. (NA = no hay acarreo auxiliar; AC =hay acarreo auxiliar)

99 ALU: Aritmetic Unit Logic, este componente, como su nombre indica, contiene la circuitería necesaria para realizar las diversasoperaciones aritméticas y lógicas. Recibe sus operandos por un Bus denominado A, y genera los resultados regresándolos almismo bus. Una particularidad que es importante recalcar es su conexión al registro de banderas, por lo cual todas lasoperaciones aritméticas y lógicas, de acuerdo a su resultado, lo alterarán.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0Destino Index

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0Instruction Pointer

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0Flag

SIS-330 :: Programación en Assembler 1199

bit 6 - Zero: Se coloca en 1 cuando el resultado de la operación es cero. (NZ = no es cero; ZR = sílo es)

bit 7 - Sign: A través de este bit se indica el resultado de la comparación negativa o de resultadosaritméticos, si el resultado es positivo, el bit se pone en 0, si es negativo se pone en 1. (PL = positivo;NG = negativo)

bit 8 : Controla la ejecución paso a paso, generalmente controla las excepciones de ejecución. Estaíntimamente relacionado con el utilitario DEBUG.

bit 9 - Interrupts: Controla las interrupciones 1= interrupción permitido, 0 = interrupción nopermitida. (DI = desactivadas; EI = activadas)

bit 10 - Direction: A través del cual se controla la dirección izquierda o derecha, en cadenas decaracteres, es decir determinar la dirección de exploración de la cadena, esta íntimamente relacionadocon el registro SI y DI. (UP = hacia adelante; DN = hacia atrás)

bit 11 - Overflow: en relación al bit más significativo, interviene en operaciones aritméticas. (NV = nohay desbordamiento; OV = sí lo hay)

2.2. SEGMENTACIÓNLos chips de memoria se dedican meramente a almacenar la información hasta que se necesita. El númeroy la capacidad de almacenamiento de estos chips que hay dentro del ordenador determinan la cantidad dememoria que podremos utilizar para los programas y los datos.

La forma en que la CPU construye las direcciones de memoria es muy importante para la programaciónde cualquier sistema, debido a que constantemente utilizamos instrucciones de transferencias de datos, deacceso a funciones de la BIOS, y del S.O., en la BIOS se encuentran rutinas que se encargan de accederal nivel más bajo en cuanto a programación se refiere. Es decir, estas rutinas se encargan de manipular elhardware por nosotros. BIOS son las siglas de Basic Input Output System (Sistema básico deentrada/salida).

A principio de los años 80, Intel (fabricante de la familia de procesadores 80x86) se propuso dar un granpaso adelante con respecto a la competencia. En aquel tiempo los microprocesadores que imperaban entrelos ordenadores domésticos eran de 8 bits, es decir, tenían un ancho de bus de datos de 8 bits, el tamañode palabra de memoria era de 8 bits, y los registros del procesador eran de 8 bits. Un claro ejemplo deesto fue el microprocesador Z80 (de la empresa Zilog), el cual estaba incorporado en máquinas tanfamosas como los spectrum, amstrad, msx. En estos equipos el ancho del bus de datos era de 8 bits. Estoquiere decir que todas las transferencias de datos que se hicieran se harían de 8 en 8 bits, es decir, byte abyte.

Pues bien, aunque el microprocesador era de 8 bits, y la mayoría de registros también lo eran, habíaalguno mayor (16 bits). Me estoy refiriendo sobre todo al registro de direcciones que era de 16 bits. Deesta forma, un amstrad cpcA464 podía acceder a 64 kb de memoria. 64 Kb es la máximo que podíadireccionar el z80 original.

SIS-330 :: Programación en Assembler 2200

En ese momento Intel se plantea superar esa barrera de las 64 Ks, pero tenían un problema. El z80 porejemplo, había conseguido tener registros de 16 bits cuando el microprocesador es de 8. Pero pasar de 16bits de capacidad en registros en aquellos momentos no era posible para los microprocesadores. Es decir,no había suficientes avances tecnológicos como para conseguir tamaños de registros mayores en unmicroprocesador. De tal manera que había que buscar una fórmula diferente. De ahí es cuando surgió eltema de los segmentos que tantos quebraderos de cabeza a dado hasta ahora y sigue dando. A Intel se leocurrió la idea de construir una dirección de 20 bits de ancho y colocarla en el bus de direcciones parapoder dirigirse a la memoria. Pero al ser los registros de 16 bits, sólo había una solución posible paracrear este ancho de 20 bits: Usar 2 registros de 16 bits!. El 8086 divide el espacio de direcciones (1Mbyte) en segmentos, cada uno de los cuales contiene 64 Kb de memoria (la máxima direccionable por unsolo registro). Entonces, para direccionar una posición de memoria nos valemos de dos registros:Registro de segmento y de desplazamiento

Este primer registro (de SEGMENTO), indica donde comienza el trozo de 64 Kb que buscamos.Y el segundo registro (el de DESPLAZAMIENTO), contiene el desplazamiento dentro de ese segmento.

Se ha visto que son necesarios 2 registros para direccionar ese Mbyte de memoria, y tenemos un bus dedirecciones de 20 bits. Esto nos conduce a que el microprocesador debe realizar unas operaciones sobreestos dos registros para obtener la dirección física de 20 bits.

Esto se logra de la siguiente manera:

El 80x86 mueve el valor del segmento 4 bits a la izquierda y le suma el valor del desplazamiento paracrear una dirección de 20 bits.

Gráficamente: Tenemos dos registros de 16 bits.

DS: XXXXXXXXXXXXXXXX BX: XXXXXXXXXXXXXXXX

El primer registro, es el de segmento (en este caso, segmento DS, de datos). El segundo registro es el deoffset o desplazamiento. En este caso utilizamos el registro BX para direccionar dentro de el segmento.Podíamos haber utilizado también el registro SI, el DI, etc. A partir de estos dos registros, debemosacceder a una posición de memoria física dentro del Mbyte de que disponemos para el 80x86. Pongamosque el registro DS tiene el valor 0B800h (en hexadecimal), y el registro BX contiene el valor 0037h.

Tenemos pues (en binario):

DS: 1011100000000000 BX: 0000000000110111

Para obtener la dirección física de memoria, y teniendo en cuenta todo lo dicho relativo a segmentos, elmicroprocesador actuaría así:

Haría una suma de la siguiente forma:1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 11 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1

DS:BX:

SIS-330 :: Programación en Assembler 2211

Obteniendo así la dirección de 20 bits necesaria para cubrir todo el Mbyte. Si ese número(10111000000000110111) que está en binario, lo pasamos a hexadecimal, tenemos que la dirección físicacorrespondiente a la anterior segmentada es: 0B8037h.

De todo lo anterior, se desprende que los segmentos empiezan siempre en direcciones divisibles por 16.Más técnicamente: cada segmento comienza en una dirección de párrafo.

Un párrafo son 16 bytes. Por supuesto nunca habrá un segmento que empiece en una dirección impar.

Aquí una observación, si uno prueba con diferentes valores tanto en el segmento y en el desplazamiento,se dará cuenta que diferentes combinaciones de direcciones segmentadas dan una misma dirección física.También se puede apreciar que los segmentos se pueden superponer unos a otros, pueden ser idénticos, opueden encontrarse en partes totalmente lejanas en la memoria.

2.3. DESPLAZAMIENTOSEn un programa, todas la localidades de memoria están referidas a una dirección inicial de segmento. Ladistancia en bytes desde la dirección del segmento se define como el desplazamiento (offset).

Un desplazamiento de dos bytes (16 bits) puede estar en el rango de 0000H hasta FFFFH, o bien, desdecero hasta 65, 535. Así el primer byte del segmento de código tiene un desplazamiento 00, el segundo bytetiene un desplazamiento 01, etc. hasta el desplazamiento 65, 535. Para referir cualquier dirección dememoria en un segmento, el procesador combina la dirección del segmento en un registro de segmentocon un valor de desplazamiento.

Indistintamente del lenguaje de programación que estemos utilizando, cuando obtenemos el ejecutable,éste está compuesto únicamente por ese tipo de instrucciones básicas (instrucciones de código máquina).Dependiendo de la calidad y prestaciones de ese lenguaje de programación, el código resultante, necesitamás instrucciones del procesador o menos.

De todos es conocido, que hay lenguajes de alto o medio nivel (como C, pascal, basic, C++, etc.) en losque para una misma tarea, un lenguaje puede generar un ejecutable más grande que otro. Esto no sucedeasí con ensamblador, en el que para cada instrucción, existe una y sólo una instrucción en código máquina.

Las instrucciones del 8086 se codifican sobre 4 campos como máximo, y tienen un tamaño de 1 a 6 bytes.Es decir, dependiendo de la instrucción de que se trate, necesita más o menos bytes para su codificación,así como más o menos campos.

Los cuatro campos en una instrucción código máquina son:

§ Código de operación: Una vez que el procesador descifra el significado de este campo, sabe si lainstrucción consta de más campos o si se trata de una instrucción de un sólo campo.

§ Desplazamiento del dato (sobre 8 o 16 bits): En caso de existir éste campo, supone undesplazamiento sobre la dirección dada por un registro índice o base (especificado este registromediante el byte EA).

SIS-330 :: Programación en Assembler 2222

§ Modo de direccionamiento (byte EA): Le indica al procesador el número de operandos queacompañan al código de operación, así como el tipo de estos operandos (registros, memoria, valorinmediato).

§ Valor inmediato (sobre 8 o 16 bits): Almacena un valor numérico de 8 o 16 bits, que va a serutilizado para una transferencia, una operación aritmética, etc.

El código de operación está codificado sobre 8 bits. Por medio de este campo se sabe si va a sernecesario cualquier otro de los tres restantes. También el código de operación contiene informaciónacerca de si se va a trabajar con palabras o con bytes.El desplazamiento en caso de existir, supone un incremento en la dirección dada por un registro índice obase, dando lugar así a un desplazamiento final, dentro de un segmento dado. Es decir, podemos accedera memoria a través de un registro base (BX) o un registro índice (SI, DI), etc, o bien hacerlo a través deuno de esos registros, pero ayudándonos de un desplazamiento que se suma a la dirección que tienenestablecida esos registros.

Como ejemplo: Tenemos el registro DI apuntando a (con valor igual a) la dirección 3000h (direccionessiempre en hexadecimal). En esa dirección tenemos el comienzo de una cadena de caracteres quequeremos convertir a mayúsculas. Y una vez que los hemos convertido, los queremos copiar a la memoriade pantalla. Pues bien, podemos ir incrementando DI para tratar cada uno de estos caracteres, o bienpodemos utilizar DI junto con un desplazamiento para acceder a cada uno de los caracteres. Es decir,para acceder al primer elemento sería DI + 0, para el segundo, sería DI + 1, etc. De esta forma, alterminar la tarea, DI seguir apuntando al principio de la cadena, y podremos copiar la cadena desde elprincipio a donde corresponda.

Si no utilizáramos desplazamiento, tendríamos que tener una variable apuntando al inicio de la cadena,para tenerlo luego localizable.

2.4. DIRECCIONAMIENTOEl direccionamiento y sus modos de direccionamiento son un conjunto de reglas que se especifican paralocalizar la posición de un dato que es utilizado durante la ejecución de una instrucción. También se puededecir que son procedimientos que se emplean en las instrucciones para localizar sus operandos donde seencuentran los datos que la Unidad Central de Proceso tendrá que procesar.

La extensión máxima que se puede direccionar con algunas maquinas es 1 Megabyte. Las formas quepueden especificarse para el direccionamiento de memoria se lo realiza a través de un desplazamiento, deesta forma producir una dirección efectiva, y estas formas pueden utilizarse los registros BX o BP, elregistro SI o DI o utilizando un desplazamiento relativo como parte de la instrucción (una instrucción estaformada por un código de operación y operandos

Código de Operación Operando1, Operando2Destino Fuente

SIS-330 :: Programación en Assembler 2233

MODOS DE DIRECCIONAMIENTO:Para comprender los diferentes modos de direccionamiento que se presentaran, es imperativo entender elciclo de operación básico de la computadora. La unidad de control de una computadora esta diseñadapara recorrer un ciclo de instrucciones que se divide en tres fases principales:

§ Búsqueda de la instrucción de la memoria.§ Decodificar la instrucción.§ Ejecutar la instrucción.

Direccionamiento Registro.- En este modo el campo de los operandos corresponde a uno de losregistros de la CPU. La velocidad de este modo es bastante alta en relación a las otras. El dato a procesaresta en un registro, la CPU trabaja con este dato, en este modo NO se utiliza dirección de segmento.

Los diferentes registros son utilizados como variables.

ADD AX, BX

Antes de la operación EjecutandoAX = 0001 -------> 0003BX = 0002 -------> 0002

Direccionamiento Inmediato: En este caso el valor del operando es el que consta en la propiainstrucción, de este modo se utiliza cuando se necesitan definir constantes, no existe la utilización de unregistro segmento, se trabaja directamente con los siguientes registros del CPU.

Ejemplo: MOV AX, 34h

Direccionamiento Directo: La dirección viene dada a través de un nombre simbólico, que representa auna variable o etiqueta. La dirección efectiva es especificada como parte de la instrucción. El registro DSse asume por defecto.

Ejemplo:MOV Num, 8 específicamente MOV DS:Num, 8

Direccionamiento mediante un registro: En este caso el desplazamiento o el offset, se halla en uno delos registros indice o base; Registros Indice BX, BP; registros SI, DI

Para especificar al registro referido se usa el segmento DS.[BX], [SI], [DI] ---> por defecto se usa el segmento DS[BP] ---> por defecto utiliza el segmento SS

Ejemplo: ADD AL, [ BX ]

SIS-330 :: Programación en Assembler 2244

Direccionamiento Relativo a Base: En este modo la posición del dato con respecto al registro segmentoviene dado por el contenido de BX o BP como base y un registro offset sobre esa base.

Ejemplo: MOV AX, [ BX + 5 ]

Lleva el contenido de la dirección resultante de esta operación, al registro AX. Una de las aplicacionesque se puede hacer con este modo de direccionamiento es cuando se trabaja con vectores en memoria.

Direccionamiento Directo Indexado: La dirección del dato viene dado por una base que es unaconstante o una variable y un desplazamiento con respecto a la base que viene contenido en los registrosSI o DI.

Ejemplo: ADD AX, [ DI + 8 ]

Direccionamiento Indexado a Base: Este modo es una combinación de los 2 modos anteriores. Eldesplazamiento que nos da la posición del dato viene dado por la suma de los contenidos de BX o BP, deDI o SI y en forma opcional un desplazamiento adicional que puede ser dado por una constante o unavariable.

BX, SI, DI --> Segmento DSBP --> Segmento SS

Ejemplo: ADD [ BX + SI + Num ], AX