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

 
 
> Вопрос к ассемблерщикам, Автоматическая растановка адресов
_Алексей_
сообщение 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
CDT
сообщение Mar 9 2009, 06:15
Сообщение #4


Местный
***

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



Цитата(_Pasha @ Mar 8 2009, 11:10) *

Что ж так нервничать. Можно было бы и предложить правильное решение.
Я сразу предупредил, что обкатать не на чем было.
И что думать надо говорил.
Сейчас есть на чем обкатать.

Вот то, что работает.
Код
;задает: dX-мл. адр. блока ячеек, shX-смещение от начала буфера, cX- длина данного блока ячеек
;Y - число выделяемых ячеек
.macro mac_BufSet;X,Y
    .equ d@0=BufNext
    .equ sh@0=d@0-BufStart
    .equ c@0=@1
    .set BufNext=BufNext+@1
.endm
;-------------------------------
.dseg

.equ cRcvdNameLen=20

dRcvdBuf:    
   .set BufStart=dRcvdBuf;задаем начало определяемого буфера
   .set BufNext=dRcvdBuf

    mac_BufSet RcvdLen,1
    mac_BufSet RcvdAdr,2
    mac_BufSet RcvdTime,4
    mac_BufSet RcvdName, cRcvdNameLen

.equ dRcvdBufEnd=BufNext        ;задаем конец определяемого буфера
.byte dRcvdBufEnd-dRcvdBuf;резервируем ОЗУ под определяемый буфер

.cseg

Интересно, что работают конструкции типа:
Код
    .equ c@0Long=@1;добавляет к базовой метке "с" и "Long"
    .equ @0@2=@1;собирает в одну метку 0-й и 2-й параметр макроса

Можно и еще чего по вычислять, зависимое от этих определений.
А кто еще чего полезного предложит?


--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
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   Цитата(_Pasha @ Mar 8 2009, 10:10) Для то...   Mar 8 2009, 07:45
|- - Сергей Борщ   Цитата(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
|- - yod   Цитата(galjoen @ Mar 8 2009, 13:45) ... К...   Mar 11 2009, 08:46
|- - 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
- - _Pasha   Цитата(CDT @ Mar 9 2009, 09:15) Что ж так...   Mar 10 2009, 08:26


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

 


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


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