С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Насколько я понимаю - в первом случае к объекту i применяется копирование типа long, а во втором случае сначала создаётся новый объект типа long - т.е. вызывается его конструктор, получающий значение объекта i в качестве начального значения, а потом копируется уже вновь созданный объект. Если включена оптимизация - код может получиться одинаковым, а если нет - первый вариант будет короче.
Про ООП (но не про Си!)
Скрытый текст
Я не проф. и Си вообще всегда бежал, но вот Паскаль от УК-НЦ потом турбо-паскаль в ДОС - для удовольствия и наконец Delphi под Win. ООП - конструкторы\диструкторы я понял только из объяснений Patrona - слишком заумные мне попадались видимо толкователи до этого.
Но я вот что хотел сказать то - читал учебник (автора не помню), по Delphi, где автор полностью отказался от термина ООП и вообще не использовал его ни разу ни на одной странице (единственный учебник в котором автор на одном со мной языке говорил про ООП паскаль и Delphi), он вводит там такой термин Событийно Ориентированное Программирование.
Мне например "методы" ? Ну то есть переменные объекта, которые через
точку пишутся очень обрадовали! Но потребовалось время что-бы привыкнуть воспринимать и код и результат по новому, если раньше программа была строго линейная (или я такой как рельсы прямой!), то есть автоматом вылетала в монитор
когда доходила до END., то под Win созданное окно так и будет висеть и получать сообщения. В целом это я так - впечатлениями делюсь, но мне например
нелегко было отказаться от циклов и некоторых других вещей которые "не рекомендуются" при СОП, просто потому-что не нужны или не желательны или требуют дополнительного обслуживания (я имею в виду ProcessMessages).
И странное дело, вот объяснения Patrona я понимаю, а код из примеров (сам синтаксис Си для меня всегда был страшен - может потому что я
начинал с Бейсика на БК0010? Но все эти фигурные скобочки - у меня
ассоциация с комментами из паскаля ))) Паскаль - просто больше похож
(Delphi сюда же). на язык человека и наглядней (для меня) для простых
вычислений. Но я не профи.
[свернуть]
Вот кстати говоря вопрос такой - если Си родился из макро-11 (а судя
по данным многие профессионалы сразу начинали с той самой версии,
минуя ассемблер, где Паскаль впервые в виде транслятора появился,
так же на PDP? (наверное это легко нагуглить, но всё же).
---------- Post added at 20:35 ---------- Previous post was at 20:34 ----------
Главное - какой будет быстрее работать?
Сейчас оптимизаторы достигли такой крутизны, что при включённой глобальной оптимизации - вызов целого вороха вложенных функций может скомпилироваться в одну-две ассемблерных команды вообще без всяких вызовов подпрограмм.
Когда я впервые в жизни включил глобальную оптимизацию и посмотрел ассемблерный листинг компиляции - то очень удивился. Из функций исчезли прологи и эпилоги, а аргументы стали передаваться в регистрах вместо стека. Если функция не числится глобальной (а значит не должна быть доступна в OBJ-файле в виде глобального имени) - оптимизатор может иногда вообще не компилировать её, а подставлять в точках вызовов как макрос.
Последний раз редактировалось Patron; 30.01.2013 в 20:49.
Patron, Vamos -- спасибо за критику и вклад в проект.
Сейчас станции уже начинают пытаться переговариваться, но сбиваются.
При этом на принимающей станции выпадает в СТОП.
Загрузчик из сети в ПЗУ (спасибо Alex_K):
Код:; Загрузчик из сети 164160$:MTPS #340 ; Запретить прерывания MOVB @#176561,R5 ; Выделение в R5 номера сетевой станции MOV R5,R0 BIC #177760,R5 ASR R0 BIC #177717,R0 BIS R0,R5 MOVB R5,164556$ ; Сохранение номера сетевой станции MOVB 164572$,R0 ; R0 = 173(8) XOR R5,R0 ; R0 = 173(8) XOR номер_сетевой_станции MOVB R0,164572$ MOV #30,R0 ; R0 = 30 (адрес вектора команды EMT) MOV #164500$-164160$+1000,(R0)+ ; Установка вектора прерывания EMT CLR (R0)+ ; Установка ССП при вызове EMT MOV #164512$-164160$+1000,(R0)+ ; Установка вектора прерывания TRAP CLR (R0)+ ; Установка ССП при вызове TRAP 164244$:MOV #10000,SP ; Установка указателя стека MOV #164526$-164160$+1000,@#100 ; Устан. вект. прер. сет. таймера CLR @#102 MTPS #0 ; Разрешить прерывания CLR 164534$ ; Очистка счетчика ожидания 164272$:TRAP 0 ; Чтение пришедшего байта CMP 164534$,#5 ; Счетчик ожидания больше пяти BLO 164272$ ; Нет 164304$:EMT 0 ; Посылка и чтение очередного байта CMPB #376,R0 ; Пришедший байт равен 376(8) BNE 164304$ ; Нет MOV #164554$-164160$+1000,R1 ; R1 = адрес блока передачи 164320$:MOVB (R1)+,R0 ; R0 = очередной байт из блока передачи CMPB #376,R0 ; Он равен 376(8) ? BEQ 164334$ ; Да EMT 0 ; Посылка и чтение очередного байта BR 164320$ 164334$:EMT 0 ; Посылка и чтение очередного байта CMPB #377,R0 ; Прочитанный байт равен 377(8) ? BNE 164334$ ; Нет EMT 0 ; Посылка и чтение очередного байта CMPB R5,R0 ; Полученный байт равен номеру станции ? BNE 164334$ ; Нет MOV #377,R4 ; R4 = 377(8) (контрольная сумма) XOR R0,R4 ; R4 = 377(8) XOR номер_сетевой_станции MOV #50000,R1 ; R1 = адрес расположения загрузчика EMT 0 ; Посылка и чтение очередного байта MOV R0,R3 ; R3 = считанный байт XOR R0,R4 ; Подсчет контрольной суммы 164372$:EMT 0 ; Посылка и чтение очередного байта CMPB #373,R0 ; Считанный байт равен 373(8) ? BLOS 164410$ ; Выше или равен 373(8) XOR R0,R4 ; Подсчет контрольной суммы MOVB R0,(R1)+ ; Передача принятого байта в память BR 164372$ 164410$:BNE 164426$ ; Принятый байт равен не равен 373(8) EMT 0 ; Посылка и чтение очередного байта COM R0 ; Инверсия принятого байта XOR R0,R4 ; Подсчет контрольной суммы MOVB R0,(R1)+ ; Передача принятого байта в память COM R0 ; Инверсия для передачи BR 164372$ 164426$:CMPB #374,R0 ; Принятый байт равен 374(8) BNE 164244$ ; Нет EMT 0 ; Посылка и передача байта CMPB R0,R4 ; Он равен контрольной сумме ? BNE 164244$ ; Нет EMT 0 ; Посылка и передача байта BISB #10,R0 ; R0 = R0 OR 10(8) EMT 0 ; Посылка и передача байта CMPB #377,R0 ; Принятый байт равен 377(8) BNE 164244$ ; Нет EMT 0 ; Посылка и передача байта MOV #4,@#176560 ; Включение кольцевой сети MTPS #340 ; Запретить прерывания JMP @#50000 ; Переход на исполнение загрузчика ; Подпрограмма передачи байта в локальную сеть (исполнение команды EMT) 164500$:TSTB @#176564 ; Передатчик СА готов ? BPL 164500$ ; Нет MOVB R0,@#176566 ; Передача байта в сеть ; Подпрограмма чтения байта, пришедшего по сети (исполнение команды TRAP) 164512$:TSTB @#176560 ; Приемник СА готов ? BPL 164512$ ; Нет MOVB @#176562,R0 ; Прием байта из сети RTI ; Подпрограмма исполнения прерываний таймера 164526$:CLR @#176560 ; Включение режима загрузки INC (PC)+ ; Инкремент счетчика ожидания 164534$:.WORD 0 CMP 164534$,#1000 ; Счетчик ожидания превысил лимит времени ? BHI 164550$ ; Да RTI 164550$:JMP 164244$ ; Блок передачи в сеть 164554$:.BYTE 377,0,0,204,0,0,0,0,0,0,0,0,0,374,173,60,377,376,0,0
Так вот он какой 1801ВП-065, там оказывается есть бит 0 и бит 2 в регистре состояния приемника.
Бит 2 это вывод ST, программное управление вкл./выкл. станции из кольцевой сети.
Бит 0 ??? , разрыв линии
Получается это те самые DTR/DSR которые и должны были быть 107, 108 на стыке С2
Уже писалось, что линии квитирования ни на какие биты не выводятся, квитирование делается полностью аппаратно самим 1801ВП1-065.
Бит 0 - разрыв линии - это посылка BREAK.
А вывод ST - это не бит 2, а сигнал "свой адрес". Благодаря этому можно на неиспользуемые биты 1801ВП1-065 вешать свою обвязку без необходимости дешифрации адреса. В этом случае достаточно запомнить только младшие биты (различать приемник, передатчик, регистры данных) и реагировать на сигналы DIN, DOUT. Сигнал RPLY выставит сама 1801ВП1-065. Вот в этой обвязке есть номер станции и управление электронным коммутатором сети.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)