¿Qué sucede cuando el contador del programa alcanza su valor máximo?

Depende del procesador.

En algunos procesadores, se transfiere del valor máximo al mínimo en silencio. En otros procesadores, genera una excepción de alguna forma.

Famosamente, los procesadores Intel y AMD x86 diferían en este punto, que es uno de los defectos que hicieron posible hackear el XBox original.

Extractos relevantes:

Los ingenieros de Microsoft utilizaron otro truco brillante: saltan hasta el final del espacio de direcciones (que está cubierto por la ROM secreta) y apagan la ROM secreta en la última instrucción dentro del espacio de direcciones. Esta es una versión simplificada de la idea:

FFFFFFF1 mov eax, 80000880h
FFFFFFF6 mov dx, 0CF8h
FFFFFFF9 fuera dx, eax
FFFFFFFB agregar dl, 4
FFFFFFFC mov al, 2
FFFFFFFE fuera dx, al

Después de la última instrucción, el contador del programa (EIP) se desbordará a 00000000, lo que, de acuerdo con la documentación de la CPU, causa una excepción, y como no hay un controlador de excepciones configurado, causa una doble falla, lo que detendrá efectivamente la máquina .

Un hacker llamado visor, que nunca reveló su nombre real, se preguntó si el rollover a 00000000 en caso de un “hash” incorrecto de 2bl realmente causó una doble falla y detuvo la CPU. Utilizó los códigos x para escribir la instrucción de ensamblaje para “jmp 0xFFFF0000” en la ubicación de memoria 00000000 en RAM y cambió los últimos cuatro bytes en 2bl, para que la ROM secreta ejecute el código de pánico. La Xbox felizmente continuó ejecutando código a las 00000000 y dio el salto al flash.

Ahora, ¿por qué no hay doble falta? Los piratas informáticos del equipo de Xbox Linux consultaron con los empleados de AMD y explicaron que las CPU de AMD arrojan una excepción en caso de desbordamientos de EIP, pero las CPU de Intel no lo hacen.

La razón por la que las CPU Intel no lo hacen es por … cosas de la década de 1970. La ejecución en CPU x86 comienza en la parte superior del espacio de direcciones (menos 16 bytes), pero algunos fabricantes de computadoras querían tener su ROM en la parte inferior del espacio de direcciones, es decir, en 0, por lo que Intel implementó la instrucción con la codificación 0xFFFF, que es lo que obtienes al leer direcciones no conectadas a ningún chip, como NoOperation (“nop”) y hace que la CPU no arroje ninguna excepción en el caso del espacio de direcciones envolvente. De esta manera, la CPU “subiría” hasta el tope y finalmente ejecutaría el código en 0.

AMD no implementó este comportamiento, ya que ya no era necesario para cuando AMD ingresó al mercado x86 con sus propios diseños, y porque consideraban que este comportamiento era un riesgo de seguridad y solucionarlo no significaría una incompatibilidad significativa.

No mucho, en los microprocesadores más antiguos, normalmente se pasaría a cero. Suponiendo que no solo ejecutó un comando de bifurcación.

Tengo recuerdos vagos de un procesador basado en Z80 / 8080 con un espacio de memoria vacío que aparentemente ejecuta NOP en un bucle sin fin a través del espacio de direcciones completo y vuelve a cero cuando obtiene ceros como el próximo código de operación.

En los nuevos con un gran espacio de direcciones, generalmente lleva tanto tiempo que ya a nadie le importa. No he pensado en ese problema desde los años 70.

Depende.

En algunos procesadores (antiguos o hipotéticos), la PC fue incrementada por la ALU principal de la CPU, por lo que si la operación no fuera posible, se debería generar una excepción de desbordamiento normal.

Ahora cada CPU tiene una ALU dedicada a incrementar el registro de la PC, por lo que probablemente se debería generar un tipo diferente de excepción.

De todos modos, el sistema operativo debe ser advertido sobre el comportamiento inesperado y tomar las medidas apropiadas. Pero, si el sistema operativo es lo suficientemente fuerte y saludable, algo así nunca sucede porque los procesos se ubican en la memoria de una manera que no pueden alcanzar el final de los valores posibles de la PC.

Además, piense que con el límite superior de su PC de 64 bits es 2 ^ 64 – 1, lo que significa que para alcanzar el límite incrementando en uno, debe tener una memoria tan grande. Eso es loco. Y no puede hacer eso saltando a un puntero incorrecto porque, bueno, los punteros también son de 64 bits y no puede representar un número mayor que 2 ^ 64 – 1.

Tal vez pueda alcanzar esa situación en un microcontrolador, pero probablemente el compilador fallará al decir que no tiene suficiente memoria.

Por lo tanto, ese es un evento realmente hipotético, y si sucede, probablemente sea necesario reiniciar.

EDITAR: como se sugiere en los comentarios, si consideramos técnicamente la memoria virtual, podríamos asignar solo la última página de nuestro espacio virtual, con un desbordamiento de PC sin tener una memoria tan grande.

Entonces, si nos esforzamos hipotéticamente realmente podríamos llegar a tal situación. Si alguien puede hacer eso, intente, tengo curiosidad.

Cada contador alcanza una vez al máximo y vuelve al valor mínimo (en el caso de puertas lógicas)

En Java, el rango de valores enteros es -2 ^ (31) ……. A. …… 2 ^ (31 -1).

Digamos x = 2 ^ (31 -1);

x = x + 1;

Entonces el valor x será -2 ^ (31)

Explicación: cuando alcanza el valor máximo, comienza a contar desde el mínimo. Esto también se aplica a otros tipos (por ejemplo, flotante, largo, etc.)

Viceversa, si intenta restar 1 del valor mínimo del rango, dará como resultado el valor máximo.

Espero que tengas la idea.

En muchos casos, puede recibir un error devuelto como “desbordamiento de pila”.

Si no se implementa nada como esto, digamos que tiene 8 bits, como este:

1111 1110, si agrega 0000 0001 resultará 1111 1111.

Si le agrega otro 0000 0001, debería ser 1 0000 0000, pero debido a que no hay un noveno bit disponible allí (solo tiene ocho) el resultado será 0000 0000. Y después vendrá un nuevo incremento, y obtendrá 0000 0001, 0000 0010, y así sucesivamente.

Otra posibilidad es que el microcontrolador llegue al final de su lista de ejecución y se reinicie.

No mucho de nada.

El contador del programa aumenta a 0. Y la siguiente instrucción se obtiene de la ubicación 0 en el rango de direcciones.

Muchos sistemas no asignan la primera página de un rango de direcciones para capturar punteros nulos. Y esto cuenta como una excepción de puntero nulo.

More Interesting

¿Cuál es la diferencia entre una red y una red interna?

¿Podemos seleccionar los cursos de ingeniería eléctrica e informática a pesar de que tengo la admisión para la ingeniería eléctrica?

Soy estudiante de ingeniero informático. ¿Qué conocimiento debo adquirir para establecer mi camino en el campo de los sistemas integrados?

¿Cuál es la diferencia entre las clases de informática en Europa vs. América?

¿Cómo es que una computadora y un motor de búsqueda pueden operar considerando que las computadoras y los programas no son organismos vivos?

¿Podrá un estudiante de biología gestionar la ingeniería informática?

Estoy en el séptimo semestre de un B.Tech. programa en CS. Anteriormente era un ávido programador en C ++. Debido a varias razones, perdí completamente el interés. ¿Cómo puedo adquirir algunas habilidades para poder encontrar un trabajo pronto?

¿Es un curso de ingeniería informática igual en todo el mundo?

¿Cómo sería el mundo sin transistores?

¿Qué país asiático es mejor para estudiar ingeniería informática como alemán?

¿Cuál es el mejor lenguaje de programación para aprender ahora como ingeniero informático / informático en términos de oportunidades?

¿En qué se diferencia Electonics e Ingeniería Informática de Ciencias de la Computación e Ingeniería en VIT Chennai?

¿Por qué ahora vemos una tendencia de más núcleos en lugar de más GHz de las CPU?

¿Puede obtener una licenciatura en ingeniería informática y luego inscribirse en la escuela de farmacia?

Estoy haciendo una pasantía en T-Mobile. ¿Cómo me aseguro de ser un buen interno?