возврат из подпрограмм

Jun 04, 2006 Last reply: 19 years ago 3173 Replies

Здравствуй, Jurgis!

Как то 05 Jun 06 в 21:33, Jurgis Armanavichius писал Michael Belousoff:

[...]

MB>> Может быть, это из pазpяда паpанойи, но я бы написал тyт: MB>> if(...) return ERROR; MB>> пpедваpительно опpеделив, что такое ERROR. :)

[...]

MB>> А вот за такyю pасстановкy скобок я бы кое-комy кое-что MB>> ампyтиpовал. Хотя пpивеpженцев такого стиля немало. Мне MB>> даже как-то пpиходилось pаботать с чyжими текстами такого MB>> же вида. Пеpвым делом я pасставил скобочкy под скобочкой. MB>> :-)

JA> Согласен! Hо, таким способом я экономлю целую строку листинга! :-) JA> (Я кроме if также ставлю скобки еще и в while, do, for и т.п. ;-) Hе на этом экономить надо :))) Hаверное, ты еще и пробелы нигде не ставишь :) Вообще, текст становится гораздо более читабельным, если его сделать "размазаннее", например, писать вместо

for(i=0;i<255;i++)if(a Юргис

Пока! Pasha

rа4аrb@rаmblеr.ru

_*NO CARRIER*_ Я слушаю Guano Apes - Dont Your Turn Your Back On Me [03:13]

Hi, All!



вот назрел у новоиспечённого программера такой вопросец. сейчас много приходится писать на ассемблере. в чём же дело... а вот!



подпрограмма выглядит так:



sub_name: <всякая всячина>



quit_sub_name: ret



я так понимаю, одна подпрограмма-- один ret. но частенько бывают случаи, когда надо, например, сделать ветвление, да ещё и не одно. и выходить по многу раз. вместо того, чтобы лепить rjmp quit_sub_name грамотно было бы писать просто ret



и чё делать. я пишу именно переходы. мне кажется-- писать кучу ret это как goto юзать.



как делаете вы?


oleg


Sun Jun 04 2006 20:14, Alex Mogilnikov wrote to oleg dozhdev:

AM> увидев ret, читающий текст программы AM> сразу понимает, что произойдет при выполнении.

По иннерции выполнятся еще три команды подряд из пайплайна, которые стоят сразу после ret. Потом регистр ret загрузится в PC. Наглядно и очевидно, не правда ли? Счастливого писания на ассемблере :)

VLV

"Клянусь всем тем, во что когда-либо верили дураки" (с) Вальтер Скотт

Привет oleg!

04 Jun 06 13:51, oleg dozhdev писал All:

od> и чё делать. я пишу именно переходы. мне кажется-- писать кучу ret od> это как goto юзать.

Забавное мнение, ибо goto - это как раз переход...

od> как делаете вы?

Я использую и переходы, и ret'ы, и goto, и все прочие известные мне средства используемых языков в зависимости от того, что более эффективно в каждом конкретном случае. Религиозные предпочтения среди критериев выбора стоят на последнем месте.

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

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Аэроволны: ментол и эвкалипт для носа, мед и лимон для рота!

 X-Virus-Scanned: amavisd-new at bezeqint.net

Hello, oleg dozhdev! You wrote in conference fido7.ru.embedded to All on Sun, 04 Jun 2006 12:51:02 +0400:

od> вот назрел у новоиспечённого программера такой вопросец. od> сейчас много приходится писать на ассемблере. в чём же дело... od> а вот!

А зачем на ассемблере писать, пиши на С и пусть у компилятора голова болит. В С несколько return из функции - совершенно нормальное дело.

dima

formatting link

Mon Jun 05 2006 00:54, Alex Kocharin wrote to Dmitry Orlov:

od>>> вот назрел у новоиспечённого программера такой вопросец. od>>> сейчас много приходится писать на ассемблере. в чём же дело... od>>> а вот! DO>> А зачем на ассемблере писать, пиши на С и пусть у компилятора голова DO>> болит. В С несколько return из функции - совершенно нормальное дело.

AK> Микроконтроллеры тоже на си предлагаешь программить?

Логичней на С++, но в крайнем случае можно и на С. Если важен результат, а не процесс. :-)

"Всякий градоправитель да будет добросердечен"

Привет Vladimir!

04 Jun 06 18:53, Vladimir Vassilevsky писал Alex Mogilnikov:

