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
shl macro reg, val
ifidni ,
@@shl reg, val
else
repeat val
@@shl reg, 1
endm
endif
endm
option renamekeyword: =@@shr
shr macro reg, val
ifidni ,
@@shr reg, val
else
repeat val
@@shr reg, 1
endm
endif
endm
option renamekeyword: =@@sal
sal macro reg, val
ifidni ,
@@sal reg, val
else
repeat val
@@sal reg, 1
endm
endif
endm
option renamekeyword: =@@sar
sar macro reg, val
ifidni ,
@@sar reg, val
else
repeat val
@@sar reg, 1
endm
endif
endm
option renamekeyword: =@@rol
rol macro reg, val
ifidni ,
@@rol reg, val
else
repeat val
@@rol reg, 1
endm
endif
endm
option renamekeyword: =@@ror
ror macro reg, val
ifidni ,
@@ror reg, val
else
repeat val
@@ror reg, 1
endm
endif
endm
option renamekeyword: =@@rcl
rcl macro reg, val
ifidni ,
@@rcl reg, val
else
repeat val
@@rcl reg, 1
endm
endif
endm
option renamekeyword: =@@rcr
rcr macro reg, val
ifidni ,
@@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
movzx macro reg, val
ifidni ,
xor ah, ah
mov al, val
elseifidni ,
xor bh, bh
mov bl, val
elseifidni ,
xor ch, ch
mov cl, val
elseifidni ,
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.
Yes, and I admit that the easy thing is to marginalize users who do not have the latest hardware, or the latest bianamaran software . That’s one of the ways to make the market pull artificially.
I didn’t understand how I report!