En ese caso, el número máximo que podemos representar (sin truncar) es:
\( 16(16^4-1)+16^4-1=16^5+16^4-17 \)
que truncado queda:
\( 16^4-17=65519 \)
De acuerdo. De hecho, es la dirección absoluta que señalé en mi mensaje anterior (la
FFEF).
Entonces para \( n\leq 65519 \) a las representaciones anteriores habría que añadir, las de \( n+16^5 \).
De acuerdo.
Y ahora el razonamiento sería análogo.
Es análogo pero creo que hay que tener un poco de cuidado.
Tendríamos:
\( n+16^5=16c+r \) con \( 0\leq r<16 \)
y de ahí representaciones de la forma:
\( 16(c-x)+(r+16x) \)
con \( 0\leq x\leq 16^3-1 \) (ahora está asegurado que \( c>16^3-1 \), porque estamos trabajando con \( n+16^5 \)).
El problema que yo veo ahí es que ese \( c \) que se obtiene por el algoritmo de la división podría ser de 5 dígitos. Y entonces, por ejemplo, cuando cuentas la representación que se obtiene para \( x=0 \), estarías contando una representación inválida porque el número de segmento tendría 5 dígitos y eso no puede ser (tanto segmento como desplazamiento son de 4 dígitos). Lo hago con el ejemplo de mi mensaje anterior: la dirección
FFEF. Queremos contar las representaciones de \( n+16^5 \), o sea,
FFEF+
100000=
10FFEF. La igualdad
\( n+16^5=16c+r \) con \( 0\leq r<16 \)
en hexadecimal sería:
10FFEF =
10 *
10FFE +
F. O sea que \( c \) en este caso sería
10FFE que es de 5 dígitos. Cuando se consideran representaciones del tipo:
\( 16(c-x)+(r+16x) \)
con el ánimo de que \( c-x \) sea el segmento, y \( r+16x \) el desplazamiento, hay que fijarse bien en la cota inferior de \( x \). Por ejemplo, para \( x=0 \) se estaría contando la dirección segmentada
10FFE:
F que no es válida pues el segmento tiene 5 cifras (por tanto, no "cabe" en 16 bits que son 4 dígitos hexadecimales).
Muchas gracias por tu ayuda, el_manco. La verdad es que a mí me habían abrumado todos estos detalles, pero tu planteo me ha dejado claro el camino. La pregunta que debo contestar es:
En Intel 8086, ¿cuántas combinaciones de valores diferentes de segmento y desplazamiento pueden utilizarse para referenciar la misma dirección de memoria?. A priori, me parecía una cuenta sencilla, pero cuando lo empecé a pensar en realidad es bastante más complejo de lo que creí. Así que empecé a navegar por la Web buscando una respuesta y no me terminó de convencer ninguno de los sitios que leí. Y aquí es cuando uno constata (no sin un dejo de tristeza) el poco rigor matemático que tienen los informáticos aún en los cálculos más elementales

.