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