assembly - negative - sobre el ensamblaje CF(Carry) y OF(Overflow) flag
registro flags (6)
Existen diferentes códigos de operación para tratar con datos firmados y no firmados. Si un programa desea comparar dos enteros con signo, utiliza los jle
jl
, jle
, jg
y jge
, donde l y g representan l ess y g reater, respectivamente. Si un programa desea comparar dos enteros sin signo, utiliza los jbe
jb
, jbe
, ja
y jae
, donde a y b representan 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.
Del mismo modo, también existen las instrucciones setCC
, que establecen un byte a 0 o 1 dependiendo de una comparación. Estas funciones son idénticas: hay setl
, setle
, setg
, setge
, setb
, setbe
, seta
, setae
y otros.
Los códigos de operación firmados prueban las banderas 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 de JCC y las instrucciones setCC para las condiciones exactas probadas.
Se sabe que CF indica la ejecución sin firmar y OF indica el desbordamiento firmado. Entonces, ¿cómo diferencia un programa ensamblador entre los datos sin firmar y los firmados, ya que solo se trata de 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?
La distinción es 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 bit de signo ). Para números sin signo ese bit significa un número positivo muy grande. Para números con signo, significa un número negativo con cualquier valor absoluto grande o pequeño.
Diferentes instrucciones pueden usar diferentes interpretaciones 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.
El OF (indicador 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 ensamblado tiene varias formas de distinguir los datos firmados de los no firmados:
- Puede elegir CF o OF para hacer comparaciones con o sin firma.
- Puede elegir multiplicación con signo o sin signo y dividir instrucciones.
- Puede elegir un desplazamiento a la derecha con signo o sin signo (copias firmadas del bit alto, cambios sin signo en ceros).
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.
No hay forma de pedirle a la CPU que pruebe y devuelva el tipo de byte / palabra / largo.
0xFF puede contener "255" o "-1", todo depende del tipo de byte que su programa dice que es.
Las construcciones tales como "tipo", "firma", 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, depende de su código probarlo y reaccionar en consecuencia.
En las CPU de 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.
No intentes 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.
Por lo general, los programas de ensamblaje no incluyen información especial con variables que indiquen si están firmadas o sin firmar. El trabajo del programador es saber cuándo marcar qué banderas y cuándo usar qué condicionales (es decir, usar JA en lugar de JG).
Por lo tanto, 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 de manera intercambiable (es decir, sin un molde explícito), ya que esto se puede hacer en el hardware pero puede producir resultados inesperados.