Цитата(dungeon @ Jun 14 2007, 20:47)

Задача убрать ldsы (компилятор должен их прописать сам).
:"=r" (nBuffer_RX[23]),"=r" (nBuffer_RX[22])
:"r" (tbin)
:"memory"
Дык! У тебя nBuffer_RX[23], nBuffer_RX[22] прописаны только в
выходных регистрах. А tbin - только во входных.
И, кстати, для nBuffer_RX[23], nBuffer_RX[22] годится не любой регистр ("r"), а только из верхних 16-ти ("d"), так как там subi.
Если я правильно понял что надо, то так (я вынес tbin за пределы функции, так как оно после того if() в конце сокращённого примера никуда не пишется и оптимизатор выкидывает).
Код
#include <stdint.h>
#include <avr/io.h>
#define UART_BUFFER_LENGTH 32
uint8_t nBuffer_RX[UART_BUFFER_LENGTH];
uint8_t nBuffer_TX[UART_BUFFER_LENGTH];
uint8_t tbin;
void ReplyCommandSetCORTI_UART(void)
{
nBuffer_RX[11] -= 0x30;
nBuffer_RX[12] -= 0x30;
asm volatile (
"1:" "\n\t"
"subi %0,1" "\n\t"
"brcs 2f " "\n\t"
"subi %1,-10" "\n\t"
"rjmp 1b" "\n\t"
"2:" "\n\t"
"mov %2,%1" "\n\t"
: "=d" (nBuffer_RX[23]), "=d"(nBuffer_RX[22]), "=r"(tbin)
: "0" (nBuffer_RX[23]), "1"(nBuffer_RX[22])
: "memory"
);
if (nBuffer_RX[10] == '-') {
tbin += 0x20;
}
}
Теперь элементы nBuffer_RX[] прописаны и в выходных, и во входных как дубликаты выходных ("0" - использовать тот же регистр, что и для аргумента %0).
Оно?
CODE
.text
.global ReplyCommandSetCORTI_UART
.type ReplyCommandSetCORTI_UART, @function
ReplyCommandSetCORTI_UART:
/* prologue: frame size=0 */
/* prologue end (size=0) */
lds r24,nBuffer_RX+11
subi r24,lo8(-(-48))
sts nBuffer_RX+11,r24
lds r24,nBuffer_RX+12
subi r24,lo8(-(-48))
sts nBuffer_RX+12,r24
lds r25,nBuffer_RX+23
lds r24,nBuffer_RX+22
/* #APP */
1:
subi r25,1
brcs 2f
subi r24,-10
rjmp 1b
2:
mov r18,r24
/* #NOAPP */
sts nBuffer_RX+23,r25
sts nBuffer_RX+22,r24
sts tbin,r18
lds r24,nBuffer_RX+10
cpi r24,lo8(45)
breq .L6
ret
.L6:
subi r18,lo8(-(32))
sts tbin,r18
ret
/* epilogue: frame size=0 */
/* epilogue: noreturn */
/* epilogue end (size=0) */
/* function ReplyCommandSetCORTI_UART size 45 (45) */
.size ReplyCommandSetCORTI_UART, .-ReplyCommandSetCORTI_UART
.comm nBuffer_RX,32,1
.comm nBuffer_TX,32,1
.comm tbin,1,1
/* File "lds.c": code 45 = 0x002d ( 45), prologues 0, epilogues 0 */
Ну а если эти [22] и [23] нужны только как входные - то убрать из первой части, во второй поставить "d" вместо "0" и "1", ну и во всей вставке поменять %-ты, так как %0 станет tbin
p.s. я опять сонный и опять не уверен, что всё правильно понял.
Да, возможно, "memory" в третьей части и не нужно, изменение 22-го и 23-го элемента прописано явно в выходных параметрах.