AM>> увидев ret, читающий текст программы AM>> сразу понимает, что произойдет при выполнении.

VV> По иннерции выполнятся еще три команды подряд из пайплайна, которые VV> стоят сразу после ret. Потом регистр ret загрузится в PC.

Выдыхай!

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Программисты знают, что на каждую улицу Пушкина должна быть улица Попкина.

 X-Virus-Scanned: amavisd-new at bezeqint.net

Hello, Alex Kocharin! You wrote in conference fido7.ru.embedded to Dmitry Orlov on Sun, 04 Jun

2006 23:54:54 +0400:

od>>> вот назрел у новоиспечённого программера такой вопросец. od>>> сейчас много приходится писать на ассемблере. в чём же дело... od>>> а вот!

DO>> А зачем на ассемблере писать, пиши на С и пусть у компилятора DO>> голова болит. В С несколько return из функции - совершенно DO>> нормальное дело.

AK> Микроконтроллеры тоже на си предлагаешь программить?

Именно микроконтроллеры и предлагаю. Для компьютеров чаще более высокоуровневые средства удобней. А все неэкзотические контроллеры с шириной данных 8 и более бит именно на С.

dima

formatting link

,-' Hello, Dmitry Orlov! How is your connection today?

od>> вот назрел у новоиспечённого программера такой вопросец. od>> сейчас много приходится писать на ассемблере. в чём же дело... od>> а вот! DO> А зачем на ассемблере писать, пиши на С и пусть у компилятора голова DO> болит. В С несколько return из функции - совершенно нормальное дело.

Микроконтроллеры тоже на си предлагаешь программить?

