Saltar al contenido

Ensamblaje x86: instrucción INC y DEC y bandera de desbordamiento

El tutorial o código que encontrarás en este artículo es la resolución más fácil y válida que hallamos a esta duda o problema.

Solución:

El indicador de desbordamiento se establece cuando una operación provocaría un cambio de signo. Su código está muy cerca. Pude configurar el indicador OF con el siguiente código (VC++):

char ovf = 0;

_asm 
    mov bh, 127
    inc bh
    seto ovf

cout << "ovf: " << int(ovf) << endl;

Cuando se incrementa BH, el MSB cambia de 0 a 1, lo que hace que se establezca OF.

Esto también establece el OF:

char ovf = 0;

_asm 
    mov bh, 128
    dec bh
    seto ovf

cout << "ovf: " << int(ovf) << endl;

Tenga en cuenta que el procesador no distingue entre números con y sin signo. Cuando usa la aritmética de complemento a 2, puede tener un conjunto de instrucciones que manejan ambos. Si desea probar el desbordamiento sin firmar, debe usar la bandera de acarreo. Dado que INC/DEC no afecta la bandera de acarreo, debe usar ADD/SUB para ese caso.

Manuales para desarrolladores de software de las arquitecturas Intel® 64 e IA-32

Mire el manual apropiado Referencia del conjunto de instrucciones, AM. Cada instrucción está documentada con precisión.

Aquí está la sección INC sobre las banderas afectadas:

La bandera CF no se ve afectada. Los indicadores OF, SZ, ZF, AZ y PF se establecen según el resultado.

intente cambiar su prueba para pasar el número en lugar de codificarlo, luego tenga un bucle que pruebe los 256 números para encontrar el que afecta la bandera. O haga que el asm realice el ciclo y salga cuando llegue a la bandera o cuando regrese al número con el que comenzó (comience con algo que no sea 0x00, 0x7f, 0x80 o 0xFF).

EDITAR

.globl inc
inc:
    mov $33, %eax

top:
    inc %al
    jo done
    jmp top

done:
    ret

.globl dec
dec:
    mov $33, %eax

topx:
    dec %al
    jo donex
    jmp topx

donex:
    ret

Inc se desborda cuando pasa de 0x7F a 0x80. dec se desborda cuando pasa de 0x80 a 0x7F, sospecho que el problema está en la forma en que usa el ensamblador en línea.

Comentarios y calificaciones del tutorial

Nos encantaría que puedieras comunicar este post si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *