Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Rtmip
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Rtmip »

Пока_без_кота писал(а):....Вот я пишу конспект (для себя, чтобы лучше понять), на кого мне ориентироваться ???
Учитывая, что тема про 51-е, то попробуйте ориентироваться вот на это:
Спойлер
Существуют следующие способы адресации операндов – данных, участвующих в операциях:
• неявная;
• регистровая (прямая регистровая);
• прямая (байтовая и битовая);
• непосредственная;
• косвенная;
• относительная;
• базово-индексная.
При неявной адресации информацию об адресе операнда, участвующего в операции, устройство управления микроЭВМ получает из кода операции команды. Чаще всего так адресуются аккумулятор и флаг переноса, например, INC A, CLR C.
При регистровой адресации команда содержит трехразрядный прямой адрес одного из восьми рабочих регистров текущего банка РОНов РПД.
Для выбора рабочего (текущего) банка используются разряды PSW3, PSW4 регистра флагов (таблица 3). Примеры команд с регистровой адресацией: MOV A, Rn; XCH A, Rn.
Прямая байтовая адресация применяется для обращения к ячейкам РПД и к регистрам специальных функций (таблица 2). В этом случае команда включает в себя прямой 8-разрядный адрес операнда, обозначаемый ad, например: ADD A, ad; DEC ad и др.
Прямая битовая адресация используется для обращения к отдельно адресуемым 128 би-там РПД (рисунок 5, 26) и к отдельно адресуемым битам регистров специальных функций (рисунок 27). При этом команда содержит прямой 8-разрядный адрес бита, участвующего в операции. Этот адрес обозначается bit, например: SET bit; MOV C, bit и др.
При непосредственной адресации операнд входит в саму команду и извлекается из памяти при выполнении команды вслед за ее кодом операции. Непосредственный операнд обозначается #D8, #D16, например: MOV A, #D8; MOV DPTR, #16 и др.
При косвенной адресации в команде содержится ссылка на регистр, в котором содержится адрес операнда. Эта адресация может использоваться для обращения к ячейкам внутреннего (РПД) или внешнего ЗУ (ВПД). В качестве регистров-указателей РПД служат регистры R0, R1 выбранного рабочего (текущего) банка РОНов. Это, например, команды MOV A, @Ri; MOV ad, @Ri и др.
В качестве регистров указателей ВПД применяются те же R0 и R1, что позволяет вы-брать одну из 256 ячеек внешней памяти, либо 16-разрядный регистр-указатель данных (DPTR), который обеспечивает адресацию одной из 65536 = 64 К восьмиразрядный ячеек ВПД. Например, команды MOVX A, @Ri; MOVX @DPTR, A и др.
Относительная адресация применяется в командах условных переходов. При этом в команде задается 8-разрядное смещение относительно адреса самой команды. Смещение воспринимается как число со знаком, представленное в дополнительном коде. Это позволяет осуществлять переходы на +127 байт вперед и на –128 байт назад относительно адреса следующей команды. Например, команды JNZ rel; DJNZ ad, rel и др., где rel – 8-битное смещение.
При базово-индексной адресации адрес операнда вычисляется как сумма 16-разрядного базового адреса, содержащегося регистрах DPTR или PC, и 8-битного индекса, загружаемого в аккумулятор. Это позволяет обращаться к элементам таблиц, массивов и т.д. Например, команды MOVC A, @A+DPTR; MOVC A, @A+PC.
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

Rtmip писал(а): ... попробуйте ориентироваться вот на это:

Скажите источник, пожалуйста.
Всем спасибо за ответы.
Rtmip
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Rtmip »

Сейчас уже точно не помню источник, где брал.
В сети есть в разных местах, вот, например.
Понравилось? :)
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

Да, спасибо, годный сайт.
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

Доброго времени суток. Добрался до работы с отдельными битами. Как лучше всего объявить битовую переменную, чтобы потерять как можно меньше ячеек памяти. Ведь битоадресуемое пространство начинаеться с адреса 20h, и если объявлять бит с помощью директивы equ

