tutorial snowman pro online disassembler boomerang c assembly x86 decompiling

c - snowman - ida pro



¿Por qué GCC mueve las variables a una ubicación temporal antes de asignarlas? (1)

La mayoría de las instrucciones x86 (distintas de algunas instrucciones especializadas como movsb ) solo pueden acceder a una ubicación de memoria. Por lo tanto, un paso de la memoria a la memoria requiere pasar por un registro con dos instrucciones mov .

La instrucción mov se puede usar de las siguientes maneras:

mov mem, reg mov reg, mem mov reg, reg mov reg, imm mov mem, imm

No hay mov mem, mem .

Tenga en cuenta que si ha compilado con optimizaciones, las variables se colocarán en registros, por lo que esto no sería un problema.

Cuando miro un código C descompilado, vi esto:

movl -0xc(%rbp), %esi movl %esi, -0x8(%rbp)

Esto corresponde a este código C:

x = y;

Esto me hizo pensar: ¿cómo es que gcc mueve y a %esi y luego mueve %esi a x lugar de simplemente mover y a x directamente?

Este es el código completo de C y descompilado, si es importante:

do

int main(void) { int x, y, z; while(1) { x = 0; y = 1; do { printf("%d/n", x); z = x + y; x = y; y = z; } while(x < 255); } }

Descompilado

pushq %rbp movq %rsp, %rbp subq $0x20, %rsp movl $0x0, -0x4(%rbp) movl $0x0, -0x8(%rbp) ; x = 0 movl $0x1, -0xc(%rbp) ; y = 1 ; printf leaq 0x56(%rip), %rdi movl -0x8(%rbp), %esi movb $0x0, %al callq 0x100000f78 ; z = x + y movl -0x8(%rbp), %esi ; x -> esi addl -0xc(%rbp), %esi ; y + esi movl %esi, -0x10(%rbp) ; z = esi ; x = y movl -0xc(%rbp), %esi movl %esi, -0x8(%rbp) ; y = z movl -0x10(%rbp), %esi movl %esi, -0xc(%rbp) movl %eax, -0x14(%rbp) ; not sure... I believe printf return value? cmpl $0xff, -0x8(%rbp) ; x < 255 jl 0x100000f3d ; do...while(x < 255) jmp 0x100000f2f ; while(1)