Win32asm обучение

Кое-что о числах




        Win32Asm Tutorial

       

назад 8- Кое-что о числах вперед

8.0 - Кое-что о числах

Использование целых чисел или 'чисел с плавающей запятой' в большинстве языков программирования зависит только от объявления переменных. На ассемблере они совершенно различны. С 'числами с плавающей запятой', вычисления производятся специальными опкодами и сопроцессором FPU (сопроцессор для операций с 'числами плавающей запятой'). Команды для работы с 'числами с плавающей запятой' будут обсуждены позже. Сначала кое-что о целых числах. На Языке C, есть числа со знаком и без знака. Со знаком означает, что числа имеют знак (+ или -), числа без знака всегда положительны. Смотрите таблицу ниже, чтобы увидеть различия (снова, это пример байта, это работает также, как и с другими размерами):

Значение 00

01

02

03

...

7F

80

...

FC

FD

FE

FF

числа без знака 00

01

02

03

...

7F

80

...

FC

FD

FE

FF

числа со знаком 00

01

02

03

...

7F

-80

...

-04

-03

-02

-01

Так для чисел со знаком, байт разбит на два диапазона: 0 - 7F для положительных значений, 80 - FF для отрицательных значений. Для значений dword, так же: 0 - 7FFFFFFFh для положительных, 80000000 - FFFFFFFFh для отрицательных. Как вы могли заметить, отрицательные числа имеют старший разрядный набор, потому что они больше 80000000h. Этот бит называется знаковым битом.

8.1 - Со знаком или без знака?

Ни вы, ни процессор не можете увидеть, какое это число, со знаком или без знака. Хорошие новости, то, что для сложения и вычитания, не имеет значения, число со знаком или без знака:

Вычисляем: -4 + 9

FFFFFFFC + 00000009 = 00000005. (это верно)

Вычислите: 5 - (-9)

00000005 - FFFFFFF7 = 0000000E (это тоже верно ( 5 - -9 = 14)

А теперь плохие новости, то, что результат от умножения, деления или сравнения будет не верным. Следовательно есть специальные mul(умножение) и div(деление) опкоды для чисел со знаком:


imul и idiv
Imul также имеет преимущества над mul, так как может принимать непосредственные значения:

imul множитель

imul множимое, множитель

imul результат, множимое, множитель

imul результат, множимое
idiv делитель
Они такие же, как mul и div, но только производят вычисления с числами со знаком. Сравнение можно производить так же, как и с чилами без знака, но состояния флагов будут другими. Следовательно есть разные команды переходов, для чисел со знаком и без знака:
cmp ax, bx

ja смещение
Ja это без знаковый переход. Переход если 'больше'. Представте, что ax = FFFFh (без знака это FFFFh, а со знаком это -1), а bx = 0005h (без знака это 5 и со знаком это тоже 5). Так как FFFFh больше, чем значение (без знака) 0005, ja-команда выполнит переход. Но если использовать команду jg (которая является переходом со знаком):
cmp ax, bx

jg смещение
jg-команда не выполнит переход, потому, что -1 меньше, чем 5.
Просто запомните:

Разница в числах со знаком или без знака только в том,
как вы эти числа будете обрабатывать.
[наверх]

Содержание раздела