2011-08-03 19 views
5

En el conjunto de instrucciones x86, el bit en el índice 1 puede ser el bit de dirección que especifica cuáles son los operandos de origen y de destino o puede ser un bit de extensión de signo. Me pregunto cuál es la forma lógica más fácil de determinar cuál de estos casos es. ¿Hay alguna forma de verificar que no sea verificar los códigos de operación de la instrucción y compararlos para descubrir cuál es (para las variantes de extensión de signo o de bit de dirección de las instrucciones)? También hay instrucciones que hacen caso omiso de este bit, pero dado que se establece en 0, en realidad no importa.Dirección/Signo Extender bit en conjunto de instrucciones x86

EDITAR: Resulta que para las fallas de escritura (que es para lo que estaba destinado mi código), reg-> r/m es siempre el caso porque una instrucción r/m-> reg nunca disparará un error de escritura. Pero cualquier información aún sería agradable en caso de que alguien más se encuentre con un problema similar.

+0

Sí, eso era lo que estaba tratando de evitar, pero si no puedo conseguir una mejor solución, entonces es con lo que voy a tener que ir. –

Respuesta

2

[Comentario realizado en respuesta].

Obviamente necesita una fórmula booleana sobre la secuencia de bytes de instrucciones. No sabría cómo definir esa fórmula fácilmente; el x86 tiene un conjunto de instrucciones realmente complicado. Esperaría que el truco clave sea buscar el byte del código de operación en una tabla determinada por los bytes del prefijo. Si está escribiendo algún tipo de desensamblador, espero que tenga esas tablas de todos modos.

+0

Si realmente no puedo encontrar una mejor respuesta, supongo que me iré con esto, por ahora voy a esperar y ver si alguien más tiene alguna idea. –

0

Los bits de dirección y de signo son parte del registro de banderas de los procesadores x86. Como los ocho bits más bajos de las banderas tienen el mismo diseño que las banderas de 8080/8085/Z80, creo que el bit en el índice 1 es el bit firmado. La posición del bit de dirección no ha cambiado desde que se introdujo con los procesadores 8086/88 a finales de los 70, si me sirve la memoria.

El bit de bit de signo se modifica como resultado de una operación aritmética y es una copia del bit más alto del resultado de la operación. INC y DEC no afectan el bit de signo.

El bit de dirección se manipula con la instrucción cld/std y controla si las instrucciones de bloque (cmps, ins, lods, movs, outs, scas y stos) aumentan/decrecentrada.

También pueden ser manipulados a través de la pila (aunque esto no es quizás significativo con el bit de signo)

pushf 
and dword ptr [esp],SOME_MASK 
popf 

El uso de "y" es un ejemplo: OR, XOR y otros también pueden ser utilizados.

Si manipula el indicador, es posible que deba restaurarlo a su valor anterior, ya que algunas bibliotecas en tiempo de ejecución asumen que no se ha modificado.

+0

Creo que OP está hablando un poco que le dice al procesador si la información va a los registros, o a la memoria, no al bit de dirección de las banderas. –

+0

Si entendí mal la pregunta, siempre está el [Manual del desarrollador de software de arquitectura Intel, Volumen 2] (http://download.intel.com/design/intarch/manuals/24319101.pdf) donde el Apéndice A contiene un mapa de código de operación. –

+0

Sí, este es el bit de dirección que especifica los operandos de instrucción ya sea reg-> r/m o r/m-> reg –

Cuestiones relacionadas