Как насчет использования операции сравнения-обмена на двух разных адресах?
Что-то вроде: CMPXCHG (int*)&n, (((int*)&n)+1)
(обратите внимание - это на самом деле не может работать).
Редактировать: изменил синтаксис, чтобы более близко походить на фактический синтаксис x86.
Редактировать 2: , как указал Серж, использование двух адресов памяти в инструкции сборки не поддерживается для большинства сборок,поэтому этот способ не может работать напрямую из памяти.Это означает, что этот подход не может быть использован для сравнения двух 32-битных частей 64-битной переменной атомарным способом.
Некоторые сборки (по крайней мере, PowerPC) могут предоставить специальные инструкции (для PowerPC, LWARX и STWCX), которые могут сделать эту работу многопоточным безопасным способом, но это не совсем то, что запросил OP,и не будет работать для x86.