Код: Выделить всё

Flag       equ      20h.0

то то получаеться начало стека можно размещать только начиная с адреса 21h ?
Можно ли объявить начало стека в битоадресуемом пространстве ? Что-то типа:

Код: Выделить всё

dseg    at      8h                      ; Первых 8 ячеек (с R0 по R7 0 банка) резервируем
                                        ; Здесь обявляем наши переменные, если они нужны
Var_1:                               ; 1 переменная
   ds   1

bseg    at      0h
Flag_1:                                 ; Флаг 1 сенсора
   dbit    1
Flag_2:               ; Флаг 2 сенсора
   dbit    1
org     08h                                : По факту это нулевой бит ячейки с адресом 21h, поэтому фактически стек начнеться с этого адреса (21h)
Stack:               ; А дальше пойдет стек

Тогда я сэкономлю на стек столько ячеек, сколько у меня будет определено в dseg (24 минус количество неопределенных ячеек, если не трогать 0 банк).
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Ser60 »

Если заведете 8 битовых переменных, то их битовые адреса (скажем, от 0х00 то 0х07) отобразятся в один и то-же байт 0х20 памяти. В этом случае стек можете начать с адреса 0х21, поскольку стек использует адреса байтов, а не битовые адреса.

Только зачем начинать стек в непосредственно адресуемой области памяти? Если будете обращаться к данным в стеке через SP, почему не начать его в области с косвенной адресацией? Например, так:
MOV SP, #0x7F

P.S. Кота когда заведёте? :)
petrenko
Друг Кота
Сообщения: 5321
Зарегистрирован: Вт фев 21, 2012 13:51:55
Откуда: Начинающий
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение petrenko »

"Энтшульдиген" (, а также "скузи" и "пардон") коллега, но скольки-битный сам SP ?
Уточните пожалуйста. :roll:
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

Ser60 писал(а):Только зачем начинать стек в непосредственно адресуемой области памяти? Если будете обращаться к данным в стеке через SP, почему не начать его в области с косвенной адресацией? Например, так:
MOV SP, #0x7F

P.S. Кота когда заведёте? :)


Ну в такой ипостаси уже наверное действительно незачем. Просто эту модель я скопипастил из статей Романа Абраша из журнала Радиолюбитель (№7 за 2007 год).
И там, если не применять битовую адресацию, оно все было очень удобно:

Код: Выделить всё

dseg    at      8h                      ; Первых 8 ячеек (с R0 по R7 0 банка) резервируем
                                        ; Здесь обявляем наши переменные, если они нужны
Var_1:                               ; 1 переменная
   ds   1
Var_2:                               ; 2 переменная
   ds   1
Stack:                                  ; А дальше пойдет стек

cseg    at      0
   jmp   Main
org 100h
Main:
   mov     SP,#Stack
       и дальше пошел код


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

П.С. Кот есть у родителей, у меня 2 детей, хватает пока с головой)) Может стану постарше, тогда заведу.
Последний раз редактировалось Пока_без_кота Пн сен 07, 2015 21:38:53, всего редактировалось 2 раза.
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

petrenko писал(а)::roll:

Если это мне, то кажеться 8 битный (1 байтный) :))
Хотя вряд ли мне, я на коллегу не тяну :)))
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение ARV »

я вспомнил: BSEG и DSEG пересекаются, и поэтому не все так просто.
если надо работать с битоадресуемыми ячейками в BSEG, то придется пользоваться директивами AT или ORG для всех сегментов данных.
в этом случае со стеком "автоматически" работать не получится...

надеюсь, что ничего не перепутал :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

ARV писал(а):надеюсь, что ничего не перепутал :)

Да, вроде получаеться вот такой код:

Код: Выделить всё

dseg    at      8h                      ; Первых 8 ячеек (с R0 по R7 0 банка) резервируем
                                        ; Здесь обявляем наши переменные, если они нужны
Var_1:                               ; 1 переменная
   ds   1
