Optimization, tips and tricks

Asmutils HOWTO
Prev |  | Next

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

Prev | Home | Next
Contribution guidelines |  | History