Size: a a a

Ассемблер

2021 September 06

s

s54816 in Ассемблер
Адресная арифметика — это когда умный компилятор автоматически считает правильное смещение, ориентируясь на тип. Этим она отличается от обычной.
источник

ДЦ

Дмитро Цимбалюк... in Ассемблер
короче говоря, просто удобство для программиста
источник

s

s54816 in Ассемблер
Так никто и не спорит, что просто удобство. Но нам тут рассказывают, как оно пришло из ассемблера, где его нет.
источник

d

disba1ancer in Ассемблер
источник

E

Entusiast in Ассемблер
Не пришло, а "указатели начали РАЗВИВАТЬСЯ" из ассемблера

И вообще то какое-то вы смутное определение "адресной аримфетике" дали
Нужно поправить:
Адресная арифметика (address arithmetic) — это способ вычисления адреса какого-либо объекта при помощи арифметических операций над указателями, а также использование указателей в операциях сравнения. Адресную арифметику также называют арифметикой над указателями (pointer arithmetic).

И вот при таком определении - тут уже Си, и замена +1 на +sizeof(datatype) = никак не упирается
Потому что сама адресная арифметика подразумевает под собой вычисление из указателя, адреса, чтобы получить указатель на другой адрес
А вот что там где заменяется, как и сколько вычисляется - по барабану
источник

E

Entusiast in Ассемблер
А ещё из-за использования адресной арифметики в ЯВУ (в Си, и выше - в ассемблере такое редко наблюдается (из-за малого количества абстракций) - https://habr.com/ru/company/pvs-studio/blog/97810/) - часто случаются выстрелы в ногу, и придумали "Умный указатель"
И вот его уже - нет в ассемблере
источник

d

disba1ancer in Ассемблер
на ассемблере меньше проблем из-за более высокого порога входа и соответственно большей дисциплинированности
источник

ДЦ

Дмитро Цимбалюк... in Ассемблер
ну такое
источник

E

Entusiast in Ассемблер
Ну правда есть.
Немало проблем из-за создания типов данных в ЯВУ (вот выше статья про проблемы с адресной арифметикой в Си, так там большая часть - просто из-за того, что использовался не тот тип данных)
В ассемблере с этим без заморочек
источник

s

s54816 in Ассемблер
Вменяемые люди знают, что переполнения при адресной арифметике — это UB в Си, и ни один вменяемый человек не инкрементирует указатель через -(-1). Всё остальное в статье к адресной арифметике не относится вообще никак.
источник

s

s54816 in Ассемблер
В ассемблере без заморочек? Сделай так же, как в статье. Возьми код на 32-битном асме и запусти в 64-битном режиме. Через сколько инструкций ты упадёшь, записав половину адреса в 32-битный регистр и сходив туда?
источник

E

Entusiast in Ассемблер
Ну значит с указателями и адресной арифметикой решили - это всё не связано только с ЯВУ, а относится ко всему программированию. В том числе - ассемблеру (а если так - значит и развивалось всё с ассемблера, т.к он был первым)
источник

E

Entusiast in Ассемблер
Я невменяемый, если не назвал переполнение при адресной арифметике - UB?

"ни один вменяемый человек не инкрементирует указатель через -(-1)"
Примеры взяты с реальных программ, а значит - есть исключения. Конечно, всегда легче всё спирать на человека - компилятор-то всегда всё правильно делает, если ему скормить правильный код
источник

s

s54816 in Ассемблер
Нет не решили, ты даже ту статью, которую цитировал, не удосужился доцитировать до конца. Но если тебе нравится иметь своё собственное определение адресной арифметики, мне не жалко. Просто в остальном мире оно означает другую, вполне конкретную вещь.
источник

E

Entusiast in Ассемблер
"Просто в остальном мире оно означает другую, вполне конкретную вещь."
Какую???
Я не понимаю, как может "АДРЕСНАЯ АРИФМЕТИКА" - АРИФМЕТИКА АДРЕСОВ = определяться как "умный компилятор автоматически считает правильное смещение, ориентируясь на тип" - абсурд...
источник

s

s54816 in Ассемблер
Список литературы: автор статьи и его сотрудник. Причина написания статьи: продавать (тогда ещё) Viva64. А проблемы, конечно, были. Но большинство таких проблем возникают из-за того, что в Си приходит человек, и говорит «я знаю, что происходит на уровне ассемблера, и что сделает компилятор, дай-ка я тут вот этакое проверну». И всё правда происходит так, и программа работает. На этой архитектуре, с этим компилятором или с этой конкретной версией компилятора. А потом нет. Проблема тут не в языке.
источник

E

Entusiast in Ассемблер
Хм, а я ведь даже не заметил, как всё перешло на то, что виноват Си..

Ну ладно, я "невменяемый", и проблема не в языке. Так просвятите меня в термин "адресная арифметика" - и почему же он не относится к ассемблеру?

А заодно я хотел бы от вас услышать термин "арифметика" и термин "адрес" отдельно, на всякий случай)
источник

s

s54816 in Ассемблер
Я тебя невменяемым не называл. Я про примеры с хабра.
источник

E

Entusiast in Ассемблер
Я пока что приведу самый банальный пример арифметики:
2+2
Это арифметика

А теперь добавим адрес:
ptr+2
Бум! Адресная арифметика = арифметика адресов

Стоп, а что мне мешает сделать это на ассемблере?

Что из этого неверно? Или всё-таки адресная арифметика присутствует в ассемблере?
источник

s

s54816 in Ассемблер
Ну если мы начали спорить на уровне бессмысленных примеров, то есть у нас 2*3. Ой, а я могу сделать 2+2+2, значит сложение — тоже умножение!
источник