19.05.2015, 21:32
|
|
Временная регистрация
Регистрация: 04.08.2013
Сообщений: 51
Сказал спасибо: 22
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Ассемблер
Программисты, подскажите пожалуйста, что значит строчка в ассемблере
goto $+2 ;непонятно именно ( $+2) ранее в программе $ нигде не определен
Последний раз редактировалось nikvas; 19.05.2015 в 22:07.
|
|
|
|
19.05.2015, 21:35
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Ассемблер
$ - деньги
+2 женщины
Все ж логично
|
|
|
|
19.05.2015, 21:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.01.2007
Сообщений: 3,123
Сказал спасибо: 61
Сказали Спасибо 1,153 раз(а) в 624 сообщении(ях)
|
Re: Ассемблер
Сообщение от Easyrider83
|
$ - деньги
+2 женщины
Все ж логично
|
Никак нет. В данном контексте женщины должны быть -2.
|
|
|
|
19.05.2015, 21:48
|
|
Временная регистрация
Регистрация: 04.08.2013
Сообщений: 51
Сказал спасибо: 22
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Ассемблер
Женщины, за деньги? Это не смешно, а по делу?
|
|
|
|
19.05.2015, 22:07
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.01.2005
Адрес: Воронеж
Сообщений: 1,384
Сказал спасибо: 24
Сказали Спасибо 243 раз(а) в 182 сообщении(ях)
|
Re: Ассемблер
По делу 2 шага вперёд. Забудь про этот "сленг" и пиши всегда goto "metka".
|
|
|
|
19.05.2015, 22:14
|
|
Временная регистрация
Регистрация: 04.08.2013
Сообщений: 51
Сказал спасибо: 22
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Ассемблер
Сообщение от otest
|
По делу 2 шага вперёд. Забудь про этот "сленг" и пиши всегда goto "metka".
|
Я разбираю чужую программу (учусь)
|
|
|
|
19.05.2015, 22:15
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Ассемблер
Сообщение от nikvas
|
по делу
|
goto $+2 это goto текущий адрес+2. Лучше пользоваться метками, в ПИК18 $+2 это переход на следующий адрес, а не через один как ожидалось.
|
|
|
Сказали "Спасибо" STM32F0
|
|
|
19.05.2015, 22:33
|
|
Временная регистрация
Регистрация: 04.08.2013
Сообщений: 51
Сказал спасибо: 22
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Ассемблер
Всем спасибо!!! Все понял.
|
|
|
|
20.05.2015, 12:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Ассемблер
Сообщение от nikvas
|
что значит строчка в ассемблере
goto $+2
|
Или jmp PC+2 в ассемблере АВР.
Чревато. Например:
breq PC+2
rjmp label1
нормально работает: если не ноль, перейти на метку.
Потом программа развивается, ассемблер вдруг пишет, что label1 слишком далеко, короткий переход не катит. Легко! вместо rjmp пишем jmp. И вляпываемся в очень неприятную ситуацию: jmp занимает 2 адреса, а не 1 как rjmp. И PC+2 прыгает на 2 слово команды jmp, где лежит кусок адреса метки. Он и выполняется.
Другой случай, когда вместо команды пишется макрос. В тексте красиво: PC+2 перепрыгивает команду. На деле - запрыгиваем на 2-ю команду макроса.
Такое очень трудно выловить. Поэтому к подобным переходам надо относиться очень осторожно.
|
|
|
|
20.05.2015, 14:59
|
|
Прописка
Регистрация: 06.03.2010
Сообщений: 2
Сказал спасибо: 36
Сказали Спасибо 27 раз(а) в 19 сообщении(ях)
|
Re: Ассемблер
Причина внедрения метки такого вида проста. В большой программе получается много меток. Цифровые имена меток неинформативны. Текстовые (смысловые) надо выдумывать. А ежели это метка "местного значения"(та точка, куда ссылка, совсем рядом) и смысл перехода очевиден без комментария, то оказался очень удобен синтаксис вида $ +(-) сколько-то байт.
Сообщение от makakus
|
Или jmp PC+2 в ассемблере АВР.
Потом программа развивается, ассемблер вдруг пишет, что label1 слишком далеко, короткий переход не катит. Легко! вместо rjmp пишем jmp. И вляпываемся в очень неприятную ситуацию: jmp занимает 2 адреса, а не 1 как rjmp. И PC+2 прыгает на 2 слово команды jmp.......
Такое очень трудно выловить. Поэтому к подобным переходам надо относиться очень осторожно.
|
Я для себя брал за правило: Только для переходов короче, чем ДО ближайшей буквенной метки или какого другого ветвления. Тогда таких фокусов не возникает. Некоторые ассемблеры сами выдают ошибку если метка вида $+(-)N адресует ДАЛЬШЕ чем ближайшая "Label". Разумная предосторожность.
Последний раз редактировалось Vlad_Petr; 20.05.2015 в 15:29.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:09.
|
|