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

 
 
> Вопрос к ассемблерщикам, Автоматическая растановка адресов
_Алексей_
сообщение Mar 2 2009, 09:17
Сообщение #1





Группа: Новичок
Сообщений: 11
Регистрация: 16-02-09
Пользователь №: 44 925



Пример: .equ Napruga = SRAM_START+123
Таких директив может быть сотня и более.
Иногда возникает необходимость вставить посередине новую директиву или расширить массив. Из-за этого возникают проблемы, что нужно менять адресацию. Приходиться много править.
Существуют ли какие-нибудь методы или вспомогательные программы позволяющие решить данную проблему?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
CDT
сообщение Mar 8 2009, 06:50
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 303
Регистрация: 3-03-05
Пользователь №: 3 044



Цитата(_Алексей_ @ Mar 2 2009, 13:17) *
...
Иногда возникает необходимость вставить посередине новую директиву или расширить массив. Из-за этого возникают проблемы, что нужно менять адресацию. Приходиться много править.
......


Если не хочется чего - не то делать - надо подумать, как этого не делать.
Код
.dseg

.org ... (если очень хочется, но мне не разу не понадобилось. Опять потом искать и менять)

dRcvdBuf:;начало буфера (например, приема)
  dRcvdLen:    .byte    1
  dRcvdAdr:    .byte    2
  dRcvdTime:    .byte    4
  dRcvdName:    .byte    20
  dRcvdErrors:    .byte    1
  dRcvdVolts:    .byte    2
dRcvdBufEnd:;это что бы следить за концом буфера

;И вставляй, что хочешь, само настроиться

;что бы привязать к началу буфера (для использоввания указателей и поддержания
одинакового смещения в разных программах) можно посчитать смещения от начала буфера

Код
.equ shRcvdLen=dRcvdLen-dRcvdBuf
.equ shRcvdAdr=dRcvdAdr-dRcvdBuf
;....................................................
.equ cRcvdBufLen=dRcvdBufE-dRcvdBuf;длина буфера

   ldd   rTmp,z+shRcvdLen

;Можно макрос написать:
Код
.macro mac_BufSet
    @0: .byte @2
    .equ @1=@0-BufStart
.endm
;-------------------------------
.dseg
dRcvdBuf:    
.set BufStart=dRcvdBuf

  mac_BufSet dRcvdLen,shRcvdLen,1
  mac_BufSet dRcvdAdr,shRcvdAdr,2
  mac_BufSet dRcvdTime,shRcvdTime,4
  mac_BufSet dRcvdName,shRcvdName,20
...................
dRcvdBufEnd:

Как и на зеркало, не стоит на ассемблер пенять раньше времени.
Там еще препроцессор есть. Весьма удобная вещь, если научиться.

P.S.
Пришла по дороге идея, но прямо сейчас не на чем проверить:
Код
macro mac_BufSet
    d@0: .byte @1
    .equ sh@0=d@0-BufStart
.endm

  mac_BufSet RcvdLen,1
  mac_BufSet RcvdAdr,2

Еще меньше писанины


--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 8 2009, 07:10
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(CDT @ Mar 8 2009, 09:50) *
;Можно макрос написать:
Код
.macro mac_BufSet
    @0: .byte @2
    .equ @1=@0-BufStart
.endm
;-------------------------------


Для того чтобы что-то советовать, желательно хотя бы раз самому поробовать это применить. И вот когда Вы увидите в ответ на желание создать такой макрос, вот это


Цитата
error: .byte directive illegal in macro definition


Я думаю, у Вас возникнет острое желание извиниться за ту чушь, которую Вы написали.
Go to the top of the page
 
+Quote Post
galjoen
сообщение Mar 8 2009, 07:45
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(_Pasha @ Mar 8 2009, 10:10) *
Для того чтобы что-то советовать, желательно хотя бы раз самому поробовать это применить.

+1
А я вот не совсем по теме, но то, что всегда применяю. Тоже про доступ к данным.
Чаще всего приходится использовать таблицы в FLASH или ОЗУ размером до 256 байт или слов. В регистре находится N элемента (индекс массива) и к этому N нужно прибавить адрес начала массива. А массив не выровнен, т.е. может переходить через границу 256. Т.е. старший байт адреса может отличаться на 1. Стандартный способ это 4 такта. Но есть способ лучше. Я написал макро, и всегда и использую.
Код
.MACRO TAB_Z
    subi    ZL,low(-low(@0)); получение
    sbc    ZH,ZH    ; адреса в
    subi    ZH,low(-high((@0)-1))-1; таблице
