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
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).
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.
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.
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.
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.
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.
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.
- 1. x86 Ensamblaje: instrucción INC y DEC y indicador de desbordamiento
- 2. compruebe si el indicador de acarreo está establecido
- 3. Ensamblaje - instrucción shr encender bandera de acarreo?
- 4. Asamblea - Llevar la bandera VS indicador de desbordamiento
- 5. ¿Por qué CMP (comparar) a veces establece una bandera de acarreo en el ensamblaje 8086?
- 6. ¿Por qué cmp 0x84,0x30 activa el indicador de desbordamiento?
- 7. Agregando dos números de 64 bits en el ensamblaje
- 8. Banderas de desbordamiento y transporte en Z80
- 9. WPF ToolBar: cómo eliminar el agarre y el desbordamiento
- 10. Permitir el desbordamiento en el eje y mientras se oculta el desbordamiento en el eje x
- 11. Indicador de desbordamiento de texto de Android TextView?
- 12. Anticipar el desbordamiento factorial
- 13. Descifrando y comprendiendo el código de ensamblaje
- 14. ejemplo de desbordamiento de búfer del libro Art of Exploitation
- 15. desbordamiento y texto desbordamiento dentro fieldsets
- 16. ¿De qué depende el indicador preg_match_all `u`?
- 17. problemas con el indicador can_upload
- 18. En el ensamblaje x86, ¿cómo se puede establecer el indicador de cero (ZF) sin realizar una operación de comparación?
- 19. desbordamiento incorrecto recorte en el elemento con la frontera de radio sobre el Opera
- 20. indicador mktime y tm_isdst
- 21. Objetos CF vs objetos NS
- 22. ¿Es seguro cambiar el nombre y copiar un ensamblaje?
- 23. border-radius; desbordamiento: oculto, y el texto no está recortado
- 24. Aplicaciones Delphi y el indicador de encabezado TSAWARE
- 25. actionbar indicador de progreso y refrescar el botón
- 26. ¿Cómo establecer el valor predeterminado para POCO en EF CF?
- 27. Asamblea ADC (Agregar con acarreo) a C++
- 28. Easy_install of wxpython tiene el error "setup script"
- 29. position: relative, desbordamiento: los padres y el niño escondido absoluta
- 30. Javascript - indicador de carga/ocupado o div transparente sobre la página en el evento clic
de modo que 'de cualquier manera es posible', pero el código de ensamblaje elige el más 'significativo' (el que tiene sentido) – Pwn
Para los números con signo, el bit más significativo NO significa "gran negativo", solo "negativo". – MarcH
Debemos notar que CF también se puede usar como [Borrow Bit] (http://en.wikipedia.org/wiki/Carry_flag) – Tony