Ihads.ru

Все про недвижимость
16 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

FasmWorldПрограммирование на ассемблере FASM для начинающих и не только

FasmWorld Программирование на ассемблере FASM для начинающих и не только

Автор: xrnd | Рубрика: Учебный курс | 13-03-2010 | Распечатать запись

Для того, чтобы писать программы на ассемблере, нам необходимо знать, какие регистры процессора существуют и как их можно использовать. Все процессоры архитектуры x86 (даже многоядерные, большие и сложные) являются дальними потомками древнего Intel 8086 и совместимы с его архитектурой. Это значит, что программы на ассемблере 8086 будут работать и на всех современных процессорах x86.

Все внутренние регистры процессора Intel 8086 являются 16-битными:

Всего процессор содержит 12 программно-доступных регистров, а также регистр флагов (FLAGS) и указатель команд (IP).

Регистры общего назначения (РОН) AX, BX, CX и DX используются для хранения данных и выполнения различных арифметических и логических операций. Кроме того, каждый из этих регистров поделён на 2 части по 8-бит, с которыми можно работать как с 8-битными регистрами (AH, AL, BH, BL, CH, CL, DH, DL). Младшие части регистров имеют в названии букву L (от слова Low), а старшие H (от слова High). Некоторые команды неявно используют определённый регистр, например, CX может выполнять роль счетчика цикла.

Индексные регистры предназначены для хранения индексов при работе с массивами. SI (Source Index) содержит индекс источника, а DI (Destination Index) — индекс приёмника, хотя их можно использовать и как регистры общего назначения.

Регистры-указатели BP и SP используются для работы со стеком. BP (Base Pointer) позволяет работать с переменными в стеке. Его также можно использовать в других целях. SP (Stack Pointer) указывает на вершину стека. Он используется командами, которые работают со стеком. (Про стек я подробно расскажу в отдельной части учебного курса)

Сегментные регистры CS (Code Segment), DS (Data Segment), SS (Stack Segment) и ES (Enhanced Segment) предназначены для обеспечения сегментной адресации. Код находится в сегменте кода, данные — в сегменте данных, стек — в сегменте стека и есть еще дополнительный сегмент данных. Реальный физический адрес получется путём сдвига содержимого сегментного регистра на 4 бита влево и прибавления к нему смещения (относительного адреса внутри сегмента). Подробнее о сегментной адресации рассказывается в части 31.

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

Указатель команд IP (Instruction Pointer) содержит адрес команды (в сегменте кода). Напрямую изменять его содержимое нельзя, но процессор делает это сам. При выполнении обычных команд значение IP увеличивается на размер выполненной команды. Существуют также команды передачи управления, которые изменяют значение IP для осуществления переходов внутри программы.

Читайте так же:
Счетчики бетар страна производитель

Регистр флагов FLAGS содержит отдельные биты: флаги управления и признаки результата. Флаги управления меняют режим работы процессора:

  • D (Direction) — флаг направления. Управляет направлением обработки строк данных: DF=0 — от младших адресов к старшим, DF=1 — от старших адресов к младшим (для специальных строковых команд).
  • I (Interrupt) — флаг прерывания. Если значение этого бита равно 1, то прерывания разрешены, иначе — запрещены.
  • T (Trap) — флаг трассировки. Используется отладчиком для выполнения программы по шагам.

Признаки результата устанавливаются после выполнения арифметических и логических команд:

  • S (Sign) — знак результата, равен знаковому биту результата операции. Если равен 1, то результат — отрицательный.
  • Z (Zero) — флаг нулевого результата. ZF=1, если результат равен нулю.
  • P (Parity) — признак чётности результата.
  • C (Carry) — флаг переноса. CF=1, если при сложении/вычитании возникает перенос/заём из старшего разряда. При сдвигах хранит значение выдвигаемого бита.
  • A (Auxiliary) — флаг дополнительного переноса. Используется в операциях с упакованными двоично-десятичными числами.
  • O (Overflow) — флаг переполнения. CF=1, если получен результат за пределами допустимого диапазона значений.

