6. Optimization, tips and tricks

In fact optimization must be done by assembler.. but.. optimizing assembler is just a sweet dream yet. So, I've took care of it. By default code is optimized for size, and you can get up to 20% smaller executable; speed optimization in fact is a fake, it's just an absence of size optimization :), though theoretically you can gain something on pentium processors.. To enable speed optimization set OPTIMIZE to SPEED in MCONFIG. Optimization touches register assignment, addition and subtraction (_mov, _add, _sub macros), and section alignment (CODESEG, DATASEG macros). Optimization is a work in progress, so results may be better in future versions.

If you've gone crazy on binary size, you may want to use some of things described below.

First of all, try to keep your program in one CODESEG (.text) section. Remember, every new section (even if it is empty) increases size of executable file. Unless you have any read-write data, do not create DATASEG (.data section), keep your data in CODESEG. Even if you've got one/two variables with assigned initial values, first think of keeping them dynamically on the stack instead of creating DATASEG. And if your initial value is zero, place such variable in UDATASEG (.bss) section, it will be zeroed out by kernel.

Use _mov macro instead of mov instruction (if you do not just assign one register to another), this will track several special cases and probably produce smaller code.

Avoid using 16-bit registers (ax, bx, cx, etc) unless you know exactly what you're doing. Every 16-bit instruction will take one more byte (0x66 prefix). For instance, inc ax will produce greater code than inc eax.

As a sample, here are some assembly examples you can use instead of cmp instruction to produce smaller code:

;if eax < 0 (signed compare)

	test	eax,eax
	js	is_less

;if eax == 0

	test	eax,eax
	jz	is_zero

;if eax == 0

	or	eax,eax
	jz	is_zero

;if eax == 1		(and you no more care of its value)

	dec	eax
	jz	is_one

;if eax == 2		(and you no more care of its value)

	dec	eax
	dec	eax
	jz	is_one


;if eax == -1		(and you no more care of its value)

	inc	eax
	jz	is_minus_one

;if eax == -2		(and you no more care of its value)

	inc	eax
	inc	eax
	jz	is_minus_one


;if -128 < value < 128, you can use

	cmp	eax,byte value ;or -value

;instead of
	cmp	eax,value
Seek, and you may find more..