Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 22.10.2015
Сообщений: 30

К чему приводит выход из подпрограммы командами LJMP, SJMP и т.д?

04.10.2018, 10:09. Показов 3378. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
К чему приводит выход из подпрограммы командами LJMP, SJMP и т.д?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.10.2018, 10:09
Ответы с готовыми решениями:

Почему редактирование и обновление класса ни к чему не приводит?
Ситуация такая: прога на Java. Запускается следующей строкой: java -classpath myjar.jar;.; myprog В каталоге проги лежит этот самый...

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

К чему приводит недостаточная фильтрация метасимволов оболочки?
Добрый день! Подскажите, пожалуйста, к чему приводит недостаточная фильтрация метасимволов оболочки в функции my_xprintf () в 'until.c'...

26
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
04.10.2018, 11:23
Микроконтроллеры > MCS-51 > Команды

Команда LJMP <addr16>
Команда "длинный переход" выполняет безусловный переход по указанному адресу, загружая старший и младший байты счетчика команд (РС) соответственно вторым и третьим байтами, находящимися в коде команды. Адрес перехода, таким образом, может находиться по любому адресу пространства памяти программ в 64 Кбайт. Эта команда на флаги не влияет.
Микроконтроллеры > MCS-51 > Команды

Команда LJMP <addr16>
Команда "длинный переход" выполняет безусловный переход по указанному адресу, загружая старший и младший байты счетчика команд (РС) соответственно вторым и третьим байтами, находящимися в коде команды. Адрес перехода, таким образом, может находиться по любому адресу пространства памяти программ в 64 Кбайт. Эта команда на флаги не влияет.
Из подпрограмм выходят с помощью команды:
Микроконтроллеры > MCS-51 > Команды
Команда RET
Команда "возврат из подпрограммы" последовательно выгружает старший и младший байты счетчика команд из стека, уменьшая указателья стека на 2. Выполнение основной программы обычно продолжается по адресу команды, следующей за ACALL или LCALL. На флаги эта команда не влияет.
Фраза: выгружает старший и младший байты счетчика команд из стека, уменьшая указателья стека на 2 - говорит о том, что чистится стек, команды перехода стек не чистят, поэтому стек - нарушен, и как следствие - не правильная работа кода.
В будущем смотрите в каком разделе спрашиваете.
1
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
04.10.2018, 12:00
Но есть и исключение из общего правила:
К примеру есть N подпрограмм, у которых первая часть различна, а начиная с метки А до команды возврата - одинакова, длиной М-байт. В данном случае, использование переходов позволяет уменьшить код на (N-1)*M байт.
Но это только частный случай и программист специально, осознанно, делает этот трюк.
Миниатюры
К чему приводит выход из подпрограммы командами LJMP, SJMP и т.д?  
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
04.10.2018, 12:22
Цитата Сообщение от Constantin Cat Посмотреть сообщение
(N-1)*M
Слегка ошибся (N-1)*(M-3), где 3 длина команды перехода.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
04.10.2018, 15:10
Цитата Сообщение от mihail0896 Посмотреть сообщение
К чему приводит выход из подпрограммы командами LJMP, SJMP и т.д?
а как ты будешь выходить? куда пошлешь программу ?
адрес возврата лежит в стеке
если выдернуть этот адрес и перейти по нему JMP то получишь тот же RET
раньше такие штуки использовались для ослепления дизасемблеров
1
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
04.10.2018, 15:36
Изначальный вопрос не имеет точного ответа. Потому что
Цитата Сообщение от mihail0896 Посмотреть сообщение
командами LJMP, SJMP
Нельзя "выйти" из подпрограммы. Ими вы можете сделать только переход по адресу.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
04.10.2018, 16:10
Цитата Сообщение от Voland_ Посмотреть сообщение
Нельзя "выйти" из подпрограммы.
а так
Assembler
1
2
3
4
POP  DPH  
POP  DPL  
CLR   A
JMP @A+DPTR
1
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
04.10.2018, 20:24
Цитата Сообщение от Voland_ Посмотреть сообщение
Изначальный вопрос не имеет точного ответа.
Использование JMP возможен в трех случаях:
1) Аварийный выход из программы(в этом случае кодер должен предусмотреть этот вариант, см.пост №2, относительно стека):
2) Экономия памяти(см. пост №3), в этом случае кодер идет осознано, с целью экономии памяти основной программы, и то если М больше 3-х в пару раз, т.к эта формула (N-1)*(M-3), покажет целесообразен ли такой вариант, когда формула даст положительный результат, иногда способ имеет место быть и при результате +1;
3) Рукожопый кодер, считает умнее всех, ну тут первое слово говорит о многом, т.к. ему нужно будет разгребать стековые конюшни, блин новый "Геракл".

Цитата Сообщение от ValeryS Посмотреть сообщение
а так
Из П/пр-мы можно выйти по разному, не знаю как в МК, а в х86 можно передать управление:
Assembler
1
2
3
4
pop bx
jmp bx
;или
jmp [bp]
Вопрос, только в желании, а способ найжется всегда.
1
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
05.10.2018, 12:49
Цитата Сообщение от ValeryS Посмотреть сообщение
а так
Технически это не выход из подпрограммы . Например потому, что у Вас портятся сразу три регистра при выходе. В сях конвенция (обычно) использует регистр А для результата. Ну и есть если локальные переменные - ситуация еще более обостряется.
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Использование JMP возможен в трех случаях:
я в курсе ).