Не волнуйтесь, если что-то показалось непонятным. Из дальнейшего объяснения станет ясно, что к чему и как всем этим пользоваться

В простом центральном процессоре (ЦП) ПК представляет собой цифровой счетчик (который является источником термина «программный счетчик»), который может быть одним из нескольких аппаратных регистров . Цикл команд [6] начинается с выборки , при которой ЦП помещает значение ПК на адресную шину, чтобы отправить его в память. Память отвечает, отправляя содержимое этой ячейки памяти по шине данных . (Это компьютерная модель с хранимой программой , в которой одно пространство памяти содержит как исполняемые инструкции, так и обычные данные. [7] ) После выборки ЦП переходит к выполнению, предпринимая некоторые действия в зависимости от полученного содержимого памяти. В какой-то момент в этом цикле ПК будет модифицирован так, что следующая выполняемая инструкция будет другой (обычно с приращением, так что следующая инструкция начинается с адреса памяти, следующего сразу за последней ячейкой памяти текущей инструкции) .

Как и другие регистры процессора, ПК может представлять собой набор двоичных защелок, каждая из которых представляет один бит значения ПК. [8] Количество бит (ширина ПК) относится к архитектуре процессора. Например, «32-битный» ЦП может использовать 32 бита для адресации 2 32 единиц памяти. На некоторых процессорах ширина программного счетчика зависит от адресуемой памяти; например, у некоторых контроллеров AVR есть ПК, который завершает работу после 12 бит. [9]

Читайте так же:
Как скинуть счетчик барабана brother 1512r

Если ПК является двоичным счетчиком, он может увеличиваться при подаче импульса на его вход COUNT UP, или CPU может вычислить какое-то другое значение и загрузить его в ПК с помощью импульса на его вход LOAD. [10]

Чтобы идентифицировать текущую инструкцию, ПК может быть объединен с другими регистрами, которые идентифицируют сегмент или страницу . Этот подход позволяет ПК с меньшим количеством битов, предполагая, что большинство интересующих модулей памяти находятся в непосредственной близости от него.

Декодер это тот блок, который отвечает за декодирование инструкций. Он указывает какие операции нужно выполнить АЛУ и другим блокам.

Например, инструкция addi должна сложить значение регистра $zero(Он всегда хранит ) и 20 и положить результат в регистр $t0.

На этом этапе декодер определяет, что эта инструкция:

  • Immediate type
  • Должна записать результат в регистр

И передает эти сведения следующим блокам.

После управление переходит в АЛУ. В нем обычно выполняются все математические, логические операции, а также операции сравнения чисел.

То есть, если рассмотреть ту же инструкцию addi, то на этом этапе происходит сложение и 20.

Последствия в высокоуровневом программировании [ править ]

Современные языки программирования высокого уровня по-прежнему следуют модели последовательного выполнения, и, действительно, общий способ выявления ошибок программирования — это «выполнение процедуры», в которой палец программиста идентифицирует точку выполнения, как это сделал бы ПК. Язык высокого уровня — это, по сути, машинный язык виртуальной машины [12], слишком сложный для создания аппаратного обеспечения, но вместо этого эмулируемый или интерпретируемый программным обеспечением.

Однако новые модели программирования выходят за рамки программирования с последовательным выполнением:

  • При написании многопоточной программы программист может записать каждый поток как последовательность инструкций без указания времени выполнения какой-либо инструкции относительно инструкций в других потоках.
  • В программировании , управляемом событиями , программист может писать последовательности инструкций для реагирования на события, не определяя общую последовательность для программы.
  • В программировании потока данных программист может писать каждую секцию вычислительного конвейера без указания времени относительно других секций.

Содержание

В простом центральное процессорное устройство (CPU) ПК — это цифровой счетчик (откуда происходит термин «программный счетчик»), который может быть одним из нескольких аппаратных регистры. В цикл обучения [6] начинается с принести, в котором ЦП помещает значение ПК в адресная шина отправить его в память. Память отвечает, отправляя содержимое этой ячейки памяти на шина данных. (Это компьютер с хранимой программой модель, в которой одно пространство памяти содержит как исполняемые инструкции, так и обычные данные. [7] ) После выборки ЦП переходит к казнь, предпринимая некоторые действия в зависимости от полученного содержимого памяти. В какой-то момент этого цикла ПК будет изменен так, чтобы следующая выполняемая инструкция была другой (обычно, увеличивалась так, чтобы следующая инструкция начиналась с адреса памяти, следующего сразу за последней ячейкой памяти текущей инструкции) .

Читайте так же:
Что должно стоять перед счетчиком

Как и другие регистры процессора, ПК может представлять собой набор двоичных защелок, каждая из которых представляет один бит значения ПК. [8] Количество бит (ширина ПК) зависит от архитектуры процессора. Например, «32-битный» ЦП может использовать 32 бита, чтобы иметь возможность адресовать 2 32 единиц памяти. На некоторых процессорах ширина программного счетчика зависит от адресуемой памяти; например, некоторые Контроллеры AVR есть ПК, который оборачивается после 12 бит. [9]

Если ПК является двоичным счетчиком, он может увеличиваться при подаче импульса на его вход COUNT UP, или CPU может вычислить какое-то другое значение и загрузить его в ПК с помощью импульса на его вход LOAD. [10]

Чтобы идентифицировать текущую инструкцию, ПК может быть объединен с другими регистрами, которые идентифицируют сегмент или страница. Этот подход позволяет ПК иметь меньше битов, предполагая, что большинство интересующих модулей памяти находятся в непосредственной близости от него.

Содержание

В простом центральное процессорное устройство (CPU) ПК — это цифровой счетчик (откуда происходит термин «программный счетчик»), который может быть одним из нескольких аппаратных регистры. В цикл обучения [6] начинается с принести, в котором ЦП помещает значение ПК в адресная шина отправить его в память. Память отвечает, отправляя содержимое этой ячейки памяти на шина данных. (Это компьютер с хранимой программой модель, в которой одно пространство памяти содержит как исполняемые инструкции, так и обычные данные. [7] ) После выборки ЦП переходит к казнь, предпринимая некоторые действия в зависимости от полученного содержимого памяти. В какой-то момент этого цикла ПК будет изменен так, чтобы следующая выполняемая инструкция была другой (обычно, увеличивалась так, чтобы следующая инструкция начиналась с адреса памяти, следующего сразу за последней ячейкой памяти текущей инструкции) .

Как и другие регистры процессора, ПК может представлять собой набор двоичных защелок, каждая из которых представляет один бит значения ПК. [8] Количество бит (ширина ПК) зависит от архитектуры процессора. Например, «32-битный» ЦП может использовать 32 бита, чтобы иметь возможность адресовать 2 32 единиц памяти. На некоторых процессорах ширина программного счетчика зависит от адресуемой памяти; например, некоторые Контроллеры AVR есть ПК, который оборачивается после 12 бит. [9]

Читайте так же:
Ко счетчик кто посещал страницу

Если ПК является двоичным счетчиком, он может увеличиваться при подаче импульса на его вход COUNT UP, или CPU может вычислить какое-то другое значение и загрузить его в ПК с помощью импульса на его вход LOAD. [10]

Чтобы идентифицировать текущую инструкцию, ПК может быть объединен с другими регистрами, которые идентифицируют сегмент или страница. Этот подход позволяет ПК иметь меньше битов, предполагая, что большинство интересующих модулей памяти находятся в непосредственной близости от него.

Содержание