org   21h
Stack:                                  ; А дальше пойдет стек
bseg               ; Здесь можно определить до 8 отдельних битов, если надо больше - правим константу директивы org перед меткой Stack
Flag_1:                                 ; Флаг 1 сенсора
   dbit    1
Flag_2:               ; Флаг 2 сенсора
   dbit    1
cseg    at      0
   jmp   Main
org 100h

Main:
   mov     SP,#Stack
        дальше основная программа...

Если не нужны битовые переменные, стираем весь bseg, директиву org 21h перед меткой стека, и вуаля, у нас максимум ячеек под стек)))
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение BOB51 »

Ой-ой_ой!!!
Осторожненько с выводами!!!
8)
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

А что я не учел ?
petrenko
Друг Кота
Сообщения: 5321
Зарегистрирован: Вт фев 21, 2012 13:51:55
Откуда: Начинающий
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение petrenko »

Пока_без_кота писал(а):...
Если это мне, то кажет
-ь-ся SP 8 битный (1 байтный) :))
Хотя вряд ли мне, я на коллегу не тяну
:)))
Ну как сказать .. - ответ то Ваш по существу верный, так что подтягивайтесь к кругу коллег - ну по хобби хоша бы.. :)
А вот как 8-битным SP адресовать не в прямоадресуемой 256-байтной области, а где то ещё - это я как раз хотел уточнить у коллеги "Ser60" .... :dont_know:
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Ser60 »

Не понял, чего тут уточнять - ясно что никак нельзя. А я это и не предлагал. Во всех своих проектах на С8051 я устананавливал указатель стека как писал выше (MOV SP, #0x7F). В этом случае под стек отведется 128 байт с адресами от 0x80 до 0хFF в области "Upper 128 RAM" на рисунке ниже, адресуемой только косвенно (indirect)
Изображение
Все переменные в программах располагал в прямоадресуемой области "Lower 128 RAM" между адресами 0х20 и 0х7F, что очень удобно с точки зрения возможности обращения к ним в программе по именам, а не только через поинтер. Понимаю желание ТС отвести под стек как можно более памяти. Не знаю какая у него задача, может это и имеет смысл. Мне всегда было достаточно 128 байт под стек.
petrenko
Друг Кота
Сообщения: 5321
Зарегистрирован: Вт фев 21, 2012 13:51:55
Откуда: Начинающий
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение petrenko »

Благодарю за уточнение.
То есть предложенное Вами :
Ser60 писал(а):..
Только зачем начинать стек в непосредственно адресуемой области памяти? Если будете обращаться к данным в стеке через SP, почему не начать его в области с косвенной адресацией? Например, так:
MOV SP, #0x7F

..
относится к C8051F96x и ещё нескольким вариантам исполнения мк семейства *51 ,тем, где есть этот самый режим "Indirekt" для "Upper RAM" ..
( то есть не у всех мк семейства *51 это возможно - у некоторых и памяти внутренней всего то 128 )
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Ser60 »

ОК, теперь мне понятна причина недоразумения. У всех силлабовских с флешь памятью программ имеется такая область в RAM.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение BOB51 »

Это относится ко всем МК семейства mcs51 имеющим "верхнюю" часть ОЗУ, доступную для команд косвенной адресации через @Ri и обращения к стеку. В том числе и атмелевские и NXPшные и все прочие, где в даташитах есть данное объявление.
У INTEL такая область появилась от mcs52, а вот другие производители иногда цепляют оную и в изделиях маркированных как "расширенная 51-я" с суффиксами rd, rb ильещё какими в конце названия (у атмеля и компании...).
В ассемблере эта область ... имеет "координаты" в директивах ISEG и IDATA (c51asm atel) и в кейле.
8)
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

Ser60 писал(а): ... Мне всегда было достаточно 128 байт под стек.

Да мне сейчас тоже хватает с головой, я просто хочу создать себе нормальный шаблон на будущее, чтобы потом меньше править, когда упрусь в лимит.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение ARV »

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

Мой уютный бложик... заходите!
Ответить

Вернуться в «Разные вопросы по МК»