Registros, signed/unsigned y saltos condicionales¶
Registros en x86_64: RAX, RBX, RCX, RDX tienen versiones de 32/16/8 bits (EAX/AX/AH/AL, etc.). RCX, RDI, RBP, RSP no tienen parte de 8 bits; usar máscaras si se necesitan bytes bajos. Registros extra: R8–R15. RIP apunta a la próxima instrucción; RSP al tope de la pila.
Vistas en IDA: desde la consola Python (Output) se puede leer cpu.rip, cpu.rax, cpu.eax, cpu.ax, cpu.ah, cpu.al para inspeccionar porciones del registro.
Signed: jg/jge/jl/jle (mayor/≥/menor/≤) interpretan la bandera de signo. Unsigned: ja/jae/jb/jbe (arriba/≥/abajo/≤) usan carry/borrow.
Para detectar si una comparación se hizo con signo o no, mira el salto que sigue al cmp. Ejemplo: jnb indica comparación unsigned; jg indica signed.
Demostración típica: con unsigned long long numero = 0xFFFFFFFFFFFFFFFF; if (numero < 0) ... el salto será jnb y caerá en “positivo”. Cambiando a signed (long long numero) el compilador usa jg/jge y caerá en “negativo”.
L sufijo para long, LL para long long; U/UL/ULL para unsigned; opcional pero clarifica intención. Para imprimir en hex con cout, usar formato std::hex o %X en printf-style.
Declaración: char saludo[5] = "Hola"; requiere espacio para el terminador \0 (4 letras + 1). Asignar strings después de la declaración requiere copiar carácter a carácter o funciones como strcpy.
En expresiones mixtas se promueve al tipo de mayor rango (ej., int + float convierte el int a float). Para bool, cualquier valor distinto de cero se evalúa como true.
Casting explícito: (tipo)valor. En estructuras o tipos incompatibles, castear puede ser inválido o romper datos; evitar si no es seguro.