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

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

04.10.2018, 10:09. Показов 3435. Ответов 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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
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
4041 / 2653 / 582
Регистрация: 11.09.2009
Сообщений: 9,474
05.10.2018, 15:00
Ещё не упомянули, что реализация "CALL - RETURN" зависит от типа микроконтроллера. Во многих этот стек вообще программно недоступен, сохраняет некоторые флаги, номера банков памяти, имеет отличия просто возврата от возврата из прерывания... Так можно много чего начудить.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
05.10.2018, 16:19
Цитата Сообщение от i8085 Посмотреть сообщение
Во многих этот стек вообще программно недоступен
а конкретнее можно? Дайте почитать. Я слышал что это есть, но никогда не сталкивался...
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
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
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru