Основы языка ассемблера
1- Система счисления
Концепция виртуальной машины в языках ассемблера:
Компьютерное оборудование и программное обеспечение связаны друг с другом посредством концепции, называемой Virtual Machine
. Чтобы понять эту концепцию, рассмотрим программу, написанную на языке высокого уровня, таком как C++ или java. Теперь мы уже знаем, что компьютер выполняет инструкции в машинном коде, поэтому для преобразования этого кода высокого уровня в машинный код мы можем использовать интерпретацию (построчное преобразование в машинный код) или Компиляция всей программы в машинный код. С точки зрения виртуальной машины мы можем сказать, что сначала программа преобразуется из кода высокого уровня в код сборки на виртуальной машине 1, а затем эта сборка преобразуется в код машины на виртуальной машине 2.
Уровни инструкций
1-й уровень:
Уровень 1 может быть оборудованием цифровой логики.
уровень 2:
Instruction Set Architecture
входит в уровень 2, где машинный язык выполняется программой, встроенной в компьютерный микропроцессор, называемой микропрограммой.
Уровень 3:
Именно здесь работает Assembly Language
, который использует мнемонические символы, такие как ADD, SUB, MOV, которые переводятся на машинный язык.
уровень 4:
Именно здесь сегодня работает большинство из нас, то есть здесь работают языки высокого уровня, которые переводятся соответствующими компиляторами.
Двоичные целые числа:
Компьютер просто использует 0s
и 1s
на самом низком уровне, представляющем состояние off
и on
. Биты нумеруются последовательно, начиная с нуля справа и увеличиваясь слева. Бит слева называется most significant bit (MSB)
, а бит справа — least significant bit (LSB)
.
Что нужно помнить о Binary Integers
:
- Двоичные целые числа могут быть знаковыми или беззнаковыми.
- Целые числа со знаком могут быть как положительными, так и отрицательными
- Целое число без знака по умолчанию положительно
- Ноль считается положительным‹
- Точки могут быть вставлены после каждых четырех двоичных целых чисел для удобства чтения.
Преобразование двоичных целых чисел без знака в десятичные числа:
Чтобы перевести двоичное число в десятичное, мы начинаем слева и умножаем каждую цифру на степень 2
. например, двоичное число 110
будет равно 6
. Решение: 2E2 x 1 + 2E1 x 1+ 2E0 x 0 = 6
, где 2En
означает от 2 до raised power
.
Преобразование десятичных чисел без знака в двоичные:
Чтобы перевести десятичное число в двоичное, мы многократно делим число на 2, сохраняя каждый остаток в виде двоичной цифры.
Мы можем объединить двоичные биты из остатка столбца таблицы в обратном порядке (D 5 , D 4 , . . .)
, чтобы получить двоичный код 100101
. Поскольку память компьютера всегда состоит из двоичных чисел, длина которых кратна 8
, мы заполняем оставшиеся две позиции цифр слева нулями, что дает 00100101
.
Бинарное дополнение:
При добавлении двоичного числа имейте в виду, что 1+1
даст 10
с 1
переносом к следующей цифре.
00000100 + 00000111 = 00001011
Целочисленные размеры хранилища (типы данных):
Базовая единица хранения на компьютере x86
— это byte
, содержащее 8 bits
. Некоторые типы данных
- Байт 8 бит
- Слово 16 бит
- Двойное слово 32 бита
- Квадратное слово 64 бита
Шестнадцатеричное дополнение:
Шестнадцатеричное сложение работает так же, как десятичное сложение. Шестнадцатеричное сложение используется для поиска новых адресов в памяти. Например, добавим шестнадцатеричные значения 6A2 и 49A. В самом младшем разряде 2 + A = decimal 12
, поэтому переноса нет, и мы используем C
для обозначения шестнадцатеричной суммы. В следующей позиции A + 9 = decimal 19
, так что есть перенос, потому что 19 ≥ 16
числовая база. Мы вычисляем 19 MOD 16 = 3
и переносим 1 в позицию третьей цифры. Наконец, мы добавляем 1 + 6 + 4 = decimal 11
, что отображается как буква B
на третьем месте суммы. Шестнадцатеричная сумма равна B3C
.
So , 6A2 + 49A = B3C
Двоичные целые числа со знаком
Двоичные целые числа со знаком могут быть positive
или negative
. Most Significant Bit MSB
представляет знак: 0 is positive and 1 is negative
.
Представление с дополнением до двух
Negative Integers
используйте представление с дополнением до двух, используя правило, согласно которому дополнение числа до двух равно его additive inverse
. например, рассмотрим значение 11111110, его дополнение до двух будет:
Начальное значение00000001Шаг 1: поменять местами биты11111110Шаг 2: добавить 1 к значению из шага 111111110 +00000001Сумма: представление с дополнением до двух11111111
Шестнадцатеричное дополнение до двух:
В дополнении до двух шестнадцатеричных чисел мы сначала инвертируем число, а затем добавляем к нему 1. Чтобы инвертировать число, мы можем вычесть число из 15
. Вот примеры:
6A3D --> 95C2 + 1 --> 95C3
95C3 --> 6A3C + 1 --> 6A3D
Преобразование двоичного числа со знаком в десятичное:
если Most Significant Bit
равно 1
, то это означает, что число является negative signed integer
. Например, двоичное число со знаком 11110000
имеет 1
в старшем бите, что указывает на то, что это отрицательное целое число.
Начальное значение 11110000
- Шаг 1: Поменяйте местами биты 00001111
- Шаг 2: Добавьте 1 к значению, указанному выше шаг 00001111 + 1
- Шаг 3: Создайте дополнение до двух 00010000
- Шаг 4: Преобразование в десятичную = 16
Поскольку целое число было отрицательным, его ответ -16
.
Преобразование знакового десятичного числа в двоичное:
Ниже приведены шаги для этого преобразования:
- Сначала преобразуйте десятичное целое число в двоичное.
- Если исходное десятичное число было отрицательным, создайте дополнение до двух двоичного числа из предыдущего преобразования.
Например, -43
будет преобразовано в двоичный файл следующим образом:
- 43 в двоичном формате — 00101011.
- Поскольку исходное значение отрицательное, мы берем дополнение до двух его двоичного кода, которое будет 11010101. Вот как будет представлено -43.
Преобразование десятичного числа со знаком в шестнадцатеричное:
Для преобразования выполните следующие действия:
- Преобразуйте абсолютное десятичное значение в шестнадцатеричное.
- Если исходное десятичное число было отрицательным, возьмите два дополнения к его шестнадцатеричному эквиваленту.
Преобразование шестнадцатеричного числа со знаком в десятичное:
Для преобразования выполните следующие шаги, указанные ниже:
- Если дающее шестнадцатеричное число отрицательное, возьмите его дополнение до двух, в противном случае сохраните исходное число.
- Преобразуйте его в десятичное после предыдущего шага.
- если исходное значение было отрицательным, добавьте к нему знак минус.
Двоичное вычитание:
Двоичное вычитание довольно просто. Возьмем пример 01101 - 00111
. В десятичном виде оно равно 13 - 7
, поэтому ответ будет 6
, то есть 00110
в двоичном.