Optimización de código ensamblador

Me topé con una practica curiosa, que me hizo aprender bastante acerca de las partes bajas y altas de los registros. El tema es que me solicitaban que cierto código ensamblador proporcionado en una actividad ocupase menos de 50 bytes en código maquina y no contuviese ceros. Por lo que tuve que trastear con aprovechar al máximo los registros y usar los mas pequeños posibles.

También aprendí que setear a 0 un registro es mas costoso en bytes que hacer «xor registro, registro».
Y con esas dos cosillas, y suprimir la llamada a exit por ahorrar unos bytes… voilá.

¿Serías capaz de bajar más los bytes de código maquina sin perder funcionalidad?

RegistroDescripciónParte bajaParte alta
raxAcumulador, se usa para operaciones aritméticas, syscallsal (8 bits)ah (8 bits)
rbxUsado para operaciones generales, no se suele tocar en syscallsbl (8 bits)bh (8 bits)
rcxContador, se usa para ciclos y desplazamientoscl (8 bits)ch (8 bits)
rdxUsado para operaciones de multiplicación, división y para syscallsdl (8 bits)dh (8 bits)
rdiPrimer argumento para syscalls (y funciones C)dil (8 bits) 
rsiSegundo argumento para syscalls (y funciones C)sil (8 bits) 
rbpPuntero a la base del marco de la pila (stack frame)bpl (8 bits) 
rspPuntero a la cima de la pila  
r8 – r15Registros adicionales para usar en funciones o syscallsr8b – r15b (8 bits)r8w – r15w (16 bits)


Deja un comentario

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

Scroll al inicio