Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
NIRS_Reverse_Engineering (1).doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.85 Mб
Скачать

Представление знака в числах.

Методов представления чисел со знаком «плюс» или «минус» несколько, но в компьютерах обычно применяется метод «дополнительный код» или «two’s complement».

Разница в подходе к знаковым/без знаковым числам, собственно, нужна потому что, например, если представить 0xFFFFFFFE и 0x00000002 как без знаковое, то первое число (4294967294) больше второго (2). Если их оба представить как знаковые, то первое будет −2, которое, разумеется, меньше чем второе (2). Вот почему инструкции для условных переходов представлены в обоих версиях — и для знаковых сравнений (например, JG , JL ) и для без знаковых ( JA , JB ).

Для простоты, вот что нужно знать:

• Числа бывают знаковые и без знаковые.

Знаковые типы в Си/Си++:

– int64_t (-9,223,372,036,854,775,808..9,223,372,036,854,775,807) (- 9.2.. 9.2 квинтиллионов) или

0x8000000000000000..0x7FFFFFFFFFFFFFFF ),

– int (-2,147,483,648..2,147,483,647 (- 2.15.. 2.15Gb) или 0x80000000..0x7FFFFFFF ),

– char (-128..127 или 0x80..0x7F ),

– ssize_t .

Без знаковые:

– uint64_t (0..18,446,744,073,709,551,615 ( 18 квинтиллионов) или 0..0xFFFFFFFFFFFFFFFF ),

– unsigned int (0..4,294,967,295 ( 4.3Gb) или 0..0xFFFFFFFF ),

– unsigned char (0..255 или 0..0xFF ),

– size_t .

• У знаковых чисел знак определяется самым старшим битом: 1 означает «минус», 0 означает «плюс».

• Преобразование в большие типы данных обходится легко:

Конвертирование 32-битного значения в 64-битное. Нужно просто выставить в 0 все биты в старшей части. Но для знаковых типов это не подходит: знак числа должен быть скопирован в старшую часть числа-результата.

• Изменить знак легко:

просто инвертируйте все биты и прибавьте 1. Мы можем заметить, что число другого знака

находится на другой стороне на том же расстоянии от нуля. Прибавление единицы необходимо из-за присутствия нуля посредине.

• Инструкции сложения и вычитания работают одинаково хорошо и для знаковых и для без знаковых значений. Но для операций умножения и деления, в x86 имеются разные инструкции: IDIV / IMUL для знаковых и DIV / MUL для без знаковых.

• Еще инструкции работающие с знаковыми числами: CBW/CWD/CWDE/CDQ/CDQE, MOVSX, SAR.

Порядок байт (Endianness)

Endianness (порядок байт) это способ представления чисел в памяти.

Big-endian (от старшего к младшему).

Число 0x12345678 представляется в памяти так:

Адрес в памяти

Значение байта

+0

0х12

+1

0х34

+2

0х56

+3

0х78

Таблица 4. Представление в памяти.

CPU с таким порядком включают в себя Motorola 68k, IBM POWER.

Little-endian (от младшего к старшему).

Число 0x12345678 представляется в памяти так:

Адрес в памяти

Значение байта

+0

0х78

+1

0х56

+2

0х34

+3

0х12

Таблица 5.

CPU с таким порядком байт включают в себя Intel x86.

Bi-endian (переключаемый порядок).

CPU поддерживающие оба порядка, и его можно переключать, включают в себя ARM, PowerPC, SPARC, MIPS, IA64, и т.д.

Конвертирование.

Инструкция BSWAP может использоваться для конвертирования.

Сетевые пакеты TCP/IP используют соглашение big-endian, вот почему программа, работающая на little-endian архитектуре должна конвертировать значения.

Обычно, используются функции htonl() и htons() .

Порядок байт big-endian в среде TCP/IP также называется, «network byte order», а порядок байт на компьютере «host byte order». На архитектуре Intel x86, и других little-endian архитектурах, «host byte order» это little-endian, а вот на IBM POWER это может быть big-endian, так что на последней, htonl() и htons() не меняют порядок байт.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]