En el ensamblaje x86, el indicador de desbordamiento se establece cuando una operación add
o sub
en un entero con signo se desborda y el indicador de acarreo se establece cuando una operación en un entero sin signo se desborda.x86 Ensamblaje: instrucción INC y DEC y indicador de desbordamiento
Sin embargo, cuando se trata de las instrucciones inc
y dec
, la situación parece ser algo diferente. De acuerdo con este website, la instrucción inc
no afecta en absoluto a la bandera de acarreo.
Pero no puedo encontrar ninguna información sobre cómo inc
y dec
afectan el indicador de desbordamiento, si es que lo hace.
¿inc
o dec
establece el indicador de desbordamiento cuando ocurre un desbordamiento de enteros? ¿Y este comportamiento es el mismo para los enteros con y sin signo?
============================= EDITAR ============== ===============
Bien, esencialmente el consenso aquí es que INC y DEC deberían comportarse igual que ADD y SUB, en términos de indicadores de configuración, con la excepción de la bandera de llevar. Esto también es lo que dice en el manual de Intel.
El problema es que realmente no puedo reproducir este comportamiento en la práctica, cuando se trata de enteros sin signo.
Consideremos el siguiente código de montaje (usando GCC ensamblado en línea para que sea más fácil para imprimir los resultados.)
int8_t ovf = 0;
__asm__
(
"movb $-128, %%bh;"
"decb %%bh;"
"seto %b0;"
: "=g"(ovf)
:
: "%bh"
);
printf("Overflow flag: %d\n", ovf);
Aquí disminuir un valor de 8 bits con signo de -128. Como -128 es el valor más pequeño posible, un desbordamiento es inevitable. Como era de esperar, esto imprime: Overflow flag: 1
Pero cuando hacemos lo mismo con un valor sin signo , el comportamiento no es como yo esperaba:
int8_t ovf = 0;
__asm__
(
"movb $255, %%bh;"
"incb %%bh;"
"seto %b0;"
: "=g"(ovf)
:
: "%bh"
);
printf("Overflow flag: %d\n", ovf);
Aquí Valor mínimo de un valor sin signo de 8 bits de 255. Dado que 255 es el mayor valor posible, un desbordamiento es inevitable. Sin embargo, esto se imprime: Overflow flag: 0
.
¿Huh? ¿Por qué no configuró el indicador de desbordamiento en este caso?
Excepto 'add' también establece el indicador de desbordamiento si ocurre un desbordamiento de enteros, pero hasta donde puedo ver,' inc' no hace lo mismo. Ver mi pregunta editada para el código de ensamblaje que demuestra esto. – Channel72
@ Channel72 entiende banderas incorrectamente. CF significa llevar a cabo MSB (byte más significativo) como '1111 1111 + 1 = 1 | 0000 0000' CF aquí. CF significa operación inválida (desbordamiento) sin firmar. (porque es 256, que no puede caber en 'byte'). Pero es una operación firmada bastante válida (-1 + 1 = 0). OF es cuando carry es a MSB, como '0111 1111 + 1 = 1000 0000' Esto significa op firmado y no firmado válido firmado (127 + 8 = -128 ups, esto es desbordamiento en caso de firmarse, porque el rango es -128; 127) – Andrey