assembler en 8086, manejo de registros

assembler en 8086, manejo de registros

de Fabricio Gabriel Techera Rosado -
Número de respuestas: 1

Disculpen, solo dispongo de 4 registros para trabajar, Ax,Bx,Cx,Dx, luego como se supone que guarde valores que debo usar constantemente? tendria que usar el stack?

No entiendo la utilidad de los segmentos cs ds ss y es ni para que son si di o ip.

No entiendo si los puedo retocar, que cosas los cambian, aparte para direccionar memoria me piden que trabaje con solo 4 registros, BX DI SI y BP mas un desplazamiento que debo guardar en algun registro o puedo invocarlo directo de la memoria?

En respuesta a Fabricio Gabriel Techera Rosado

Re: assembler en 8086, manejo de registros

de Gustavo Brown -

Hola, 

  En las notas, diapositivas y las clases grabadas se explican los registros disponibles y las particularidades de cada uno.

Va un pequeño resumen que no sustituye la tarea de leer y ver lo indicado ahi arriba.

Los registros disponibles para casi todas las instrucciones son los siguientes: AX, BX, CX, DX, SI, DI, BP, SP
Todos ellos de 16 bits.
Los registros AX, BX, CX y DX también pueden accederse de a byte (alto o bajo): AH, AL, BH, BL, CH, CL, DH, DL

El registro SP es utilizado por las instrucciones que interactúan con el stack por lo que deberías usarlo con mucho cuidado. Si bien puede aparecer como operando de cualquier instrucción de la ALU en la práctica se usa directamente solo para quitar/reservar espacio de stack.

En resumen, en la práctica tenes 7 registros de 16 bits que pueden ser usados de propósito general de los cuales 4 de ellos pueden trabajarse de a mitades (8 bits alto o bajo).

Para preservar el valor de los registros podes usar el stack (PUSH y POP) o utilizar "variables" en memoria y guardar/recuperar valores de allí (con la instrucción MOV).

IP es un registro especial, es el Instruction Pointer que le dice a la CPU (junto con el registro CS) de dónde leer la próxima instrucción. Solo lo podés modificar indirectamente haciendo un salto, un call, llamando a una interrupción, etc. 

La memoria solamente se puede acceder mediante un conjunto acotado de combinaciones de registros. Para indicar un desplazamiento en un acceso a memoria se pueden combinar (sumar) cualesquiera estas tres opciones (al menos 1 de ellas):

  • BX o BP
  • SI o DI
  • inmediato

Los segmentos CS,  DS, ES y SS definen una ventana de 64Kb accesible a la memoria. El 8086 puede direccionar 1Mb de memoria pero a través de segmentos de 64Kb. Para ello utiliza un modelo de memoria segmentada donde una dirección segmentada se compone de un registro de segmento más un desplazamiento (como el indicado ahi arriba).

Luego a partir de una dirección segmentada se puede obtener la dirección efectiva como Segmento*16 + desplazamiento, teniendo en cuenta que el desplazamiento se computa módulo 65536.

  • El segmento CS es utilizado en conjunto con el registro IP para obtener la próxima instrucción a ejecutar (CS:IP)
  • El segmento SS es utilizado en conjunto con el registro SP para apuntar al tope de la pila. Ver instrucciones PUSH, POP, CALL, RET, INT, IRET
  • Los segmentos DS y ES son utilizados para almacenar y recuperar información de la memoria.
  • DS, ES y SS se pueden modificar popeandolos del stack o con mov RegSegmento, RegDePropositoGeneral
  • CS solamente se puede modificar indirectamente via CALL, JMP (y sus variantes), INT, RET, IRET

Podés usar el simulador para escribir pequeños programas e ir ejecutándolo paso a paso, viendo el contenido de los registros, memoria,etc. (tener en cuenta que el simulador no modela el largo variable de las instrucciones del 8086 y asume que cada instrucción ocupa 1 posición de memoria, esto es una simplificación y no es lo que ocurre en realidad).

Saludos,
  Gustavo