Кое-что о числах
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.
Просто запомните:
Разница в числах со знаком или без знака только в том,
как вы эти числа будете обрабатывать.
[наверх]