Вариант 1 - да, технически можно назвать "выходом из подпрограммы", но обычно никто так не делает. Ибо есть
соглашения, что подрограмма всегда должна иметь один вход и один выход. То есть возможно все, но не все стоит делать .

Вариант 2 - согласен с Вами на 100%, но переход в данном случае не является "выходом из подпрограммы". Потому что ее (подпрограммы) функция выполнится только в конце списка функций, до ее RET.

Вариант 3 - это отдельная история, ее можно вообще не рассматривать. Тоже согласен .

ЗЫ: я больше аппелирую к терминам. "выход из подпрограммы" для меня некая точка, когда логическая задача подпрограммы заканчивается, данные результата соответствуют некой "конвенции" (соглашению).

Добавлено через 2 часа 2 минуты
PS: в одной из архитектур есть интересные сочетания. например, допустима команда POP PC.. Ну, то есть вы наверное, догадались что она делает? Да-да, после ее компиляции декомпилятор возвращает "RET". Ну, и так же всякие "jmp .+2" возвращает "NOP" и т.д. Примеров я знаю с десяток.
0
3760 / 2638 / 581
Регистрация: 11.09.2009
Сообщений: 9,419
05.10.2018, 15:00
Ещё не упомянули, что реализация "CALL - RETURN" зависит от типа микроконтроллера. Во многих этот стек вообще программно недоступен, сохраняет некоторые флаги, номера банков памяти, имеет отличия просто возврата от возврата из прерывания... Так можно много чего начудить.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
05.10.2018, 16:19
Цитата Сообщение от i8085 Посмотреть сообщение
Во многих этот стек вообще программно недоступен
а конкретнее можно? Дайте почитать. Я слышал что это есть, но никогда не сталкивался...
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
05.10.2018, 16:49
Цитата Сообщение от Voland_ Посмотреть сообщение
Технически это не выход из подпрограммы
таки выход, программа получает управление туда откуда вызван CALL, реализован правда через.... но задачу свою выполняет
Цитата Сообщение от Voland_ Посмотреть сообщение
Например потому, что у Вас портятся сразу три регистра при выходе.
да и пес с ними
Цитата Сообщение от Voland_ Посмотреть сообщение
В сях конвенция (обычно) использует регистр А для результата.
а вот тут позвольте не согласится, соглашение о вызове и возврате, сильно зависит от платформы, например в наших любимых STM нет вообще A, неплохо справляется R0
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
05.10.2018, 22:41
Цитата Сообщение от Voland_ Посмотреть сообщение
подпрограмма всегда должна иметь один вход и один выход
П пропустили


Этот метод есть в компиляторах в виде PROC-ENDP, и позволял, заметьте, не кодеру, а программе указывать, где кодер ошибся. Когда из/в некоторого логического блока кода можно было выпрыгнуть, или на оборот запрыгнуть. Но поверьте кодят, с помощью PROC-ENDP, только те, кто наступил на грабли поиска: "блин, да не может этого быть".

Но использование прямой адресации( игнорирование PROC-ENDP), при переходах, лишает кодера возможности получения сообщений от компилятора и заставляет думать: "блин, да не может этого быть".

Да есть способы обойти PROC-ENDP, но "ламер", не додумается, а "адванс", их и так знает.
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
12.10.2018, 08:39
Цитата Сообщение от Voland_ Посмотреть сообщение
а конкретнее можно? Дайте почитать. Я слышал что это есть, но никогда не сталкивался...
Да у микрочиповских микроконтроллеров PIC12Fxxx PIC16Fxxx стек программно недоступен. Еще у КР1878ВЕ1 тоже. У каких-то ранних Атмелок стек был на три уровня вложения всего, наверное он тоже был аппаратным и соответственно программно недоступным. Это из того, что первое в голову пришло.
Цитата Сообщение от Voland_ Посмотреть сообщение
Ибо есть соглашения, что подрограмма всегда должна иметь один вход и один выход.
Не знаю откуда взялись такие соглашения, но для программиста на ассемблере они вызывают только недоумение. В некоторых системах команд специально предусмотрены команды для того, чтобы у подпрограммы было много выходов. Например RETLW в микрочиповской системе команд. Она для чего придумана ? RTSC у КР1878ВЕ1 для чего ? А у Intel 8080 команды условных выходов из подпрограмм для чего ?

