Ähm... möglicherweise war diese Erklärung etwas _zu_ knapp. Deshalb nochmal etwas ausführlicher:
Wenn du die Variablen in der Reihenfolge...
int a;
int b;
... anlegst, landen sie -- wie Martin schon erwähnte -- meist direkt hintereinander im Speicher. Der Stackpointer wandert beim Hinzufügen von Werten auf den Stack zu den _niedrigeren_ Speicheradressen hin. Wird also beim Eintritt in deine Funktion ein Stackframe angelegt, in dem auch die lokalen Variablen enthalten sind, liegen die eher angelegten Variablen bei höheren Speicheradressen:
pushl %ebp
movl %esp, %ebp
subl $4, %esp ; int a
subl $4, %esp ; int b
(Das wird üblicherweise natürlich in einem Schritt ausgeführt: subl $8, %esp.)
Wenn du nun &b - &a berechnest, ziehst du also eine größere Zahl von einer (um vier) kleineren ab.