Програмирование на fasm под Win64 часть 2 \\\"Системы счисления, память, регистры\\\"

Дата публикации 7 июл 2017 | Редактировалось 10 янв 2018
Данная статья будет чисто теоретической, ничего программировать в ней мы не будем, но то, что здесь рассказывается знать необходимо.

Системы счисления
Начнём мы с систем счисления, они определяют способ записи чисел.
Вам хорошо знакома десятичная система счисления, в ней существует десять цифр от 0 до 9. Число в данной системе счисления представляется как сумма чисел, каждое из которых принимает значения от нуля до девяти, умноженных на 10 в соответствующей степени, например, рассмотрим число [math]32167=7\cdot 10^0+6\cdot 10^1+1\cdot 10^2+2\cdot 10^3+3\cdot 10^4[/math] Т.о. произвольное целое число x записывается в виде:
[math]x=\sum\limits_{i=0}^nc_i\cdot 10^i[/math]
Где [math]c_i[/math] – цифры от 0 до 9, а n+1 – число разрядов. Далее будем говорить, что в i-ом разряде находится цифра [math]c_i[/math], i=0 – младший разряд, i=n – старший разряд.
Аналогично определяются и другие системы счисления, например, в восьмеричной системе счисления 8 цифр: от 0 до 7 и умножаются они на степени восьмёрки, например, число в восьмеричной системе счисления [math]32167_8=7\cdot 8^0+6\cdot 8^1+1\cdot 8^2+2\cdot 8^3+3\cdot 8^4[/math]. Вполне очевидным образом можно перевести число из восьмеричной системы в десятичную просто посчитав эту сумму. Ещё одна важная система счисления – двоичная, в ней, как вы уже наверно догадались, 2 цифры 0 и 1 и каждый разряд умножается на степень двойки: [math]100101_2=1\cdot 2^0+ 0\cdot 2^1+1\cdot 2^2+0\cdot 2^3+0\cdot 2^4+1\cdot 2^5[/math]. Так же нам будет нужна шестнадцатеричная система счисления, в ней 16 цифр: от 0 до 9 – вполне очевидно, а цифры, соответствующие числам от 10 до 15 – просто первые буквы латинского алфавита: A-F, умножение происходит на степень 16. Приведём пример: [math]20EF1_{16}=1\cdot 16^0+15\cdot 16^1+14\cdot 16^2+0\cdot 16^3+2\cdot 16^4[/math].
На том, как переводить из одной системы счисления в другую я не буду останавливаться, это описано в википедии: https://ru.wikipedia.org/wiki/Позиционная_система_счисления, так же работать с перечисленными четырьмя системами счисления умеет калькулятор в windows.

Память
Для начала договоримся, о том, в чём память будем измерять. Бит (bit) – одна двоичная цифра, т.е. он может принимать значения 0 и 1. Байт (byte) – 8 бит, соответственно он может принимать значения от 0 до 255 (про числа со знаком пока умолчу). Слово (word) – 2 байта, значения от 0 до 65535. Двойной слово (double word) – 4 байта. Счетверённое слово (quad word) – 8 байт. Так же используют сокращения: килобайт – 1024 байт, мегабайт – 1024 килобайт, гигабайт – 1024 мегабайт.
Для работы с оперативной памятью существует адресное пространство, адресное пространство – множество адресов, адрес – некоторое 64-х разрядное число (64 двоичных разряда, т.е. 8 байт). Каждому адресу соответствует 1 байт (ячейка) в памяти вашей программы (в виртуальной памяти и соответственно адрес – виртуальный). Тут надо кое-что уточнить: дело в том, что виртуальная память не просто так называется виртуальной, чтобы работать с памятью по данному виртуальному адресу нужно чтобы данной ячейке виртуальной памяти соответствовала ячейка в физической памяти, иначе произойдёт ошибка.
Каждая программа (весь код и все данные) располагается в своей виртуальной памяти и доступа к чужой памяти у неё нет (на самом деле всё хитрее, и доступ к чужой памяти получить можно, но пока что я не буду об этом упоминать).

Регистры
Регистры – это память, расположенная прямо рядом с процессором, и соответственно доступ к ним гораздо быстрее, чем к оперативной памяти. У современных процессоров куча регистров у каждого из которых своё особое назначение, все эти регистры я здесь перечислять не буду, их полный список можно найти здесь: http://developer.amd.com/wordpress/media/2012/10/24593_APM_v21.pdf .
У процессора есть 16 регистров общего назначения, каждый из них содержит 64 бита (8 байт): rax, rbx, rcx, rdx, rsi, rdi, rbp, rsp, r8, r9, r10, r11, r12, r13, r14, r15. Так же можно обращаться к их младшим 32-м битам, младшим 16-и битам и младшим 8 битам. По каким именам обращаться к регистрам и их частям представлено на Рис. 1.
registers.png
Так же нам в дальнейшем понадобится регистр флагов, но о нём – в отдельной статье. Ну, а полномочия данной статьи на этом – всё.

2 4.827
_qwe8013

_qwe8013
Active Member

Регистрация:
30 ноя 2016
Публикаций:
2

Комментарии


      1. omne999666 16 июл 2020
        Теоретической частью.
        16 регистров 64-разрадных.
        Отлично и весомо.
      2. yashechka 9 июл 2017
        Спасибо, молодец!!!