Добавлено через 14 минут
P.S.
Во нашел. Atmel AVR 90S1200
The stack is a 3-level-deep hardware stack dedicated for subroutines and interrupts.
Так-что если один уровень аппаратного стека предусмотреть для прерываний, то для вызова подпрограмм останутся 2 уровня стека. Приучает к очень аскетическому программированию
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
12.10.2018, 08:42
Цитата Сообщение от Ethereal Посмотреть сообщение
А у Intel 8080 команды условных выходов из подпрограмм для чего ?
так это и есть один вход один выход
например
C
1
2
3
4
5
6
7
8
int func(int a)
{
 if(a==0) return 2;
if(a==1) return 4;
if(a==2) return 6;
if(a==3) return 8;
return -1;
}
это один вход один выход, подпрограмма(функция) возвращается в одну точку
если иметь одну точку выхода
то пришлось бы писать
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int func(int a)
{
int ret=-1;
 if(a==0)
{
 return 2;
 goto exit;
}
if(a==1) 
{
 ret= 4;
 goto exit;
}
if(a==2) 
{
 ret= 6;
 goto exit;
}
if(a==3) 
{
 ret=8;
 goto exit;
}
exit:
return ret;
}
что есть ересь
а вот несколько выходов это когда п/п в зависимости от условий будет возвращаться в разные точки
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
12.10.2018, 08:57
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот несколько выходов это когда п/п в зависимости от условий будет возвращаться в разные точки
Если выход из п/п понимать так, то п/п перестанет уже быть п/п. п/п должна возвращаться туда откуда вызвана (для этого ей адрес возврата и передается) плюс, может быть, жестко закодированные адреса аварийных выходов. Но в норме туда откуда вызвана. Тогда она есть п/п.
Так-что если вводить такую терминологию, то исчезает сам предмет к которому терминология должна прикладываться.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
12.10.2018, 09:03
Цитата Сообщение от Ethereal Посмотреть сообщение
Если выход из п/п понимать так, то п/п перестанет уже быть п/п. п/п должна возвращаться туда откуда вызвана
это мы сейчас рассуждаем, а лет так пятьдесят назад, имело право на жизнь. "спагетти" помнишь
тогда-то и было сформулировано один вход один выход
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
12.10.2018, 09:15
Во. Просто к слову пришлось.
У PDP-8 не было стека и специальных команд вызова подпрограмм. Были только команды безусловных переходов и условных скипов (как у микрочипа).
Подпрограмма начиналась с кода безусловного перехода, а точка входа была сразу за ним. Выход из подпрограммы делался прыжком на безусловный переход в ее начале.
Перед вызовом подпрограммы сначала нужно было запихнуть в код условного перехода в ее начале адрес возврата, а потом перейти на подпрограмму прыжком на точку входа.
Цитата Сообщение от ValeryS Посмотреть сообщение
"спагетти" помнишь
Не признаю никаких правил, пишу лишь бы было максимально кратко, но "спагетти-код" у меня чего-то не получается. Просто потому-что оптимально по размеру почему-то всегда то, что просто, ясно и красиво. "спагетти-код" - это не красиво и в итоге не оптимально. Безо всяких правил.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
12.10.2018, 09:23
Цитата Сообщение от Ethereal Посмотреть сообщение
Не признаю никаких правил, пишу лишь бы было максимально кратко,
чтобы правила отрицать, нужно их знать а то изобретешь что то уже известное

Добавлено через 1 минуту
Цитата Сообщение от Ethereal Посмотреть сообщение
спагетти-код" - это не красиво и в итоге не оптимально.
экономия памяти, сейчас уже неактуально
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
12.10.2018, 13:01
Цитата Сообщение от Ethereal Посмотреть сообщение
Не знаю откуда взялись такие соглашения
https://www.ipa.go.jp/files/000040508.pdf, стр.96, M3.1.5. Понятно, что MISRA нужна далеко не всем, и тем не менее - составляли ее совсем не дураки... В принципе, она запрещает много чего и нужного (например, рекурссии). Но и такие "guidelines" присутствуют во многих других стандартах программирования.

PS: я не призываю к дискуссии, потому что сам в общем "ассемблирую" уже очень давно. Но такие "guide"'ы сильно приучают делать читаемый всеми код, а не "книгу открытий", для стороннего разработчика.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2018, 13:01
Помогаю со студенческими работами здесь

Почему в процессе квантования изменяется качество звуковой записи; и к чему приводит небольшая разрядность АЦП
Почему в процессе квантования изменяется качество звуковой записи? и к чмупривдит небольшая разрядность АЦП? Помогите пожалуйста...

Создать проект, содержащий основное меню с командами Ввод, Обработка, Выход.
Создать проект, содержащий основное меню с командами Ввод, Обработка, Выход. При выборе команды Ввод открывается подменю для ввода двух...

Нужно оформить текстовый документ, меню с командами ОТКРЫТЬ, СОХРАНИТЬ и ВЫХОД
Не понимаю что-то задание: Компоненты MenuStrip, OpenDialog. saveDialog и RichtexBox. Вам нужно оформить текстовый документ, меню с...

ввод в гугле "tchromium c++ builder кнопка назад" ни к чему вразумительному не приводит!
помогите перевести код от WebBrowser под Chromium, или дайте рус инструкции к этому(dcef-r306) компоненту(в гугле ничего кроме левых...

Выход из подпрограммы
Я делаю обход АВЛ дерева, сравнивая элементы, для проверки эквивалентности этих деревьев. При обходе подпрограмма обращается сама к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru