Duda con la bandera de desbordamiento

Iniciado por .:UND3R:., 21 Noviembre 2011, 16:23 PM

0 Miembros y 1 Visitante están viendo este tema.

.:UND3R:.

Hola a todos, tengo la siguiente duda con la bandera de desbordamiento (OF)

tengo dos instrucciones:
mov ax,7FF0h
add al,10h     ; CF=1 SF=0 ZF=1 0F=0

11110000
00010000
100000000

mov al,80
add al,80       ; CF=1 SF=0 ZF=1 0F=1

10000000
10000000
100000000

Mi duda es por qué la diferencia, tengo entendido que es el resultado de un xor del bit que es acarreado a MSB con el que bit que se acarrea hacia a fuera de MSB

por lo que en ambos sería xor 1,0 (1=bit acarreado hacia afuera de MSB y 0=bit acarreado hacia MSB) por lo que en resumen en ambos casos se activaría la bandera OF

Saludos

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

_Enko

#1
Directo del manual de Intel.
Citar
The ADD instruction performs integer addition. It evaluates the result for both signed
and unsigned integer operands and sets the OF and CF flags to indicate a carry (overflow) in the signed or unsigned result, respectively

Sacamos parte del texto que esconde la respuesta
Citar

The ADD instruction performs integer addition. It evaluates the result for both signed and unsigned integer operands and sets the OF and CF respectively

Eso seria:
CARRY para  enteros positivos sin signo
OVERFLOW para enteros con signo.


80 + 80 > 128, por eso hay overflow.
Citar
char
signed: -128 to 127
unsigned: 0 to 255
Para crear el rango negativo supongo que el rango es ese:
0: -128
128: 0
255: 127
(editado: no, no lo es, ver post abajo)


Código (asm) [Seleccionar]

mov al, 255/2
add al, 1
;hay overflow, al= 128

mov al, 255
add al, 1
;hay carry, al=0


Saludos





x64core

#2
hola!
tengo una duda respecto al tema , entonces eso quiere decir que si
trabajamos con partes de un registro y aplicamos operaciones aritmeticas y si en una operacion
aritmetica hay acarreo :P entonces por lo que e visto AH no se modifica eso quiere decir que
lo tomamos y si queremos que tenga logica de una suma con acarreo,  debemos sumarle ese acarreo "manualmente"  ?

porque por lo que e visto siempre hay acarreo en las dos operaciones :P

.:UND3R:.

Ahora entiendo claramente

byte con signo: -128 a +127
bytes sin signo: 0 a 255

pero mi duda es por qué el 80 es considerado un byte con signo?

cuando es y cuando no es considerado un valor con signo o sin signo?

Saludos

PD: recién me inicio, _Enko tú lo sabes

Saludos

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

x64core

cuando el limite de un valor en binario osea el primer bit ( el bit mas significativo ) es 1
algo que me fije es que en las instrucciones de .:UND3R:., estas:

mov al,80
add al,80

80 esta en base 10 osea que en hexadecimal es 50, por eso 80h
50d = 80h ( -128 ) =  1000 0000b

_Enko corrijeme... :P

_Enko

#5
Ahora que estoy en casa, me pude armar la tabla:
Código (asm) [Seleccionar]

mov al, -128;al = 80h
mov al, -2  ;al = FEh
mov al, -1; ;al = FFh
mov al, 0   ;al = 0h
mov al, 127 ;al = 7F
mov al, 128 ;al = 80h
mov al, 255 ;al = FFh


Fijate que -128 y 128 tienen el mismo valor: 80h.
y tambien -1 y 255 valen FFh.


Ahora la respuesta a tus dos preguntas:
Es el programador quien decide como tratarlos. En el caso de un lenguaje de alto nivel como C, ya existe un tipo de dato predefinido que es con o sin signo.

En ensamblador el tipo de datos es el mismo BYTE, WORD, DWORD pero depende de como lo armes tu:

mov eax, 80h
cmp eax, 128 ;ZF set, son iguales
cmp eax, -128;ZF set, son iguales


Rara vez he usado enteros con signo. Normalmente en ensamblador se utilizan enteros positivos cosa que el valor se refleje en el registro.
Porque generalmente, cuando me ha tocado hacer algo con signo, tambien era un numero real, cosa que para eso esta la FPU.

.:UND3R:.

Ahora todo aclarado, saludos RHL y _Enko

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)