.ENDMACRO

Перед вызовом смещение д.б. в ZL. Параметр в этой макрокоманде - адрес начала таблицы. В байтах если это данные, в словах если это таблица переходов.
Такие макрокоманды у меня обычно и для Y и для X описаны. Рекомендую...
Go to the top of the page
 
+Quote Post
yod
сообщение Mar 11 2009, 08:46
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 24
Регистрация: 20-10-06
Пользователь №: 21 500



Цитата(galjoen @ Mar 8 2009, 13:45) *
...
Код
.MACRO TAB_Z
    subi    ZL,low(-low(@0)); получение
    sbc    ZH,ZH; адреса в
    subi    ZH,low(-high((@0)-1))-1; таблице
.ENDMACRO

...


Спасибо за интересный ход, ибо ситуация действительно частая.
Сам долгое время работал с ассемблером, но в последнее время, ввиду объемности проектов, пользуюсь связкой eclipse+gcc (последняя сборка от Klen'а), однако по-прежнему, в критических местах люблю подписать на асме.

попытка внедрить этот код увенчалась провалом - никак компилятор сожрать не может такую конструкцию
Код
        "subi    %A[queue],-lo8(%[heap])"        "\n\t" /*получение*/
        "sbc    %B[queue],%B[queue]"            "\n\t" /*адреса в*/
        "subi    %B[queue],lo8(-hi8(%[heap]-1)-1)"     "\n\t" /*таблице*/

ошибки выдает дурные
C:\DOCUME~1\electro\LOCALS~1\Temp/ccX8y7d0.s:1163: Error: garbage at end of line
C:\DOCUME~1\electro\LOCALS~1\Temp/ccX8y7d0.s:1165: Error: `)' required
C:\DOCUME~1\electro\LOCALS~1\Temp/ccX8y7d0.s:1165: Error: garbage at end of line
судя по всему не может выполнять арифметические операции потому как простейшие конструкции типа
Код
        "subi    %A[queue],lo8(%[heap])"        "\n\t" /*получение*/
        "subi    %B[queue],hi8(%[heap])"     "\n\t" /*таблице*/
или
        "subi    %A[queue],%A[heap]"        "\n\t" /*получение*/
        "subi    %B[queue],%B[heap]"     "\n\t" /*таблице*/

скармливаются успешно
чуть более подробный код для введения в курс дела:
CODE

struct {
uint8_t Put;
uint8_t Get;
MPACKET* Container[CONST_FREEMEM_QUEUE_SIZE];
}QueueFreePacket;

исходный код на С
void QueuePut(TQUEUE* Queue,MPACKET* Packet){
if (Packet){
if(Queue){
//uint8_t tmp=Queue->Put + 1;
//if(tmp==CONST_QUEUE_SIZE)tmp=0;

uint8_t tmp=Queue->Put - (CONST_QUEUE_SIZE-1);
if(tmp)tmp+=CONST_QUEUE_SIZE;

if (tmp!=Queue->Get){
Queue->Container[Queue->Put]=Packet;
Queue->Put=tmp;
return;
}
}
QueueFreePacket.Container[QueueFreePacket.Put++]=Packet;
if (QueueFreePacket.Put==CONST_FREEMEM_QUEUE_SIZE) QueueFreePacket.Put=0;
}
}

часть асемблерной вставки для помещения пакета в очередь свободных пакетов
__asm__ __volatile__(
.....
"pkt_move_to_heap%=:" "\n\t"
"lds %A[queue],%[heap]" "\n\t"
"mov %[tmp],%A[queue]" "\n\t"
"subi %A[queue],-lo8(%[heap])" "\n\t" /*получение*/
"sbc %B[queue],%B[queue]" "\n\t" /*адреса в*/
"subi %B[queue],lo8(-hi8(%[heap]-1)-1)" "\n\t" /*таблице*/
"st %a[queue]+,%A[pkt]" "\n\t"
"st %a[queue],%B[pkt]" "\n\t"
"subi %[tmp],(%[heap_size]-1)<<1" "\n\t"
"cpse %[tmp],__zero_reg__" "\n\t"
"subi %[tmp],-(%[size]<<1)" "\n\t"
"sts %[heap],%[tmp]" "\n\t"


"exit%=:" "\n\t"
: "=&d"(tmp)
: [queue]"b"(Queue),[pkt]"w"(Packet),[tmp]"r"(tmp),[size]"M"(CONST_QUEUE_SIZE),[heap]"m"(QueueFreePacket),[heap_size]"M"(CONST_FREEMEM_QUEUE_SIZE)
: "1","memory"
);

Подскажите как коректно переписать это место ассемблерной вставки laughing.gif

Сообщение отредактировал yod - Mar 11 2009, 08:49
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- _Алексей_   Вопрос к ассемблерщикам   Mar 2 2009, 09:17
- - bbill   Самый удобный способ, резервирование памяти, расст...   Mar 2 2009, 09:37
- - 777777   Цитата(_Алексей_ @ Mar 2 2009, 12:17) При...   Mar 2 2009, 10:00
|- - _Pasha   Цитата(777777 @ Mar 2 2009, 14:00)  О том...   Mar 2 2009, 10:08
|- - SasaVitebsk   Цитата(_Pasha @ Mar 2 2009, 14:08) Но и ...   Mar 2 2009, 13:22
|- - Сергей Борщ   Цитата(_Pasha @ Mar 2 2009, 12:08) Невозм...   Mar 3 2009, 08:38
- - prottoss   Цитата(_Алексей_ @ Mar 2 2009, 16:17) Ино...   Mar 2 2009, 17:27
- - _Алексей_   >Почитайте описание на ассемблер, там это есть....   Mar 3 2009, 07:32
|- - Сергей Борщ   Цитата(galjoen @ Mar 8 2009, 09:45) Такие...   Mar 8 2009, 09:52
|- - _Pasha   Цитата(galjoen @ Mar 8 2009, 10:45) Но ес...   Mar 8 2009, 10:04
||- - Maik-vs   Какое странное и невнятное обсуждение. То есть нек...   Mar 8 2009, 15:17
||- - SasaVitebsk   Цитата(Maik-vs @ Mar 8 2009, 19:17) ...   Mar 9 2009, 21:07
||- - adc   Цитата(SasaVitebsk @ Mar 10 2009, 00:07) ...   Mar 10 2009, 07:58
||- - Maik-vs   Цитата(SasaVitebsk @ Mar 10 2009, 00:07) ...   Mar 10 2009, 08:27
||- - SasaVitebsk   Цитата(Maik-vs @ Mar 10 2009, 12:27)...   Mar 10 2009, 17:34
|- - galjoen   Цитата(yod @ Mar 11 2009, 11:46) ... Подс...   Mar 11 2009, 14:53
||- - yod   гхм, спасибо, попробовал, не вышло. теперь пишет и...   Mar 11 2009, 18:52
||- - galjoen   Цитата(yod @ Mar 11 2009, 21:52) гхм, спа...   Mar 11 2009, 19:12
||- - yod   при асемблерной вставке сам код предается как стро...   Mar 12 2009, 02:02
|- - _Pasha   Цитата(yod @ Mar 11 2009, 11:46) Подскажи...   Mar 12 2009, 02:34
|- - ReAl   Цитата(galjoen @ Mar 8 2009, 09:45) А мас...   Mar 14 2009, 10:02
|- - SasaVitebsk   Цитата(ReAl @ Mar 14 2009, 14:02) как бы ...   Mar 14 2009, 11:12
|- - galjoen   Цитата(ReAl @ Mar 14 2009, 13:02) Никаких...   Mar 14 2009, 16:27
||- - ReAl   Цитата(galjoen @ Mar 14 2009, 18:27) Для ...   Mar 15 2009, 09:00
|- - ReAl   Опа, тут мне на описку указали, а я уже не могу по...   Mar 15 2009, 19:58
- - CDT   Цитата(_Pasha @ Mar 8 2009, 11:10) Что ж...   Mar 9 2009, 06:15
- - _Pasha   Цитата(CDT @ Mar 9 2009, 09:15) Что ж так...   Mar 10 2009, 08:26


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

 


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


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