`-._ --- Alexander Kocharin ---

Hello, Alex! You wrote to Dmitry Orlov on Sun, 04 Jun 2006 23:54:54 +0400:

AK> ,-' Hello, Dmitry Orlov! How is your connection today?

od>>> вот назрел у новоиспечённого программера такой вопросец. od>>> сейчас много приходится писать на ассемблере. в чём же дело... od>>> а вот! DO>> А зачем на ассемблере писать, пиши на С и пусть у компилятора DO>> голова болит. В С несколько return из функции - совершенно DO>> нормальное дело.

AK> Микроконтроллеры тоже на си предлагаешь программить?

Господи. а на чем же их еще программировать? На Си, конечно. Максимум - ассемблерные вствки в критичных местах. Это только вопрос наличия более-менеее нормальных компиляторов. Сколько я писал на асме под интелы всякие, а когда PL/M под 51-й повяился - счастью небыло предела! Лет 5 писал для ПИКов на асме, пока Си нормальным стал - уже 8 лет на нем пишу. АВР - был первым микроконтроллером в моей работе, для которого я вообще сразу писал на Си, без ассемблерной практики.

With best regards, Alexandr Torres.

[ Бомжей любить - не эхи модерить! ]

2:461/28, E-mail: snipped-for-privacy@yahoo.com

formatting link

Haile ande faile Alex!

DO>> А зачем на ассемблере писать, пиши на С и пусть у компилятора голова DO>> болит. В С несколько return из функции - совершенно нормальное дело. AK> Микроконтроллеры тоже на си предлагаешь программить?

(Задумчиво рассматривая резултаты выполнения apt-cache search avr) А в чём проблема?

Привет!

Sun Jun 04 2006 13:51, oleg dozhdev wrote to All:

od> я так понимаю, одна подпрограмма-- один ret. но частенько бывают od> случаи, когда надо, например, сделать ветвление, да ещё и не одно. и od> выходить по многу раз. вместо того, чтобы лепить od> rjmp quit_sub_name od> грамотно было бы писать просто od> ret od> и чё делать. я пишу именно переходы. мне кажется-- писать кучу ret od> это как goto юзать.

Это старая история про "goto" :-) Когда-то была мода: не использовать goto, т.к. они, якобы, мешают программисту писать понятные программы (запутывая ее текст многими переходами неизвестно куда).

Однако, нужно просто напросто четко, логично и ясно подходить к написанию программы. И выработать свой стиль программирования, а не слепо перенимать какие-то религиозные догмы. Hапример, такая конструкция гораздо понятнее:

int CUSBclass::SendBlock(BYTE *data_ptr,int data_len) { if(TransmitEndpoint == NULL) return -1; // Error return BYTE send_buffer[128]; // Prepare data to send ... // Call internal function return _send_block(...); // Return sent bytes number }

чем такая:

int CUSBclass::SendBlock(BYTE *data_ptr,int data_len) { if(TransmitEndpoint != NULL) { BYTE send_buffer[128]; // Prepare data to send ... // Call internal function return _send_block(...); // Return sent bytes number } else { return -1; // Error return } }

Сказанное еще в бОльшей степени относится к программе на Ассемблере, т.к. текст ассемблерной программы обычно длиннее и непонятнее, чем на ЯВУ (языке высокого уровня).

А вообще можно посоветовать переходить к программированию на C/C++ :-) Разве что тобою движет спортивный интерес...

Юргис

Привет!

Mon Jun 05 2006 00:54, Alex Kocharin wrote to Dmitry Orlov:

DO>> А зачем на ассемблере писать, пиши на С и пусть у компилятора голова DO>> болит. В С несколько return из функции - совершенно нормальное дело. AK> Микроконтроллеры тоже на си предлагаешь программить?

Всенепременно! Причем, на C/C++. Я довольно много работал с семейством

51-х микроконтроллеров, потом AVR-8 и 16-битными Hitachi. Hа 51-х и AVR пробовал тщательно разбирать порождаемый компилятором код. Конечно, при использовании Ассемблера можно чуть-чуть выиграть по объему кода, но это не очень существенно. Дело в том, что нынешние компиляторы C/C++ стали вполне качественными, код порождают достаточно эффективный. В тех же редких случаях, когда конкретное прерывание очень важно по скорости (что само по себе нехорошо, т.к. не стоит выжимать из аппаратуры все до капли ;-) вполне можно написать один-два крохотных модуля на языке Ассемблера.

А программирование на ЯВУ имеет то неоспоримое преимущество, что дает существенный выигрыш по скорости разработки и отладки программы. Ведь дывно действует закон, что количество отлаженных операторов в день не сильно зависит от языка программирования. Поэтому разрабатывая программу на C/C++ можно получить результат за меньшее время, или за то же время получить более качественную программу.

Юргис

 X-Virus-Scanned: amavisd-new at bezeqint.net

Hello, Alex Kocharin! You wrote in conference fido7.ru.embedded to Yuriy K on Mon, 05 Jun 2006 13:18:50

+0400:

AK>>> Микроконтроллеры тоже на си предлагаешь программить? YK>> Логичней на С++, но в крайнем случае можно и на С.

AK> Микроконтроллеры?

Именно.

AK> Насколько я помню, это такие штуки с частотой меньше мегагерца... На

Можно и меньше, но обычно больше и существенно.

AK> них тормозить сишный код не будет?

Код выполняется в них машинный, а не сишный.

AK> Насколько я помню, они на асме программируются, иногда вообще в машинных кодах... :-)

Программируются они программатором или бутлоадером.

AK> И есть ли сишные компиляторы под них? Что-то не видел...

Да мало ли чего ты не видел. Под большинство есть, а если нет, то и применять такое не надо.

YK>> Если важен результат, а не процесс. :-)

AK> Если бы мне был важен процесс, я бы писал сейчас в фипсе, запущеной AK> через wine под Linux 0.01... ;-)

Кому какое дело в чем ты сейчас пишешь?

dima

formatting link

,-' Hello, Yuriy K! How is your connection today?

AK>> Микроконтроллеры тоже на си предлагаешь программить? YK> Логичней на С++, но в крайнем случае можно и на С.

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

И есть ли сишные компиляторы под них? Что-то не видел...

YK> Если важен результат, а не процесс. :-)

Если бы мне был важен процесс, я бы писал сейчас в фипсе, запущеной через wine под Linux 0.01... ;-)

`-._ --- Alexander Kocharin ---

Hi, Alexandr!

AT> АВР - был первым микроконтроллером в моей работе, AT> для которого я вообще сразу писал на Си, без ассемблерной практики.

а как называется сишный пакет под avr (разумеется, с нормальными хелпами)? его где-то можно скачать задарма? если есть ссылочка, отшли плиз.

какой компилер включён в avr-studio_3.56?

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

сейчас работа идёт именно с avr. как ты сам понимаешь, организация коммерческая, цель-- заработать лавэ. поэтому они сразу берут что-то из at-mega (для простых поделей) и долбят его сишником-- та дешевле. благо 16x128k у atmega128 на борту есть. да и sram позволяет.

oleg

Привет Alex!

Вcк Июн 04 2006 20:14, Alex Mogilnikov пишет oleg dozhdev:

AM> критериев выбора стоят на последнем месте.

AM> В твоем конкретном примере, увидев ret, читающий текст программы AM> сразу понимает, что произойдет при выполнении. В случае же перехода AM> ему надо будет искать метку, на которую переход выполняется. О лишних AM> тактах процессора, которые будут затрачены на этот переход, даже и AM> говорить нечего. :)

RET как и CALL а так же и вход в пpеpывание могут выполняться заметно дольше JMP... да ышшо часть pегистpов надо отпpавить в стек .. а пеpед RET веpнуть назад ...

С наилучшими пожеланиями Nick .

Привет oleg!

Вcк Июн 04 2006 13:51, oleg dozhdev пишет All:

od> вот назрел у новоиспечённого программера такой вопросец. сейчас od> много приходится писать на ассемблере. в чём же дело... а вот!

od> подпрограмма выглядит так:

od> sub_name: od> <всякая всячина>

od> quit_sub_name: od> ret

od> я так понимаю, одна подпрограмма-- один ret. но частенько бывают od> случаи, когда надо, например, сделать ветвление, да ещё и не одно. и od> выходить по многу раз. вместо того, чтобы лепить od> rjmp quit_sub_name od> грамотно было бы писать просто od> ret

Hикто незапpещает ... только незабывать веpнуть из стека все назад пеpед каждым REТом ...

Есть подпpогpаммы имеющие по несколько точек входа и выхода и ничего pаботают !

Еще pаз со стеком внимательно и аккуpатно ... ! С наилучшими пожеланиями Nick .

 X-Virus-Scanned: amavisd-new at bezeqint.net

Hello, oleg dozhdev! You wrote in conference fido7.ru.embedded to Alexandr Torres on Mon, 05 Jun

2006 15:32:30 +0400:

AT>> АВР - был первым микроконтроллером в моей работе, для которого я AT>> вообще сразу писал на Си, без ассемблерной практики.

od> а как называется сишный пакет под avr (разумеется, с нормальными хелпами)? od> его где-то можно скачать задарма? если есть ссылочка, отшли плиз.

С нормальными - IAR, есть порт gcc, но я бы это нормальным комплектом не называл. Скачать много где можно, есть и у меня

ftp://EMBEDDED: snipped-for-privacy@dimorlus.dynalias.com ftp://EMBEDDED: snipped-for-privacy@dorlov.no-ip.com

и в edonkey/e-mule

od> какой компилер включён в avr-studio_3.56?

Понятия не имею.

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

Какое имеет отношение компилятор к режиму экрана? GUI IDE можно пользоваться, а можно и нет.

od> есть ли отладчик для avr какой-нибудь текстовый?

В IAR есть симулятор, но конечно в GUI, что-то кажется и в gcc'шном порте есть, но вообще толку от них (симуляторов) обычно не много.

od> сейчас работа идёт именно с avr. как ты сам понимаешь, od> организация коммерческая, цель-- заработать лавэ. поэтому они сразу

Разумеется, некоммерческие организации обычно гуманитарными проектами занимаются, а не embedded разработками.

od> берут что-то из at-mega (для простых поделей) и долбят его od> сишником-- та дешевле.

Раз долбят, значит у них уже есть компилятор.

od> благо 16x128k у atmega128 на борту есть. да и sram позволяет.

Писать на С позволяет PIC12F675...

dima

formatting link

Привет oleg!

05 Jun 06 16:32, oleg dozhdev писал Alexandr Torres:

od> а как называется сишный пакет под avr (разумеется, с нормальными od> хелпами)?

Есть например gcc.

od> его где-то можно скачать задарма? если есть ссылочка, отшли od> плиз.

formatting link

od> какой компилер включён в avr-studio_3.56?

Если правильно помню, какой-то не слишком удобный ассемблер.

od> вообще, я терпеть не могу виндовозный софт. лучше как-то в od> текстовом режиме. есть ли отладчик для avr какой-нибудь текстовый?

Есть симулятор simulavr

formatting link
умеющий работать с gdb по протоколу remote.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Синяки рождаются в споре куда чаще, чем истина...

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required