De TASM, Turbo Assembler, recuerdo una directiva que me encantaba, era SMART, y la agregaba a todos mis programas, porque increíblemente, no se podía activar desde la linea de comandos.
El modo SMART, realizaba ciertas optimizaciones sobre el código ensamblador, por ejemplo era capaz de convertir algo como:
shr ax, 2 |
En:
shr ax, 1 shr ax, 1 |
Os parecerá una absurdidad, pero lo cierto es que los procesadores anteriores al 80188 y 80186, como los 8086 y 8088, sólo permitían realizar desplazamientos de bits de una posición. Lo que hacía TASM cuando el procesador de destino no soportaba esa operación, era transparentemente transformarlo. Así no teníamos que preocuparnos por el procesador para el que ensamblábamos en nuestro código, Turbo Assembler lo haría por nosotros.
Claro que siendo buenos programadores, sabíamos que en realidad´los 8086 sí que podían desplazar más de un bit, y para ello usaban el registro CL, algo como:
mov cl, 2 shr ax, cl |
En todo caso, esa es otra historia, y además por aquellos días, más lenta que ejecutar dos desplazamientos. Así que aprovechando UPTIME con ASMC, en el que me he sentido muy bien acogido, he creado smart.inc, un archivo de inclusión para JWASM, UASM y ASMC, que debería ser compatible con MASM, y que realiza esa conversión de TASM cuando es necesario.
He aprovechado para hacer lo mismo con movzx, una transformación que los chicos de Borland nunca llegaron a implementar, aunque por contra, no he sido capaz de conseguir emular mi favorita: fastimul. Entre otras, me faltarán también setflag, testflag, flipflag, clrflag, maskflag, setfield y getfield, pero todo se empieza por algo.
; SMART.INC-- ;8086 if ((@cpu and 0xFF) eq 1) option renamekeyword: <shl>[email protected]@shl shl macro reg, val ifidni <val>, <cl> @@shl reg, val else repeat val @@shl reg, 1 endm endif endm option renamekeyword: <shr>[email protected]@shr shr macro reg, val ifidni <val>, <cl> @@shr reg, val else repeat val @@shr reg, 1 endm endif endm option renamekeyword: <sal>[email protected]@sal sal macro reg, val ifidni <val>, <cl> @@sal reg, val else repeat val @@sal reg, 1 endm endif endm option renamekeyword: <sar>[email protected]@sar sar macro reg, val ifidni <val>, <cl> @@sar reg, val else repeat val @@sar reg, 1 endm endif endm option renamekeyword: <rol>[email protected]@rol rol macro reg, val ifidni <val>, <cl> @@rol reg, val else repeat val @@rol reg, 1 endm endif endm option renamekeyword: <ror>[email protected]@ror ror macro reg, val ifidni <val>, <cl> @@ror reg, val else repeat val @@ror reg, 1 endm endif endm option renamekeyword: <rcl>[email protected]@rcl rcl macro reg, val ifidni <val>, <cl> @@rcl reg, val else repeat val @@rcl reg, 1 endm endif endm option renamekeyword: <rcr>[email protected]@rcr rcr macro reg, val ifidni <val>, <cl> @@rcr reg, val else repeat val @@rcr reg, 1 endm endif endm endif ;Lower than 386 if ((@cpu and 0xFF) lt 1000b) option renamekeyword: <movzx>[email protected]@movzx movzx macro reg, val ifidni <reg>, <ax> xor ah, ah mov al, val elseifidni <reg>, <bx> xor bh, bh mov bl, val elseifidni <reg>, <cx> xor ch, ch mov cl, val elseifidni <reg>, <dx> xor dh, dh mov dl, val endif endm endif |
Me parece muy buena idea y una de las cosas que, por desgracia, menos se suele hacer en programación, o sea: hacer aplicaciones compatibles con plataformas anteriores, y no solo para lo que se usa ahora, que es lo más fácil y lo menos complicado.
por cierto, es una coña eso del comomeinformo 😀
Sí, y admito que lo fácil, es marginar a usuarios que no disponen del último hardware, o del último software bianamaran. Esa es una de las formas en que hacer que el mercado tire artificialmente.
¡No entendí lo del comomeinformo!
es verdad, asi obligamos a los usuarios a adquirir lo último…
Cada vez que se accede a un link de tu blog se abre una ventana a http://www.comomeinformo.com 😀 No se si lo habras puesto tu, o es un virus, pero me extraña porque es con el Opera Mobile y no creo que el mobile coja virus.
Gracias bianamaran. Creo que es un tipo de publicidad nueva de Double Click ADX. Voy a revisarlo.