реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> WinAVR и asm
dungeon
сообщение Jun 12 2007, 16:19
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 19-01-07
Из: Украина, Винница
Пользователь №: 24 583



Помогите корректно написать асемблерную вставку в
WinAVR (код написан в функции):
asm volatile( "lds r24,0x0120" "\n\t"
"lds r25,0x0121" "\n\t"
"1:" "\n\t"
"subi %0,1" "\n\t"
"brcs L_dl2%=" "\n\t"
"subi %1,-10" "\n\t"
"rjmp 1b" "\n\t"
"L_dl2%=:"b "\n\t"
"mov %2,r25" "\n\t"
:"=r"(nBuffer_RX[23]),"=r"(nBuffer_RX[22])
:"r" (tbin)
:"memory"
);
В первой и второй строчке загрузка переменных nBuffer[..](этот масив объявлен в начале программы). При этом необходимо писать адрес ячейки ОЗУ где они размещены.(использование ссылок типа %0 и %1 ничего не дает). Боюсь добалять и удалять переменные чтобы адреса "лесом" не пошли biggrin.gif .
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 13 2007, 06:39
Сообщение #2


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(dungeon @ Jun 12 2007, 18:19) *
Помогите корректно написать асемблерную вставку в
WinAVR (код написан в функции):
Немного более внятно объясни задачу.
Покажи что там выше-ниже ассемблерной вставки должно быть, убери lds-ы с забитыми адресами и на словах скажи что надо.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
dungeon
сообщение Jun 14 2007, 18:47
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 19-01-07
Из: Украина, Винница
Пользователь №: 24 583



Задача убрать ldsы (компилятор должен их прописать сам).
Но когда их убираю подпрограмма не работает.

вот код по подробнее
//
#include "lm.h"
//
.....................(много переменных)
BYTE nBuffer_RX[UART_BUFFER_LENGTH];
BYTE nBuffer_TX[UART_BUFFER_LENGTH];
.....................


void ReplyCommandSetCORTI_UART (void)
{
BYTE tbin;
nBuffer_RX[11]-=0x30;
nBuffer_RX[12]-=0x30;
asm volatile( "lds r24,0x0120" "\n\t"
"lds r25,0x0121" "\n\t"
"1:" "\n\t"
"subi %0,1" "\n\t"
"brcs L_dl2%=" "\n\t"
"subi %1,-10" "\n\t"
"rjmp 1b" "\n\t"
"L_dl2%=:" "\n\t"
"mov %2,r25" "\n\t"
:"=r" (nBuffer_RX[23]),"=r" (nBuffer_RX[22])
:"r" (tbin)
:"memory"
);


if (nBuffer_RX[10]=='-')
{
tbin += 0x20;
} //ставим знак
}
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 14 2007, 22:21
Сообщение #4


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(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-го элемента прописано явно в выходных параметрах.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01381 секунд с 7
ELECTRONIX ©2004-2016