В простом центральное процессорное устройство (CPU) ПК — это цифровой счетчик (откуда происходит термин «программный счетчик»), который может быть одним из нескольких аппаратных регистры. В цикл обучения [6] начинается с принести, в котором ЦП помещает значение ПК в адресная шина отправить его в память. Память отвечает, отправляя содержимое этой ячейки памяти на шина данных. (Это компьютер с хранимой программой модель, в которой одно пространство памяти содержит как исполняемые инструкции, так и обычные данные. [7] ) После выборки ЦП переходит к казнь, предпринимая некоторые действия в зависимости от полученного содержимого памяти. В какой-то момент этого цикла ПК будет изменен так, чтобы следующая выполняемая инструкция была другой (обычно, увеличивалась так, чтобы следующая инструкция начиналась с адреса памяти, следующего сразу за последней ячейкой памяти текущей инструкции) .

Как и другие регистры процессора, ПК может представлять собой набор двоичных защелок, каждая из которых представляет один бит значения ПК. [8] Количество бит (ширина ПК) зависит от архитектуры процессора. Например, «32-битный» ЦП может использовать 32 бита, чтобы иметь возможность адресовать 2 32 единиц памяти. На некоторых процессорах ширина программного счетчика зависит от адресуемой памяти; например, некоторые Контроллеры AVR есть ПК, который оборачивается после 12 бит. [9]

Если ПК является двоичным счетчиком, он может увеличиваться при подаче импульса на его вход COUNT UP, или CPU может вычислить какое-то другое значение и загрузить его в ПК с помощью импульса на его вход LOAD. [10]

Чтобы идентифицировать текущую инструкцию, ПК может быть объединен с другими регистрами, которые идентифицируют сегмент или страница. Этот подход позволяет ПК иметь меньше битов, предполагая, что большинство интересующих модулей памяти находятся в непосредственной близости от него.

Читайте так же:
Спу 3 прибор для проверки счетчиков

Регистры процессора

Регистрация и инструкции CPU

Регистры — это память, ближайшая к существующему процессору и, следовательно, самая быстрая; Это очень маленькие блоки памяти, которыми можно управлять напрямую с помощью блока управления процессора. Они используются для выполнения всех видов общих задач, а не только для выполнения арифметических операций.

  • Регистры типа аккумулятора : используется для арифметических операций. Каждое семейство имеет разное количество записей типа аккумулятора.
  • Регистры доступа к памяти : содержат адрес памяти данных, к которым мы хотим получить доступ из ОЗУ.
  • Регистры данных в или из памяти : Содержат данные, скопированные из памяти (чтение) или для записи по определенному адресу памяти (запись).
  • Регистры общего назначения : это регистры памяти без специальной утилиты, которые служат для хранения данных, которые должны быть вызваны как можно быстрее.
  • Счетчик команд : указывает следующую инструкцию для выполнения; Команды перехода изменяют их, когда вы хотите получить доступ не к следующей инструкции, а к другой части программы. В каждом полном командном цикле адрес памяти увеличивается на 1 и связывается с адресной шиной процессора.

Некоторые из регистров ЦП, такие как регистр счетчика программ, который указывает, на какой следующий адрес памяти указывает процессор, находятся во всех ЦП и других типах процессоров с возможностью выполнения программ, в то время как другие записи уникальны для каждого набор записей и инструкций, делающий корреляцию 1: 1 между различными ISA практически невозможной.

Даже если бы у нас был преобразователь кода инструкции 1: 1, у нас все равно были бы проблемы, потому что, хотя два процессора могут иметь одну и ту же инструкцию сложения, мы можем обнаружить, что способ использования регистров и регистров, которые они используют, различны и что есть даже регистры, которые есть в одной семье, а в других нет. Примером этих трудностей столкнулись оба Microsoft и Qualcomm при адаптации Windows 10 в ARM, чтобы все приложения x86 без проблем работали на процессоре ARM.

Однако есть решения, такие как использование программного обеспечения для перевода инструкций. Указанное программное обеспечение переводит двоичный код в промежуточный код, а затем передает его в двоичный код целевого процессора, в котором мы хотим запустить приложение. Очевидно, что этот процесс намного медленнее, и рекомендуется запускать только очень старое программное обеспечение из семейств процессоров, которые не существуют на рынке.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector