2012-04-11 72 views
5

Si entiendo esto correctamente, el contador del programa apunta a la dirección de la instrucción a ejecutar y en la mayoría de los casos agrega cuatro al contador del programa para avanzar a la siguiente dirección de instrucción. Pero supongamos que tiene un contador de programa que apunta a una palabra (por ejemplo, la palabra 15) en la memoria y desea avanzar a la siguiente instrucción, ¿se supone que debe sumar 4 directamente a 15 para obtener la siguiente instrucción? Cualquier explicación sería apreciada¿Contador de programa?

Respuesta

6

Eso se llama puntero de instrucción. Una vez que el procesador decodifica la instrucción actual, encuentra cuántos bytes ocupa y sabe cuánto agregar al valor del puntero de la instrucción actual para pasar a la siguiente instrucción, de modo que cuando se ejecute la instrucción actual, el procesador sepa qué hacer a continuación.

Entonces, por ejemplo, el procesador comienza con el puntero de instrucción que almacena el valor 15 como en su ejemplo - parece que sucede en esa dirección, sucede que hay una instrucción ocupando 5 bytes, no hay problema - agrega 5 al valor actual y esto rinde 20 y entonces el puntero de instrucción ahora almacena el valor 20 y el procesador luego ejecuta la instrucción actual.

+1

Su ejemplo tiene sentido, pero ¿de dónde viene PC + 4 si lo que agrega depende de cuál es esa dirección? – Ockham

+1

@ user28694: Esto dependerá de un procesador. Algunos procesadores tienen el conjunto de instrucciones donde todas las instrucciones tienen la misma longitud, por lo que pueden +4 incondicionalmente. Algunos procesadores tendrán instrucciones de longitud variable y decidirán con qué instrucción tratarán utilizando los primeros bytes de la instrucción. – sharptooth

+0

¿No son [las instrucciones MIPS de 32 bits de longitud] (http://en.wikipedia.org/wiki/MIPS_architecture#MIPS_I_instruction_formats)? –

2

Nunca avanza el contador del programa directamente - La CPU lo hace por usted mediante la ejecución de su programa. Como programador, usted manipula el contador del programa ejecutando varias instrucciones de salto (condicional, incondicional, salta a subrutina, etc.). Un caso específico cuando necesita agregar un desplazamiento al contador del programa es cuando se bifurca en código independiente de posición. Sin embargo, incluso en este caso, no agrega el tamaño de la instrucción al contador del programa: en su lugar, proporciona el desplazamiento del lugar al que desea saltar ejecutando una "dirección de rama a relativa".

+0

¿Qué tal cuando estamos escribiendo un gestor de arranque que saltará al código de la aplicación que se encuentra en la dirección absoluta 0x4000? En este caso, cambiaremos directamente el contador del programa a la dirección absoluta. – eepty

+0

@eepty Eso es lo que dice la segunda oración: lo estás haciendo con una instrucción de salto, no con una instrucción de ajuste de registro. – dasblinkenlight

Cuestiones relacionadas