добавим адрес:
ptr+2
Бум! Адресная арифметика = арифметика адресов
Стоп, а что мне мешает сделать это на ассемблере?
Что из этого неверно? Или всё-таки адресная арифметика присутствует в ассемблере?
Ну если мы начали спорить на уровне бессмысленных примеров, то есть у нас 2*3. Ой, а я могу сделать 2+2+2, значит сложение — тоже умножение!
🤨 И чем же мой пример не понятен? Я хочу услышать определение для адресной арифметики. Что там скрывается такого под арифметикой адресов, что нельзя сделать на ассемблере, или чего нет в ассемблере? Спойлер: пока что арифметические операции в ассемблере есть, и, к счастью, адреса (указатели) тоже
Мы делаем ptr + 2 в Си и ассемблере, получаем разные результаты при одинаковом значении ptr… и 2 тоже, да. Значит чего-то всё же в ассемблере нет.
Ну ладно, значит адресная арифметика это чисто Сишный синтаксис, без разницы, что там внутри. Если пишем +1, значит это уже не +4 Я бы ещё понял, если бы с умными указателями генерировался огромный код, но нет! Компилятор просто заменяет цифру. Ну если это для тебя совсем разные вещи, т.е по итогу на ассемблере адресная арифметика реализуется, но "не реализуется", тогда нет смысла что-то доказывать ptr dd num1 num1 dd 1 num2 dd 2 add dword[ptr], 4 == ptr++ // ptr += 1 Адресной арифметики нет, потому что пишем 1, а компилятор делает 4, значит в ассемблере её тоже нет. Понял.
Я рад, что ты со мной согласен. Зато на ассемблере ты иногда можешь сделать ptr dd ptr * ptr, а в Си нет такой операции. Надеюсь, тебя это утешит.
Я не согласен с тобой)) Всего-лишь минутка прояснения происходящего
Зато на ассемблере ты иногда можешь сделать ptr dd ptr * ptr Вменяемый человек такого никогда делать не будет. Адресная арифметика реализуется и на ассемблере, всего-лишь если открыть глаза, и посмотреть на размер данных
Обсуждают сегодня