2009-04-27 20 views
23

Se sabe que CF indica la ejecución sin firmar y OF indica el desbordamiento firmado. Entonces, ¿cómo un programa ensamblador diferencia entre los datos sin firmar y los firmados ya que es solo una secuencia de bits? (¿A través del almacenamiento de memoria adicional para información de tipo, o a través de información posicional o de otra manera?) ¿Y podrían estas dos banderas usarse indistintamente?sobre el ensamblaje CF (acarreo) y el indicador OF (desbordamiento)

Respuesta

32

La distinción está en qué instrucciones se utilizan para manipular los datos, no en los datos en sí. Las computadoras modernas (desde alrededor de 1970) usan una representación de datos enteros llamados complementos de dos en los que la suma y la resta funcionan exactamente igual en números firmados y no firmados.

  • La diferencia en la representación es la interpretación dada al bit más significativo (también llamado el bit de signo ). Para números sin signo ese bit significa un número positivo muy grande; para los números con signo que significa un número negativo muy grande (número negativo con un gran valor absoluto).

  • Las instrucciones diferentes pueden utilizar interpretaciones diferentes del mismo bit. Por ejemplo, la mayoría de las máquinas grandes tienen instrucciones de multiplicación tanto firmadas como no firmadas. Las máquinas con una instrucción 'set less than' pueden tener sabores firmados y no firmados.

  • La OF (bandera de desbordamiento) indica si un acarreo ha volteado el signo del bit más significativo en el resultado para que sea diferente de los bits más significativos de los argumentos. Si los números se interpretan como sin signo, el indicador de desbordamiento es irrelevante, pero si se interpretan como firmados, OF significa, por ejemplo, que se agregaron dos números positivos grandes y el resultado fue negativo.

  • El CF (indicador de acarreo) indica si un bit se realizó completamente con la palabra (por ejemplo, en el bit 33 o el bit 65). Si los números se interpretan como unsigned, carry flag significa que la suma se desborda y el resultado es demasiado grande para caber en una palabra de máquina. El indicador de desbordamiento es irrelevante.

La respuesta a su pregunta es que el código de montaje tiene varias maneras de distinguir firmado a partir de datos sin signo:

  • Se puede elegir cualquiera de CF o que hacer comparaciones firmado o sin firmar.
  • Puede elegir entre multiplicar con signo o sin signo y dividir instrucciones.
  • Puede elegir un desplazamiento a la derecha con signo o sin signo (copia firmada de bit alto, cambios sin signo en ceros).
+0

de modo que 'de cualquier manera es posible', pero el código de ensamblaje elige el más 'significativo' (el que tiene sentido) – Pwn

+7

Para los números con signo, el bit más significativo NO significa "gran negativo", solo "negativo". – MarcH

+0

Debemos notar que CF también se puede usar como [Borrow Bit] (http://en.wikipedia.org/wiki/Carry_flag) – Tony

-3

Creo que se basa en la operación que está utilizando que determina qué indicador usar. P.ej. agregar firmado vs sin signo. Así que supongo que puedes jugar con la memoria con cualquier comando que desees.

1

Por lo general, los programas de ensamblaje no incluyen información especial con variables que indiquen si están firmadas o no. El trabajo del programador es saber cuándo marcar qué banderas y cuándo usar qué condiciones (es decir, usar JA en lugar de JG).

Así que debe saber qué tipo de variable está a punto de trabajar para saber qué comandos usar. Esta es la razón por la cual la mayoría de los lenguajes de programación dan advertencias cuando los programadores usan tipos con signo/sin signo indistintamente (es decir, sin un molde explícito), ya que esto se puede hacer en el hardware pero puede producir resultados inesperados.

4

No es así. Las banderas simplemente se configuran cada vez que ocurre la condición. Se supone que el programador debe saber con qué tipos de datos está trabajando y, a partir de ese momento, saber qué indicador debe examinar si le importa.

5

Existen diferentes códigos de operación para tratar con datos firmados y no firmados. Si un programa quiere comparar dos enteros con signo, que utiliza los códigos de operación jl, jle, jg y jge, donde el lyg representan l ess y g reater respectivamente. Si un programa quiere comparar dos enteros sin signo, que utiliza los códigos de operación jb, jbe, ja y jae, en el que a y b son un Bove y b elow respectivamente. La e significa 'o igual a' en todos los casos. Estos códigos de operación se utilizan para la bifurcación en función de una comparación.

De manera similar, también están las instrucciones setCC, que establecen un byte a 0 o 1 según una comparación. Estas funciones son idénticas: hay setl, setle, setg, setge, setb, setbe, seta, setae y más.

Los códigos de operación firmados prueban los indicadores ZF, OF y SF. Los códigos de operación sin firmar prueban los indicadores ZF, CF y SF. Consulte las secciones del Manual de referencia del programador 80386 en las instrucciones JCC y las instrucciones setCC para ver las condiciones exactas probadas.

3

No hay forma de pedirle a la CPU que pruebe y devuelva el tipo de byte/palabra/longitud.

0xFF puede contener "255" o "-1", todo depende del tipo de byte que su programa dice que es.

Las construcciones tales como "tipo", "signess", etc. solo existen en lenguajes de nivel superior como Java y no en el nivel de la CPU. Al final todo es un byte para la CPU, depende de nuestros programas organizar y saber cómo interpretar y manipular estos valores ...

Los indicadores de CPU que se encuentran en el estado no imponen ningún paradigma que corresponda su código para probar y reaccionar en consecuencia.

En las CPU Intel, los registros MMX y FPU en realidad ocupan los mismos registros. Por lo tanto, es imposible mezclar instrucciones tipo FPU y MMX al mismo tiempo, porque los valores de una operación arruinarán la otra. Los programas que necesitan, o bien completan sus acciones en un modo, por ejemplo, emitiendo instrucciones FPU y luego pueden iniciar MMX pero nunca ambos al mismo tiempo.

16

No intente codificar el signo. Eso es imposible. En cambio, solo trata de darte cuenta de la verdad: no hay señal. Entonces verá que no es el tipo de signo lo que lo diferencia, es solo usted mismo.

Cuestiones relacionadas