Эпиграф

"The registers are the CPU’s own workspace. They are not memory, and they are not variables. They are the places where the processor keeps the data it is working on right now - like a craftsman’s bench, where only the tools and materials for the current task are kept."

"The stack is not just a pile of return addresses. It is the memory of the program’s decisions. Every call is a promise to return; every push is a thought set aside for later. In real mode, the stack pointer (SP) is the program’s short-term memory."

"Segments are not an arbitrary limitation. They are a reflection of the physical world - of address lines, of memory chips, of the way data flows from one place to another. The segment:offset model is not a hack; it is a bridge between 16-bit registers and 20-bit addresses."

- Рэй Дункан (Ray Duncan): "Programming in the MS-DOS Environment", "Advanced MS-DOS Programming"

"Registers are the fastest storage locations in the computer. But their speed is not what makes them special. What makes them special is that they are the only locations the CPU can operate on directly. You don’t compute with memory - you compute with registers, and memory is just a place to keep data between uses."

"The stack is the foundation of structured programming. Without it, there would be no functions, no recursion, no local variables. The call and ret instructions are the verbs of program flow, and the stack is their grammar."

"Segmentation is often misunderstood as a flaw, but in the context of the 8086, it was a brilliant solution. It allowed a 16-bit processor to address 1 MB of memory - a compromise between cost, complexity, and capability. The segment registers (CS, DS, SS, ES) are not overhead - they are the keys to the kingdom."

- Рэндэлл Хайд (Randall Hyde): "The Art of Assembly Language"

“Charm can fool you.”

- Ральф Броун (Ralf Brown): "Ralf Brown’s Interrupt" List" (часть 1, часть 2, часть 3)

Прежде чем погрузиться в технические детали, я хотел бы объяснить, почему эта часть статьи начинается не с кода и не с определений, а со слов тех, кто всё это создавал и понимал глубже всех.

Цитаты Рэя Дункана, Рэндэлла Хайды и Ральфа Броуна - это не просто отрывки из книг. Это фрагменты интеллектуального наследия, на котором выросло поколение программистов, реверс-инженеров и создателей игр.

  • Рэй Дункан в своих книгах, "Programming in the MS-DOS Environment" и "Advanced MS-DOS Programming", не просто объяснял API DOS. Он учил мыслить в рамках реального режима, понимать, как железо, память и прерывания работают вместе. Его работы были библией для тех, кто писал на C и ассемблере под DOS. Они до сих пор остаются одними из самых точных описаний архитектуры 16-битной системы;

  • Рэндэлл Хайд с "The Art of Assembly Language" сделал невозможное - он превратил ассемблер из "языка машин" в предмет изучения, поддающийся логике и структуре. Его книга - это не справочник, а философия программирования, где каждая инструкция рассматривается как элемент мышления. Для многих, и меня в том числе, она стала первым шагом к пониманию, как работает компьютер "изнутри";

  • Ральф Броун и его "Interrupt List" - это архив знаний, собранный вручную, без доступа к закрытым спецификациям. Его список прерываний - не просто справочник, а результат кропотливой работы, где каждый байт, каждая функция, каждый селектор были найдены, проверены и систематизированы. RBIL использовался при создании DOSBox, QEMU, FreeDOS и стал основой для всех, кто пытается понять, как работали старые программы

Изучение этих работ с последующим их осмыслением - первый шаг к настоящему реверс-инжинирингу. Именно поэтому, я с них и начал.

Регистры

На Хабре, да и в других технических сообществах, я не раз видел дискуссии о том, что такое регистры. Один говорит: "Регистры - это переменные в CPU". Другой: "Это ячейки памяти". Третий: "Это состояния, а не данные". И все они, в какой-то мере, правы. Но все они - часть истины. Я не люблю говорить: "Читайте документацию". Когда меня спрашивают, стараюсь объяснить понятно, по-человечески, без сухих цитат. Но с регистрами решил поступить иначе. Не хочу навязывать своё определение, не хочу устраивать холивар, не хочу чтобы через год кто-то написал: "Автор ошибся! Регистр - это не то, что он сказал". Я дам вам то, на что опираются все определения - ссылки на официальные документы Intel, от самого первого 4004 до современных x86-64. Это не побег от ответа, а приглашение встать на твёрдую почву. То, что я не могу объяснить без искажений, вы сможете прочитать в том, где это было впервые записано.

Процессор

Год

Документ

Ссылка

Intel 4004

1971

MCS-4 User’s Manual

archive.org

Intel 8008

1972

8008 User's Manual

archive.org

Intel 8080

1974

8080 User's Manual

archive.org

Intel 8086

1978

8086 Family Manual

archive.org

Intel 80286

1982

80286/80287 PRM

archive.org

Intel 80386

1985

80386 PPR

archive.org

Intel 80486

1989

80486 PRM

archive.org

IA-32 / x86-64

наше время

Intel SDM

intel.com

Вывод: Регистры - это программно доступные ячейки хранения, определённые архитектурой IA-32, предназначенные для временного хранения операндов, адресов, состояния выполнения и управляющих данных. Они являются основным интерфейсом между программой и процессором, используются для выполнения арифметических, логических, адресных и управляющих операций.

— На основе: Intel® 386™ Programmer’s Reference Manual (1986), Volume 1, Section 3.2 "Registers", и Intel 80486™ Microprocessor Family Programmer’s Reference Manual (1992), Chapter 3 "Architecture Overview"

Примечание: Некоторые разделы на сайте компании Intel могут быть недоступны для пользователей из России и Белоруссии. Я знаю что такое недоразумение не остановит ИТ-умников и ИТ-умниц, они смогут найти всю интересующую их информацию.

Комментарии (0)