Saltar a contenido

Signed unsigned jumps

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.

Saltos condicionales y signo

  • 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”.

Notación de literales

  • 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.

Secuencias de escape útiles

  • \n salto de línea, \r retorno de carro. La barra invertida anula el significado especial del siguiente carácter: \\ imprime \, \" imprime comilla.

Cadenas estilo C

  • 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.

Conversión de tipos y promoción

  • 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.