Хранится ли N как адрес памяти в регистре или как целое число? - PullRequest
0 голосов
/ 20 сентября 2019

Say %esi - регистр, в котором хранится аргумент функции int n.%esi Хранит n как целое число в шестнадцатеричном виде или как адрес памяти?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Hex - это читаемая человеком форма сериализации (например, для печати на консоли).

Целочисленное значение также является интерпретацией битов, например, без знака и со знаком.

Внутреннекомпьютер хранит все как двоичные строкиИтак, %esi - это просто строка из 32 двоичных цифр, хотя биты упорядочены: начиная с единицы, обозначенной как младший значащий бит , и заканчивая самым старшим битом.

Эти 32-разрядные могут представлять 32-разрядный адрес, 32-разрядное целое число без знака, 32-разрядное целое число со знаком, 32-разрядное значение с плавающей запятой, перечисление, целых 4 байта или символы ASCII, или некоторые другиебитовый шаблон, как упакованное поле, или машинная инструкция.

Интерпретация на самом деле не в самом регистре, а в программе, которая его использует - закодирована в последовательностях команд своего машинного кода.


В Архитектура набора инструкций все доступные ресурсы с состоянием, такие как регистры ЦП, должны рассматриваться с точки зрения инструкций, поскольку они, по сути, являются единственным способом доступа к процессору.& memory) состояние.

Таким образом, если набор команд допускает разыменование регистра, то его можно разумно использовать для hстарый адрес или указатель.И если набор команд поддерживает умножение регистра, он может разумно содержать индекс, целое число со знаком или без знака.

Если набор инструкций не поддерживает некоторые операции, например, x86 не поддерживает 32-битовая арифметика с плавающей точкой на %esi - эти регистры still могут использоваться для хранения 32-битного значения с плавающей точкой при переходе (например, копирование из одного местоположения в другое без арифметики).


Итак, чтобы понять, как кодировать n в %esi, нам нужно знать тип данных (например, со знаком или без знака), а затем метод кодирования для этого типа данных.Из этого следует битовая комбинация, которая будет храниться в упорядоченной строке %esi из 32 битов.Эта статья в википедии, например, описывает многочисленные методы кодирования для целых чисел со знаком .Наиболее популярным для подписанного (а int подписано) является дополнение 2 (а для беззнакового - просто простая двоичная (основа 2) интерпретация последовательно значащих бит).

1 голос
/ 20 сентября 2019

int n передается по значению в asm так же, как и в C, во всех соглашениях о вызовах, потому что оно вписывается в регистр.

Соглашения о вызовах только вводят "скрытые" ссылки для более широких типов (передайте aуказатель, даже когда семантика C передается по значению.)

(или даже для небольших структур в некоторых соглашениях о вызовах. Buf, если в ESI есть аргумент arg как часть соглашения о вызовах, вы используете x86-64 System V ABI, который передает небольшие структуры в до 2 регистров.)

в шестнадцатеричном виде или в качестве адреса памяти?

Это не имеет смысла, те ненет альтернативы.Шестнадцатеричный формат - это текстовый формат сериализации для чисел (особенно двоичных чисел).

Шестнадцатеричный код - это полезный способ печати значения или указателя на значение.

Числа в регистрах никогда не бывают шестнадцатеричными,но шестнадцатеричный код полезен для таких инструментов, как отладчики, для печати их, чтобы люди могли на них смотреть.

Если бы число было сохранено в шестнадцатеричном виде, это заняло бы два разастолько места: одна шестнадцатеричная цифра ASCII на 4-битный кусочек числа, представленного строкой.

...