Программирование

Построение кадра стека на AMD64

Статья является переводом этой статьи.

В этой статье я изложу принципы построения стека на новой 64-разрядной архитектуре AMD64. Фокус внимания будет на системе Linux и других системах, соблюдающий официальный System V AMD64 ABI. Windows использует другой ABI, и я кратко упомяну его в конце статьи. Я не буду подробно описывать полное соглашение о вызовах x64, его вы можете найти в руководстве AMD64 ABI.

Далее...

Где находится вершина стека на x86?

Статья является переводом этой статьи

Я заметил, что многие программисты путаются насчёт направления, в котором растёт стек на x86, и что означает "вершина стека" и "основание стека". Кажется, что эта путаница обусловлена несоответствием направления стека в человеческих мыслях и на реальной архитектуре x86.

В этой статье я намерен распутать эту путаницу с помощью нескольких полезных диаграмм.

Далее...

Основы архитектуры ARM. Стек

Статья является вольным переводом этой статьи с добавлением своих наработок.

ARM (Advanced RISC machine) — семейство микропроцессорных ядер разработки компании ARM Limited. Эти процессоры имеют низкое энергопотребление, поэтому находят применение во встраиваемых системах и преобладают на рынке мобильных устройств. В 2007 году около 98% продаваемых мобильных телефонов были оснащены хотя бы одним процессором ARM. Они широко используются в потребительской технике, в том числе в КПК, цифровых плеерах и носителях, игровых консолях, калькуляторах, компьютерных периферийных устройствах, таких как жёсткие диски и маршрутизаторы.

Далее...

Пробуждение потока QThread другим потоком

Бывает такая ситуация, что поток нужно приостановить на какое-то время. Обычно это решается с помощью методов QThread::sleep, QThread::msleep, QThread::usleep. Однако в этом случае поток не будет никак взаимодействовать с другими потоками. А если возникнет ситуация, что поток нужно немедленно завершить (например, при завершении работы всей программы), то придётся ждать, пока время сна закончится. Время сна может быть довольно большим в зависимости от задачи, и таким образом, завершение работы программы затянется на неопределённый срок. Поэтому возникает задача: сделать такую функцию sleep, которую можно вызвать в целевом потоке для его приостановки, и которую можно прервать из другого потока. Частично для этой задачи подходит класс QWaitCondition, но его придётся немного доработать. Сегодня я покажу, как это сделать.

Далее...

Удаление элемента из вектора по типу

Бывает ситуация, когда есть базовый класс Base и его наследники Derived1 и Derived2 и есть вектор, который хранит элементы типа Base*. Может возникнуть ситуация, когда надо удалить из этого вектора все элементы, которые относятся только к определённому типу. Сегодня я расскажу, как это сделать. Объявим наши классы.

Далее...

Порядок байт

С проблемой пересылки чисел по сети рано или поздно сталкивается почти каждый программист. Проблема связана с тем, что по сети невозможно передать число, можно передать лишь массив байт. Проблему можно решить кривым способом: передавать число в формате ascii, символ за символом, но это ведёт к большому увеличению объёма передаваемых данных. Обычно число делят на байты, из которых оно состоит. Давайте возьмём число 287454020 и посмотрим, какие байты его составляют.

int a = 287454020;
int* b = &a;

С помощью отладчика посмотрим значение переменной b – туда должен попасть адрес в памяти переменной a. У меня оно оказалось 0x0032f8b8. Теперь вызовем окно просмотра памяти, введём наш адрес – и вот она, наша переменная.

Далее...

Шаблон проектирования Единицы измерения

Сегодня я попытаюсь преподнести читателям решение одной задачи, которую мне довелось воплощать. Я разрабатывал программу на C#, в которой нужно было реализовать расчет параметров воздухонагревателя Калугина с использованием разных единиц измерения, которые выбирает пользователь. Как мне представляется, способ, который я выбрал для решения задачи, весьма неплох. К тому же, в сети я не видел других опубликованных методов (ткните носом, если ошибаюсь). Поэтому я решил опубликовать своё решение и оформить его в виде шаблона проектирования. В статье рассмотрен пример реализации шаблона на C#, но при желании можно портировать его и на другие языки.

Название: Единицы измерения.

Альтернативное название: нет.

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

Далее...