smart.inc

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

6 comentarios en “smart.inc”

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

  2. Javier Gutiérrez Chamorro (Guti)

    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!

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

  4. 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!

Deja un comentario