switch (expr) { case 'a': ... break; default: ... }: dirige el flujo segun el valor; default si no coincide ningun case.
break sale del bucle o switch; continue salta al siguiente ciclo; goto salta a una etiqueta (usar con cuidado); return finaliza una funcion y puede devolver valor.
for(inti=1;i<=20;i++){cout<<i;if(i%3==0)cout<<" es multiplo de 3";elsecout<<" no es multiplo de 3";cout<<endl;}
- En asm: el compilador usa idiv con divisor 3; el resto queda en edx y se prueba con test edx, edx. Si es cero se toma como multiplo.
- cdq se ejecuta antes de idiv para extender el signo y evitar fallos en divisiones con signo.
- En IDA: habilitar nombres demanglados y limpiar el grafo ayuda a leer; el decompilado (F5) puede sincronizarse para ver que cada llamada a cout ocupa varias instrucciones.
boolmultiplo_de_tres(intn){return(n%3)==0;}intmain(){inti=1;while(i<=20){cout<<i;if(multiplo_de_tres(i))cout<<" es multiplo de 3";elsecout<<" no es multiplo de 3";cout<<endl;i++;}}
- El valor bool regresa en al; el main compara ese byte para decidir que mensaje imprimir.
- El bucle while y un for generan estructuras de control muy similares en asm; al desensamblar se ven como el mismo loop con comparacion y salto condicional.
Al entrar a una funcion el call deja el return address en el stack, desalineando rsp; el compilador resta (ej. sub rsp, 38h) para reservar shadow space (4 qwords) + variables locales + padding.
El padding extra asegura que, tras el ajuste, rsp quede alineado a 16 bytes antes de cualquier call interno; algunas API de Windows fallan si no se respeta.
Shadow space: los 4 primeros qwords debajo del return address pueden almacenar temporalmente los cuatro primeros argumentos por convencion de Windows x64.
IDA permite ver el cuadro de stack estatico: return address, shadow space, variables locales y padding para alineacion.