Ваше решение хоть и не слишком наглядно с точки зрения компактности кода на Си -- но более продуктивно в смысле получаемого кода. Но особенно меня бесят вещи типа
MOV R0,A MOV A,R0
именно идущие подряд. Где же хваленная pipeline оптимизация? Такое впечатление, что при компиляции код складывается из готовых кусочков-макросов и иногда вот и получаются такие дебильные вещи. Гррр.