Цитата(alux @ Jan 22 2008, 15:31)

Кстати, вопросик по ходу: как лучше писать
Код
Accumulator = ((unsigned int)i2c_read(ACK)<<8) | i2c_read(ACK);
или
Accumulator = ((unsigned int)i2c_read(ACK)<<8) + i2c_read(ACK);
Никак. Сергей Борщ с самого начала дал правильный ответ.
Порядок вычисления подвыражений неопределён для всего, кроме . Точка. Это не имеет никакого отношения к порядку группирования операций слева направо или наоборот.
Цитата
ISO/IEC 9899:1999 (E)
6.5 Expressions
3 The grouping of operators and operands is indicated by the syntax. Except as specified later (for the function-call (), &&, ||, ?:, and comma operators), the order of evaluation of subexpressions and the order in which side effects take place are both unspecified.
Сразу, чтобы не было иллюзий по поводу
function call () ( "скобок вызова функции", круглые скобки выполняют роль cast operator, parentheses punctuator и function-call operator, в данном случае об этом)
Цитата
6.5.2.2 Function calls
10 The order of evaluation of the function designator, the actual arguments, and subexpressions within the actual arguments is unspecified, but there is a sequence point before the actual call.
Ну так вот, независимо от порядка группирования операторов
op (за исключением перечисленных выше операторов) в следующем выражении
Код
f1() op f2() op f3()
порядок вызова функций неопределён. Могут вычисляться в порядке группирования, могут быть вызваны все три в противоположном порядке, а потом будут произведены вычисления. Отдано на откуп реализации. "вероятнее всего" будут вызываться в порядке группирования, но я бы не стал закладываться.
Поэтому правильный вариант либо как указал Сергей, либо
Код
/* так */
temp = i2c_read(ACK);
Accumulator = ((unsigned int)temp << 8) | i2c_read(ACK);
/* или так */
Accumulator = ((unsigned int)i2c_read(ACK)<<8);
Accumulator |= i2c_read(ACK);
А вот в этих местах что лучше писать - как правило, лучше ИЛИ.
Цитата(alux @ Jan 22 2008, 21:47)

Код
\ 00000022 ........ CALL i2c_readAck
\ 00000026 ........ CALL i2c_readAck
\ 0000002A 2F80 MOV R24, R16
\ 0000002C E090 LDI R25, 0
Как узнать, в какой регистр возвращает первый и второй CALL i2c_readAck ?
В один и тот же. В регистр, принятый в компиляторе для возврата байтовых значений из функций.
Просто результат первого вызова по какой-то причине игнорируется вообще (но вызов сделан, ибо компилятор лишён информации о том, имеет ли данная функция побочные эффекты и поэтому обязан сделать вызов). А результат второго вызова из R16 приводится к беззнаковому целому в паре R25:R24
Почему так - совершенно непонятно.
Покажите (без ассемблера, С-шный исходник) - объявления функций i2c_* и тело этой функции, в коде которой бардак выходит.
У IAR-а случайно нет какого-то ключика/галочки - сделать int 8-битовым? Очень похоже, что ((unsigned int)i2c_read(ACK) << 8) считается равным 0