Разное

Программист ассемблер: Должен ли программист знать ассемблер? — Хабр Q&A

Содержание

Команды ассемблера, которые являются необходимым минимумом.

Команды ассемблера и команды процессора.

Стоит пояснить, что если к вопросу подойти формально строго, то команды процессора и команды ассемблера — это не одно и то же. Ассеммблер — хоть и низкоуровневый язык программирования, но иногда он без спроса программиста «корректирует код под себя». Причём у каждого ассемблера (masm, tasm, fasm) это может быть по-разному. Самый яркий пример — команда  ret. В ассемблерном коде мы запишем ret, а реальный ассемблер ассемблирует её как retf или retn 8. Может также изменяться код, добавлением в качестве выравнивания кода команды процессора nop (об этом ниже в статье) и т.п. Чтобы не усложнять суть вопроса, под понятиями  команды процессора и команды ассемблера мы будем подразумевать одно и то же.

Команды процессора (команды ассемблера) в большинстве своём работают с аргументами, которые в ассемблере называются операндами. Система машинного кода процессоров Intel содержит более 300 команд (команды процессора, сопроцессора, MMX-расширения, XMM-расширения).

С каждым новым процессором их количество растёт. Для того, чтобы профессионально программировать, не надо зубрить и разбирать все команды процессора. При необходимости можно воспользоваться справочником. В процессе чтения статей, вы поймёте, что основная суть знания ассемблера состоит не в доскональном знании всех команд, а в понимании работы системы.

Не следует забывать, что команды процессор видит в виде цифр, которые можно рассматривать как данные. Например, команда NOP занимает один байт и её машинный код — 90h.

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

Основные (т.н. целочисленные) команды ассемблера позволяют написать практически любую программу для операционных систем MS-DOS и Windows. Количество команд ассемблера, которыми вы будете пользоваться будет расти со временем прохождения курса.

Для более детального понимания, в последствии можете обратиться к справочнику команд.

Рассмотрим команды ассемблера на практическом примере.

С использованием среды разработки TASMED или любого текстового редактора набираем код. Программа, задаст вопрос на английском языке о половой принадлежности (имеется ввиду ваш биологический пол при рождении). Если вы нажмете m (Man), будет выведено приветствие с мужчиной, если w (Woman), то с женщиной, после этого программа прекратит работу. Если будет нажата любая другая клавиша, то программа предположит, что имеет дело с гоблином, не поверит и будет задавать вам вопросы о половой принадлежности, пока вы не ответите верно.

;goblin.asm .model tiny ; for СОМ .code ; code segment start org 100h ; offset in memory = 100h (for COM) start: main proc begin: mov ah,09h mov dx,offset prompt int 21h inpt: mov ah,01h int 21h cmp al,’m’ je mode_man cmp al,’w’ je mode_woman call goblin jmp begin mode_man: mov addrs,offset man; указатель на процедуру в addrs jmp cont mode_woman: mov addrs,offset woman; указатель на процедуру в addrs cont: call word ptr addrs; косвенный вызов процедуры mov ax,4c00h int 21h main endp man proc mov ah,09h mov dx,offset mes_man int 21h ret man endp woman proc mov ah,09h mov dx,offset mes_womn int 21h ret woman endp goblin proc mov ah,09h mov dx,offset mes_gobl int 21h ret goblin endp ;DATA addrs dw 0;for procedure adress prompt db ‘Are you Man or Woman [m/w]? : $’ mes_man db 0Dh,0Ah,»Hello, Strong Man!»,0Dh,0Ah,’$’ ; строка для вывода.

Вместо ASCII смвола ‘$’ можно написать машинный код 24h mes_womn db 0Dh,0Ah,»Hello, Beautyful Woman!»,0Dh,0Ah,’$’ ; строка для вывода mes_gobl db 0Dh,0Ah,»Hello, Strong and Beautyful GOBLIN!»,0Dh,0Ah,24h ; строка для вывода. 24h = ‘$’ . len = $ — mes_gobl end start

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

;goblin.asm

.model tiny ; for СОМ

.code ; code segment start

org 100h ; offset in memory = 100h (for COM)

 

start: main proc

begin:

mov ah,09h

mov dx,offset prompt

int 21h

inpt:

mov ah,01h

int 21h

cmp al,’m’

je mode_man

cmp al,’w’

je mode_woman

call goblin

jmp begin

mode_man:

mov addrs,offset man; указатель на процедуру в addrs

jmp cont

mode_woman:

mov addrs,offset woman; указатель на процедуру в addrs

cont:

call word ptr addrs; косвенный вызов процедуры

mov ax,4c00h

int 21h

main endp

 

man proc

mov ah,09h

mov dx,offset mes_man

int 21h

ret

man endp

 

woman proc

mov ah,09h

mov dx,offset mes_womn

int 21h

ret

woman endp

 

goblin proc

mov ah,09h

mov dx,offset mes_gobl

int 21h

ret

goblin endp

 

;DATA

addrs dw 0;for procedure adress

prompt db ‘Are you Man or Woman [m/w]? : $’

mes_man db 0Dh,0Ah,»Hello, Strong Man!»,0Dh,0Ah,’$’ ; строка для вывода. Вместо ASCII смвола ‘$’ можно написать машинный код 24h

язык ассемблера — Assembly language

Язык программирования низкого уровня

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

Ассемблерный код преобразуется в исполняемый машинный код служебной программой, называемой

ассемблером . Процесс преобразования упоминается как сборка , так как в сборке в исходном коде . В языке ассемблера обычно есть один оператор на машинную инструкцию (1: 1), но часто также поддерживаются комментарии и операторы, которые являются директивами ассемблера , макросами и символическими метками программ и ячеек памяти .

Термин «ассемблер» обычно приписывается Уилксу , Уиллеру и Гиллу в их книге 1951 года «Подготовка программ для электронного цифрового компьютера» , которые, однако, использовали этот термин для обозначения «программы, которая собирает другую программу, состоящую из нескольких разделов, в единое целое. единая программа ».

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

Вычислительный этап, когда ассемблер обрабатывает программу, называется временем сборки .

Синтаксис языка ассемблера

В языке ассемблера используется мнемоника для представления каждой низкоуровневой машинной инструкции или кода операции , обычно также каждого архитектурного регистра , флага и т. Д. Для многих операций требуется один или несколько операндов для формирования полной инструкции. Большинство ассемблеров допускают именованные константы, регистры и метки для программ и ячеек памяти и могут вычислять выражения для операндов. Таким образом, программисты освобождаются от утомительных повторяющихся вычислений, а программы на ассемблере гораздо более читабельны, чем машинный код. В зависимости от архитектуры эти элементы также могут быть объединены для конкретных инструкций или режимов адресации с использованием смещений или других данных, а также фиксированных адресов. Многие ассемблеры предлагают дополнительные механизмы для облегчения разработки программ, управления процессом сборки и облегчения отладки .

Терминология

  • Макроассемблер включает в себя макроинструкцию объекта таким образом , что (параметрироваться) текст на языке ассемблера может быть представлен именем, и это имя может быть использовано для вставки расширенного текста в другой код.
  • Кросс ассемблер (смотри также кросс — компилятор ) является ассемблер , который запускается на компьютере или операционной системы (The хоста системы) другого типа от системы , на которой результирующий код должен работать (в целевой системе ). Перекрестная сборка облегчает разработку программ для систем, не имеющих ресурсов для поддержки разработки программного обеспечения, таких как встроенная система или микроконтроллер . В таком случае полученный объектный код должен быть передан в целевую систему через постоянную память (ROM, EPROM и т. Д.), Программатор (когда постоянная память встроена в устройство, как в микроконтроллерах) или канал данных, использующий либо точную побитовую копию объектного кода, либо текстовое представление этого кода (например, шестнадцатеричное Intel или S-запись Motorola ).
  • Ассемблер высокого уровня является программой , которая предоставляет языковые абстракции чаще , связанные с языками высокого уровня, такие как сложные структуры управления ( IF / THEN / ELSE , DO CASE, и т.д.) и высокого уровень абстрактных типов данных, в том числе структуры / записи, союзы, классы и множества.
  • Microassembler это программа , которая помогает подготовить микропрограмму , называемую прошивку , чтобы контролировать работу низкого уровня компьютера.
  • Мета-ассемблер является «программой , которая принимает синтаксическое и семантическое описание языка ассемблера, и генерирует ассемблер для этого языка». Ассемблеры «Meta-Symbol» для компьютеров серий SDS 9 и SDS Sigma являются мета-ассемблерами. Sperry Univac также предоставил мета-ассемблер для серии UNIVAC 1100/2200 .
  • встроенный ассемблер (или встроенный ассемблер ) — это код ассемблера, содержащийся в программе на языке высокого уровня. Это чаще всего используется в системных программах, которым необходим прямой доступ к оборудованию.

Ключевые понятия

Ассемблер

Ассемблере программа создает объектный код путем перевода комбинации мнемоники и синтаксиса для операций и режимов адресации в свои числовые эквиваленты. Это представление обычно включает в себя код операции (« код операции »), а также другие биты управления и данные. Ассемблер также вычисляет константные выражения и разрешает символические имена для ячеек памяти и других объектов. Использование символических ссылок — ключевая особенность ассемблеров, позволяющая избежать утомительных вычислений и обновления адресов вручную после модификации программы. Большинство ассемблеров также включают макросы для выполнения текстовой замены — например, для генерации общих коротких последовательностей инструкций как встроенных , а не вызываемых подпрограмм .

Некоторые ассемблеры также могут выполнять некоторые простые типы оптимизаций, специфичных для набора команд . Одним из конкретных примеров этого могут быть вездесущие ассемблеры x86 от различных поставщиков. Большинство из них, получившие название « размер перехода» , способны выполнять замену инструкций перехода (длинные переходы заменяются короткими или относительными переходами) в любом количестве проходов по запросу. Другие могут даже выполнять простую перегруппировку или вставку инструкций, например некоторые ассемблеры для архитектур RISC, которые могут помочь оптимизировать разумное планирование инструкций для максимально эффективного использования конвейера ЦП .

Ассемблеры были доступны с 1950-х годов как первый шаг над машинным языком и до языков программирования высокого уровня, таких как Fortran , Algol , COBOL и Lisp . Также было несколько классов переводчиков и полуавтоматических генераторов кода со свойствами, аналогичными как ассемблерным языкам, так и языкам высокого уровня, и Speedcode, возможно, является одним из наиболее известных примеров.

Может быть несколько ассемблеров с разным синтаксисом для конкретного процессора или архитектуры набора команд . Например, инструкция по добавлению данных памяти в регистр процессора семейства x86 может быть add eax,[ebx] в оригинальном синтаксисе Intel , тогда как она будет записана addl (%ebx),%eax в синтаксисе AT&T, используемом GNU Assembler . Несмотря на разный внешний вид, разные синтаксические формы обычно генерируют один и тот же числовой машинный код . Один ассемблер также может иметь разные режимы для поддержки вариаций синтаксических форм, а также их точных семантических интерпретаций (таких как FASM -синтаксис, TASM -синтаксис, идеальный режим и т. Д. В частном случае программирования на ассемблере x86 ).

Количество проходов

Есть два типа ассемблеров в зависимости от того, сколько проходов через исходный код необходимо (сколько раз ассемблер читает исходный код) для создания объектного файла.

  • Однопроходные ассемблеры обрабатывают исходный код один раз. Любой символ, использованный до его определения, потребует «исправлений» в конце объектного кода (или, по крайней мере, не ранее точки, где символ определен), сообщающих компоновщику или загрузчику «вернуться назад» и перезаписать заполнитель, который был оставлен там, где использовался еще не определенный символ.
  • Многопроходные ассемблеры создают таблицу со всеми символами и их значениями на первых проходах, а затем используют эту таблицу в последующих проходах для генерации кода.

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

Первоначальной причиной использования однопроходных ассемблеров был размер памяти и скорость сборки — часто второй проход требовал сохранения таблицы символов в памяти (для обработки прямых ссылок ), перемотки и повторного чтения исходного кода программы на ленте или повторного чтения колода карт или перфолента . В более поздних компьютерах с гораздо большей памятью (особенно на дисках) было достаточно места для выполнения всей необходимой обработки без повторного чтения. Преимущество многопроходного ассемблера заключается в том, что отсутствие ошибок ускоряет процесс компоновки (или загрузку программы, если ассемблер непосредственно создает исполняемый код).

Пример: в следующем фрагменте кода однопроходный ассемблер сможет определить адрес обратной ссылки BKWD при сборке оператора S2 , но не сможет определить адрес прямой ссылки FWD при сборке оператора ветвления S1 ; действительно, FWD может быть неопределенным. Двухпроходный ассемблер определит оба адреса на проходе 1, поэтому они будут известны при генерации кода на проходе 2.

S1   B    FWD
  ...
FWD   EQU *
  ...
BKWD  EQU *
  ...
S2    B   BKWD
Сборщики высокого уровня

Более сложные ассемблеры высокого уровня предоставляют такие языковые абстракции, как:

  • Объявления и вызовы процедур / функций высокого уровня
  • Расширенные структуры управления (IF / THEN / ELSE, SWITCH)
  • Абстрактные типы данных высокого уровня, включая структуры / записи, объединения, классы и множества.
  • Сложная обработка макросов (хотя доступна на обычных ассемблерах с конца 1950-х годов, например, для серий IBM 700 и IBM 7000 , а с 1960-х годов для IBM System / 360 (S / 360), среди других машин)
  • Функции объектно-ориентированного программирования, такие как классы , объекты , абстракция , полиморфизм и наследование.

См. Дополнительные сведения в разделе » Языковой дизайн» ниже.

язык ассемблера

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

Например, приведенная ниже инструкция указывает процессору x86 / IA-32 немедленно переместить 8-битное значение в регистр . Двоичный код этой инструкции — 10110, за которым следует 3-битный идентификатор регистра, который следует использовать. Идентификатор регистра AL — 000, поэтому следующий машинный код загружает регистр AL данными 01100001.

10110000 01100001

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

B0 61

Здесь это B0 означает «Переместить копию следующего значения в AL и 61 является шестнадцатеричным представлением значения 01100001, которое равно 97 в десятичной системе . Язык ассемблера для семейства 8086 предоставляет мнемонический MOV (сокращение от move ) для таких инструкций, поэтому приведенный выше машинный код может быть записан на языке ассемблера следующим образом, с пояснительным комментарием, если требуется, после точки с запятой. Это намного легче читать и запоминать.

MOV AL, 61h       ; Load AL with 97 decimal (61 hex)

В некоторых языках ассемблера (включая этот) одна и та же мнемоника, такая как MOV, может использоваться для семейства связанных инструкций для загрузки, копирования и перемещения данных, будь то непосредственные значения, значения в регистрах или ячейки памяти, на которые указывает значения в регистрах или по непосредственным (a / k / a прямым) адресам. Другие ассемблеры могут использовать отдельные мнемоники кода операции, такие как L для «перемещения памяти в регистр», ST для «перемещения регистра в память», LR для «перемещения регистра в регистр», MVI для «немедленного перемещения операнда в память» и т. Д.

Если одна и та же мнемоника используется для разных инструкций, это означает, что мнемоника соответствует нескольким различным двоичным кодам инструкций, исключая данные (например, 61h в этом примере), в зависимости от операндов, следующих за мнемоникой. Например, для процессоров x86 / IA-32 синтаксис языка ассемблера Intel MOV AL, AH представляет собой инструкцию, которая перемещает содержимое регистра AH в регистр AL . Шестнадцатеричная форма этой инструкции:

88 E0

Первый байт, 88h, идентифицирует перемещение между регистром байтового размера и другим регистром или памятью, а второй байт, E0h, кодируется (с тремя битовыми полями), чтобы указать, что оба операнда являются регистрами, источником является AH , а пункт назначения — AL .

В подобном случае, когда одна и та же мнемоника может представлять более одной двоичной инструкции, ассемблер определяет, какую команду генерировать, проверяя операнды. В первом примере операнд 61h является допустимой шестнадцатеричной числовой константой и не является допустимым именем регистра, поэтому B0 применима только инструкция. Во втором примере операндом AH является допустимое имя регистра, а не допустимая числовая константа (шестнадцатеричная, десятичная, восьмеричная или двоичная), поэтому 88 может применяться только инструкция.

Языки ассемблера всегда разрабатываются таким образом, что такая однозначность повсеместно обеспечивается их синтаксисом. Например, в ассемблере Intel x86 шестнадцатеричная константа должна начинаться с числовой цифры, чтобы шестнадцатеричное число ‘A’ (равное десятичной десятке) было записано как 0Ah или 0AH , а не как AH , в частности, чтобы оно не могло выглядеть как имя регистра AH . (Это же правило также предотвращает двусмысленность имен регистров BH , CH и DH , а также любого определяемого пользователем символа, который заканчивается на букву H и в противном случае содержит только символы, являющиеся шестнадцатеричными цифрами, например слово «ПЛЯЖ» «.)

Возвращаясь к исходному примеру, в то время как код операции x86 10110000 ( B0 ) копирует 8-битное значение в регистр AL , 10110001 ( B1 ) перемещает его в CL, а 10110010 ( B2 ) делает это в DL . Примеры для них на языке ассемблера приведены ниже.

MOV AL, 1h        ; Load AL with immediate value 1
MOV CL, 2h        ; Load CL with immediate value 2
MOV DL, 3h        ; Load DL with immediate value 3

Синтаксис MOV также может быть более сложным, как показывают следующие примеры.

MOV EAX, [EBX]	  ; Move the 4 bytes in memory at the address contained in EBX into EAX
MOV [ESI+EAX], CL ; Move the contents of CL into the byte at address ESI+EAX
MOV DS, DX        ; Move the contents of DX into segment register DS

В каждом случае мнемоника MOV транслируется ассемблером непосредственно в один из кодов операций 88-8C, 8E, A0-A3, B0-BF, C6 или C7, и программисту обычно не нужно знать или запоминать какой.

Преобразование языка ассемблера в машинный код — это работа ассемблера, а обратное, по крайней мере, частично может быть достигнуто с помощью дизассемблера . В отличие от языков высокого уровня , между многими простыми операторами ассемблера и инструкциями машинного языка существует взаимно однозначное соответствие . Однако в некоторых случаях ассемблер может предоставлять псевдоинструкции (по сути, макросы), которые расширяются до нескольких инструкций машинного языка для обеспечения обычно необходимых функций. Например, для машины, в которой отсутствует команда «переходить, если больше или равно», ассемблер может предоставить псевдоинструкцию, которая расширяется до «установить, если меньше, чем» и «перейти, если будет ноль (по результату установки инструкции)» . Большинство полнофункциональных ассемблеров также предоставляют богатый макроязык (обсуждается ниже), который используется поставщиками и программистами для генерации более сложного кода и последовательностей данных. Поскольку информация о псевдоинструкциях и макросах, определенных в среде ассемблера, отсутствует в объектной программе, дизассемблер не может реконструировать вызовы макросов и псевдоинструкций, а может только дизассемблировать фактические машинные инструкции, которые ассемблер сгенерировал из этих абстрактных объектов языка ассемблера. Аналогичным образом, поскольку комментарии в исходном файле на языке ассемблера игнорируются ассемблером и не влияют на генерируемый им объектный код, дизассемблер всегда полностью не может восстановить исходные комментарии.

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

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

Два примера процессоров с двумя разными наборами мнемоник — это семейство Intel 8080 и Intel 8086/8088. Поскольку Intel заявила об авторских правах на свою мнемонику языка ассемблера (по крайней мере, на каждой странице своей документации, опубликованной в 1970-х и начале 1980-х годов), некоторые компании, которые самостоятельно производили процессоры, совместимые с наборами инструкций Intel, изобрели свою собственную мнемонику. Zilog Z80 процессора, усиление из Intel 8080A , поддерживает все инструкции 8080A плюс многое другое; Zilog изобрел совершенно новый язык ассемблера не только для новых инструкций, но и для всех инструкций 8080A. Например, когда Intel использует мнемоклавиши MOV , МВИ , LDA , STA , LXI , LDAX , Stax , LHLD и SHLD для различных инструкций передачи данных, то Z80 ассемблере использует мнемонические LD для всех из них. Похожий случай — процессоры NEC V20 и V30 , улучшенные копии Intel 8086 и 8088 соответственно. Как и Zilog с Z80, NEC изобрела новую мнемонику для всех инструкций 8086 и 8088, чтобы избежать обвинений в нарушении авторских прав Intel. ( Сомнительно, могут ли такие авторские права быть действительными, и более поздние производители процессоров, такие как AMD и Cyrix, переиздали мнемонику инструкций Intel x86 / IA-32 точно без разрешения или юридического наказания.) Сомнительно, что на практике многие люди, которые программировали V20 и V30 фактически писал на ассемблере NEC, а не на языке Intel; поскольку любые два языка ассемблера для одной и той же архитектуры набора инструкций изоморфны (наподобие английского и Pig Latin), нет необходимости использовать собственный опубликованный язык ассемблера производителя с продуктами этого производителя.

Языковой дизайн

Основные элементы

Авторы ассемблеров сильно различаются в способах категоризации операторов и в используемой ими номенклатуре. В частности, некоторые описывают что-либо, кроме машинной мнемоники или расширенной мнемоники, как псевдооперацию (псевдооперацию). Типичный язык ассемблера состоит из 3 типов инструкций, которые используются для определения программных операций:

  • Мнемоника кода операции
  • Определения данных
  • Директивы сборки
Мнемоника опкодов и расширенная мнемоника

Инструкции (инструкции) на языке ассемблера, как правило, очень просты, в отличие от языков высокого уровня . Как правило, мнемоника — это символическое имя для одной исполняемой инструкции на машинном языке ( код операции ), и для каждой инструкции на машинном языке определена по крайней мере одна мнемоника кода операции. Каждая инструкция обычно состоит из операции или кода операции плюс ноль или более операндов . Большинство инструкций относятся к одному значению или к паре значений. Операнды могут быть непосредственными (значение, закодированное в самой инструкции), регистрами, указанными в инструкции или подразумеваемыми, или адресами данных, расположенными в другом месте в хранилище. Это определяется базовой архитектурой процессора: ассемблер просто отражает, как эта архитектура работает. Расширенная мнемоника часто используется для указания комбинации кода операции с конкретным операндом, например, ассемблеры System / 360 используют B в качестве расширенной мнемоники для BC с маской 15 и NOP («NO OPeration» — ничего не делать за один шаг) для BC с маска 0.

Расширенная мнемоника часто используется для поддержки специального использования инструкций, часто для целей, не очевидных из названия инструкции. Например, многие процессоры не имеют явной инструкции NOP, но имеют инструкции, которые можно использовать для этой цели. В 8086 процессоров команда используется для , с будучи псевдо-опкод для кодирования инструкции . Некоторые дизассемблеры распознают это и расшифровывают инструкцию как . Точно так же ассемблеры IBM для System / 360 и System / 370 используют расширенную мнемонику и для и с нулевыми масками. В архитектуре SPARC они известны как синтетические инструкции . xchg ax,axnopnopxchg ax,axxchg ax,axnopNOPNOPRBCBCR

Некоторые ассемблеры также поддерживают простые встроенные макрокоманды, которые генерируют две или более машинных инструкции. Например, некоторые ассемблеры Z80 ld hl,bc распознают команду для генерации, ld l,c за которой следует ld h,b . Иногда их называют псевдоопкодами .

Мнемоника — это произвольные символы; в 1985 году IEEE опубликовал Стандарт 694 для унифицированного набора мнемоник, который будет использоваться всеми ассемблерами. С тех пор стандарт был отменен.

Директивы данных

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

Директивы сборки

Директивы сборки, также называемые псевдоопкодами, псевдооперациями или псевдооперациями, представляют собой команды, данные ассемблеру, «предписывающие ему выполнять операции, отличные от инструкций сборки». Директивы влияют на то, как работает ассемблер, и «могут влиять на объектный код, таблицу символов, файл листинга и значения внутренних параметров ассемблера». Иногда термин псевдо-код операции зарезервирован для директив, которые генерируют объектный код, например тех, которые генерируют данные.

Имена псевдоопераций часто начинаются с точки, чтобы отличить их от машинных инструкций. Псевдооперации могут сделать сборку программы зависимой от параметров, вводимых программистом, так что одна программа может быть собрана разными способами, возможно, для разных приложений. Или псевдооперация может использоваться для управления представлением программы, чтобы ее было легче читать и поддерживать. Другое распространенное использование псевдоопераций — резервирование областей хранения для данных времени выполнения и, при необходимости, инициализация их содержимого известными значениями.

Символьные ассемблеры позволяют программистам связывать произвольные имена ( метки или символы ) с ячейками памяти и различными константами. Обычно каждой константе и переменной присваивается имя, чтобы инструкции могли ссылаться на эти местоположения по имени, тем самым продвигая самодокументированный код . В исполняемом коде имя каждой подпрограммы связано с ее точкой входа, поэтому любые вызовы подпрограммы могут использовать ее имя. Внутри подпрограмм адресатам GOTO присваиваются метки. Некоторые ассемблеры поддерживают локальные символы, которые часто лексически отличаются от обычных символов (например, использование «10 $» в качестве пункта назначения GOTO).

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

Языки ассемблера, как и большинство других компьютерных языков, позволяют добавлять комментарии к исходному коду программы, которые будут игнорироваться во время сборки. Разумные комментарии важны в программах на ассемблере, поскольку значение и цель последовательности двоичных машинных инструкций может быть трудно определить. «Необработанный» (раскомментированный) язык ассемблера, созданный компиляторами или дизассемблерами, довольно трудно читать, когда необходимо внести изменения.

Макросы

Многие ассемблеры поддерживают предопределенные макросы , а другие поддерживают макросы , определяемые программистом (и многократно повторно определяемые), включающие последовательности текстовых строк, в которые встроены переменные и константы. Определение макроса чаще всего представляет собой смесь операторов ассемблера, например, директив, символьных машинных инструкций и шаблонов для операторов ассемблера. Эта последовательность текстовых строк может включать коды операций или директивы. После определения макроса его имя может использоваться вместо мнемоники. Когда ассемблер обрабатывает такой оператор, он заменяет его текстовыми строками, связанными с этим макросом, а затем обрабатывает их, как если бы они существовали в файле исходного кода (включая, в некоторых ассемблерах, расширение любых макросов, существующих в тексте замены) . Макросы в этом смысле появились в автокодерах IBM 1950-х годов.

В языке ассемблера термин «макрос» представляет собой более всеобъемлющую концепцию, чем в некоторых других контекстах, таких как препроцессор в языке программирования C , где его директива #define обычно используется для создания коротких однострочных макросов. Макро-инструкции ассемблера, такие как макросы в PL / I и некоторых других языках, сами по себе могут быть длинными «программами», выполняемыми ассемблером путем интерпретации во время сборки.

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

Макроассемблеры часто позволяют макросам принимать параметры . Некоторые ассемблеры включают довольно сложные макроязыки, включающие такие элементы языка высокого уровня, как необязательные параметры, символьные переменные, условные выражения, манипуляции со строками и арифметические операции, которые можно использовать во время выполнения данного макроса, и позволяющие макросам сохранять контекст или обмениваться информацией. . Таким образом, макрос может генерировать множество инструкций на языке ассемблера или определений данных на основе аргументов макроса. Это может быть использовано, например, для генерации структур данных в стиле записи или « развернутых » циклов, или может генерировать целые алгоритмы на основе сложных параметров. Например, макрос «сортировки» может принять спецификацию сложного ключа сортировки и сгенерировать код, созданный для этого конкретного ключа, не нуждаясь в тестах времени выполнения, которые потребуются для общей процедуры, интерпретирующей спецификацию. Организация, использующая язык ассемблера, который был сильно расширен с помощью такого набора макросов, может считаться работающей на языке более высокого уровня, поскольку такие программисты не работают с концептуальными элементами нижнего уровня компьютера. Подчеркивая этот момент, макросы использовались для реализации ранней виртуальной машины в SNOBOL4 (1967), который был написан на языке реализации SNOBOL (SIL), языке ассемблера для виртуальной машины. Целевая машина переведет это в свой собственный код с помощью макроса-ассемблера . В то время это обеспечивало высокую степень портативности.

Макросы использовались для настройки крупномасштабных программных систем для конкретных клиентов в эпоху мэйнфреймов, а также использовались персоналом клиентов для удовлетворения потребностей своих работодателей путем создания конкретных версий операционных систем производителя. Это было сделано, например, системными программистами, работающими с IBM Conversational Monitor System / Virtual Machine ( VM / CMS ) и с надстройками IBM для «обработки транзакций в реальном времени», Системой управления информацией о клиентах CICS и ACP / TPF , Авиакомпания / финансовая система, начавшаяся в 1970-х годах и до сих пор использующая многие крупные компьютерные системы бронирования (CRS) и системы кредитных карт.

Также возможно использовать только возможности ассемблера по обработке макросов для генерации кода, написанного на совершенно разных языках, например, для генерации версии программы на COBOL с использованием программы чистого макроса ассемблера, содержащей строки кода COBOL внутри операторов времени ассемблера. указание ассемблеру сгенерировать произвольный код. IBM OS / 360 использует макросы для генерации системы . Пользователь указывает параметры, кодируя серию макросов ассемблера. При сборке этих макросов создается поток заданий для построения системы, включая язык управления заданиями и операторы управления служебными программами .

Это связано с тем, что, как было реализовано в 1960-х годах, концепция «обработки макросов» не зависит от концепции «сборки», первая из которых, говоря современным языком, представляет собой больше текстовую обработку, обработку текста, чем создание объектного кода. Концепция обработки макросов появилась и появляется в языке программирования C, который поддерживает «инструкции препроцессора» для установки переменных и выполнения условных тестов на их значениях. В отличие от некоторых предыдущих макропроцессоров внутри ассемблеров, препроцессор C не является полным по Тьюрингу, потому что ему не хватает возможности либо зацикливаться, либо «переходить», что позволяет программам зацикливаться.

Несмотря на мощь обработки макросов, он вышел из употребления во многих языках высокого уровня (за исключением C , C ++ и PL / I), оставаясь неизменным для ассемблеров.

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

foo: macro a
load a*b

Предполагалось, что вызывающий объект предоставит имя переменной, а «глобальная» переменная или константа b будет использоваться для умножения «a». Если foo вызывается с параметром a-c , происходит расширение макроса load a-c*b . Чтобы избежать возможной двусмысленности, пользователи макропроцессоров могут заключать в скобки формальные параметры внутри определений макросов, или вызывающие программы могут заключать в скобки входные параметры.

Поддержка структурного программирования

Были написаны пакеты макросов, обеспечивающие элементы структурированного программирования для кодирования потока выполнения. Самый ранний пример этого подхода был в наборе макросов Concept-14 , первоначально предложенном Харланом Миллсом (март 1970 г.) и реализованном Марвином Кесслером из IBM Federal Systems Division, который предоставил IF / ELSE / ENDIF и аналогичные блоки потока управления для ОС. / 360 программ на ассемблере. Это был способ уменьшить или исключить использование операций GOTO в коде ассемблера, что является одним из основных факторов, вызывающих спагетти-код на языке ассемблера. Этот подход был широко принят в начале 1980-х (последние дни широкомасштабного использования языка ассемблера).

Любопытным был проект A-natural , «ориентированный на поток» ассемблер для 8080 / Z80 , процессоры от Whitesmiths Ltd. (разработчики Unix- подобной операционной системы Idris и, как сообщалось, первого коммерческого компилятора C ). Язык был классифицирован как ассемблер, потому что он работал с необработанными машинными элементами, такими как коды операций , регистры и ссылки на память; но он включал синтаксис выражения, чтобы указать порядок выполнения. Скобки и другие специальные символы, наряду с конструкциями блочно-ориентированного структурированного программирования, управляют последовательностью генерируемых инструкций. A-natural был создан как объектный язык компилятора C, а не для ручного кодирования, но его логический синтаксис завоевал некоторых поклонников.

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

Ассемблеры с мощным механизмом макросов позволяют структурированное программирование с помощью макросов, таких как макрос переключателя, поставляемый с пакетом Masm32 (этот код представляет собой полную программу):

include \masm32\include\masm32rt. inc	; use the Masm32 library

.code
demomain:
  REPEAT 20
	switch rv(nrandom, 9)	; generate a number between 0 and 8
	mov ecx, 7
	case 0
		print "case 0"
	case ecx				; in contrast to most other programming languages,
		print "case 7"		; the Masm32 switch allows "variable cases"
	case 1 .. 3
		.if eax==1
			print "case 1"
		.elseif eax==2
			print "case 2"
		.else
			print "cases 1 to 3: other"
		.endif
	case 4, 6, 8
		print "cases 4, 6 or 8"
	default
		mov ebx, 19		     ; print 20 stars
		.Repeat
			print "*"
			dec ebx
		.Until Sign?		 ; loop until the sign flag is set
	endsw
	print chr$(13, 10)
  ENDM
  exit
end demomain

Использование языка ассемблера

Историческая перспектива

Языки ассемблера не были доступны в то время, когда появился компьютер с хранимой программой . Кэтлин Бут «приписывают изобретение языка ассемблера» на основании теоретической работы, которую она начала в 1947 году, работая над ARC2 в Биркбеке, Лондонский университет, после консультации Эндрю Бута (позже ее мужа) с математиком Джоном фон Нейманом и физиком Германом Голдстайном в Университете Лондона. институт перспективных исследований .

В конце 1948 г. автоматический калькулятор с электронным запоминающим устройством (EDSAC) имел ассемблер (названный «начальные заказы»), интегрированный в его программу начальной загрузки . В нем использовалась однобуквенная мнемоника, разработанная Дэвидом Уилером , который признан компьютерным обществом IEEE создателем первого «ассемблера». В отчетах о EDSAC введен термин «сборка» для процесса объединения полей в командное слово. SOAP ( Symbolic Optimal Assembly Program ) — это ассемблер для компьютера IBM 650, написанный Стэном Поли в 1955 году.

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

Когда-то языки ассемблера широко использовались для всех видов программирования. Однако к 1980-м годам (1990-е годы на микрокомпьютерах ) их использование в значительной степени было вытеснено языками более высокого уровня в поисках повышения производительности программирования . Сегодня ассемблер по-прежнему используется для прямого управления оборудованием, доступа к специализированным инструкциям процессора или для решения критических проблем с производительностью. Типичное применение драйвера , низкоуровневые встроенные системы , а также в режиме реального время система.

Исторически многие программы были написаны полностью на ассемблере. Берроуз МСР (1961) был первым компьютером , для которого операционная система не была полностью разработана на языке ассемблера; он был написан на проблемно-ориентированном языке исполнительных систем (ESPOL), диалекте Алгола. Многие коммерческие приложения также были написаны на языке ассемблера, включая большое количество программного обеспечения для мэйнфреймов IBM, написанного крупными корпорациями. COBOL , FORTRAN и некоторые PL / I в конечном итоге вытеснили большую часть этой работы, хотя ряд крупных организаций сохраняли инфраструктуры приложений на ассемблере и в 1990-е годы.

Большинство ранних микрокомпьютеров полагались на кодируемый вручную ассемблер, включая большинство операционных систем и крупных приложений. Это было связано с тем, что эти системы имели жесткие ограничения ресурсов, требовали особой архитектуры памяти и отображения и предоставляли ограниченные системные службы с ошибками. Возможно, более важным было отсутствие первоклассных компиляторов языков высокого уровня, подходящих для использования на микрокомпьютерах. Психологический фактор, возможно, также сыграл свою роль: первое поколение программистов микрокомпьютеров сохраняло увлеченность, «проволоку и плоскогубцы».

В более коммерческом контексте основными причинами использования языка ассемблера были минимальный раздут (размер), минимальные накладные расходы, большая скорость и надежность.

Типичные примеры больших программ на ассемблер с этого времени IBM PC DOS операционные системы Turbo Pascal компилятор и ранними приложения , такие как таблицы программа Lotus 1-2-3 . Язык ассемблера использовался, чтобы добиться максимальной производительности от Sega Saturn , консоли, для которой, как известно, было сложно разрабатывать и программировать игры. Другой пример — аркадная игра NBA Jam 1993 года .

Ассемблер долгое время был основным языком разработки для многих популярных домашних компьютеров 1980-х и 1990-х годов (таких как MSX , Sinclair ZX Spectrum , Commodore 64 , Commodore Amiga и Atari ST ). Во многом это было связано с тем, что интерпретируемые диалекты BASIC в этих системах предлагали недостаточную скорость выполнения, а также недостаточные возможности для использования всех преимуществ доступного оборудования в этих системах. Некоторые системы даже имеют интегрированную среду разработки (IDE) с расширенными возможностями отладки и макросов. Некоторые компиляторы, доступные для Radio Shack TRS-80 и его преемников, имели возможность комбинировать встроенный код ассемблера с программными операторами высокого уровня. После компиляции встроенный ассемблер произвел встроенный машинный код.

Текущее использование

Всегда были споры о полезности и производительности языка ассемблера по сравнению с языками высокого уровня.

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

По состоянию на июль 2017 года в индексе популярности языков программирования TIOBE ассемблер занимает 11 место, опережая , например, Visual Basic . Ассемблер можно использовать для оптимизации по скорости или для оптимизации по размеру. В случае оптимизации скорости современные оптимизирующие компиляторы, как утверждается, преобразуют языки высокого уровня в код, который может работать так же быстро, как рукописная сборка, несмотря на контрпримеры, которые можно найти. Сложность современных процессоров и подсистем памяти делает эффективную оптимизацию все более сложной для компиляторов, а также для программистов на ассемблере. Более того, повышение производительности процессора означает, что большинство процессоров большую часть времени простаивают, с задержками, вызванными предсказуемыми узкими местами, такими как промахи кеша, операции ввода-вывода и подкачка страниц . Это сделало скорость выполнения исходного кода не проблемой для многих программистов.

Есть несколько ситуаций, в которых разработчики могут выбрать использование ассемблера:

  • Написание кода для систем со старыми процессорами, которые имеют ограниченные возможности языка высокого уровня, такие как Atari 2600 , Commodore 64 и графические калькуляторы .
  • Код, который должен напрямую взаимодействовать с оборудованием, например, в драйверах устройств и обработчиках прерываний .
  • Во встроенном процессоре или DSP прерывания с большим количеством повторений требуют наименьшего количества циклов на прерывание, например прерывание, которое происходит 1000 или 10000 раз в секунду.
  • Программы, которым необходимо использовать специфические для процессора инструкции, не реализованные в компиляторе. Типичный пример — это команда побитового вращения, лежащая в основе многих алгоритмов шифрования, а также запрос четности байта или 4-битного переноса добавления.
  • Требуется автономный исполняемый файл компактного размера, который должен выполняться без обращения к компонентам времени выполнения или библиотекам, связанным с языком высокого уровня. Примеры включают встроенное ПО для телефонов, автомобильных топливных систем и систем зажигания, систем управления кондиционированием воздуха, систем безопасности и датчиков.
  • Программы с внутренними циклами, зависящими от производительности, в которых язык ассемблера предоставляет возможности оптимизации, которые трудно реализовать на языке высокого уровня. Например, линейная алгебра с BLAS или дискретное косинусное преобразование (например, версия сборки SIMD из x264 ).
  • Программы, которые создают векторизованные функции для программ на языках более высокого уровня, таких как C. В языках более высокого уровня этому иногда помогают встроенные функции компилятора, которые отображаются непосредственно на мнемонику SIMD, но, тем не менее, приводят к преобразованию сборки один в один. для данного векторного процессора.
  • Программы реального времени , такие как моделирование, системы навигации и медицинское оборудование. Например, в проводной системе телеметрия должна интерпретироваться и действовать в рамках строгих временных ограничений. Такие системы должны устранять источники непредсказуемых задержек, которые могут быть созданы (некоторыми) интерпретируемыми языками, автоматической сборкой мусора , операциями подкачки или вытесняющей многозадачностью . Однако некоторые языки более высокого уровня включают в себя компоненты времени выполнения и интерфейсы операционной системы, которые могут вызывать такие задержки. Выбор языка ассемблера или языков более низкого уровня для таких систем дает программистам большую наглядность и контроль над деталями обработки.
  • Криптографические алгоритмы, которые всегда должны выполняться строго в одно и то же время, предотвращая атаки по времени .
  • Изменяйте и расширяйте унаследованный код, написанный для мэйнфреймов IBM.
  • Ситуации, когда требуется полный контроль над окружающей средой, в ситуациях с чрезвычайно высокой степенью безопасности, когда ничто не может считаться само собой разумеющимся .
  • Компьютерные вирусы , загрузчики , определенные драйверы устройств или другие элементы, очень близкие к оборудованию или операционной системе нижнего уровня.
  • Симуляторы набора команд для мониторинга, отслеживания и отладки, где дополнительные накладные расходы сведены к минимуму.
  • Ситуации, когда не существует языка высокого уровня, на новом или специализированном процессоре, для которого нет кросс-компилятора .
  • Обратное проектирование и изменение программных файлов, таких как:
    • существующие двоичные файлы, которые могут быть или не быть изначально написаны на языке высокого уровня, например, при попытке воссоздать программы, исходный код которых недоступен или был утерян, или при взломе защиты от копирования проприетарного программного обеспечения.
    • Видеоигры (также называемые взломом ПЗУ ), что возможно несколькими способами. Наиболее широко используемый метод — изменение программного кода на уровне языка ассемблера.

Ассемблер по-прежнему преподается в большинстве программ по информатике и электронной инженерии . Хотя сегодня немногие программисты регулярно работают с языком ассемблера в качестве инструмента, основные концепции остаются важными. Такие фундаментальные темы, как двоичная арифметика , выделение памяти , обработка стека , кодирование набора символов, обработка прерываний и дизайн компилятора, было бы трудно изучать подробно, не имея представления о том, как компьютер работает на аппаратном уровне. Поскольку поведение компьютера в основном определяется его набором инструкций, логическим способом изучения таких концепций является изучение языка ассемблера. Большинство современных компьютеров имеют аналогичные наборы команд. Следовательно, изучения единственного языка ассемблера достаточно, чтобы усвоить: I) основные понятия; II) распознавать ситуации, когда использование ассемблера может быть уместным; и III) чтобы увидеть, как эффективный исполняемый код может быть создан из языков высокого уровня.

Типичные области применения

  • Язык ассемблера обычно используется в загрузочном коде системы, низкоуровневом коде, который инициализирует и тестирует оборудование системы перед загрузкой операционной системы и часто сохраняется в ПЗУ . ( BIOS в IBM-совместимых системах ПК и CP / M является примером.)
  • Язык ассемблера часто используется для низкоуровневого кода, например, для ядер операционной системы , которые не могут полагаться на доступность уже существующих системных вызовов и действительно должны реализовывать их для конкретной архитектуры процессора, на которой будет работать система.
  • Некоторые компиляторы переводят языки высокого уровня в сборку перед полной компиляцией, что позволяет просматривать код сборки в целях отладки и оптимизации.
  • Некоторые компиляторы для относительно низкоуровневых языков, таких как Pascal или C , позволяют программисту встраивать язык ассемблера непосредственно в исходный код (так называемая встроенная сборка ). Программы, использующие такие средства, могут затем создавать абстракции, используя разные языки ассемблера на каждой аппаратной платформе. Затем переносимый код системы может использовать эти зависящие от процессора компоненты через единый интерфейс.
  • Язык ассемблера полезен при обратном проектировании . Многие программы распространяются только в форме машинного кода, который легко перевести на ассемблер с помощью дизассемблера , но труднее перевести на язык более высокого уровня с помощью декомпилятора . Такие инструменты, как Interactive Disassembler, широко используют разборку для этой цели. Этот метод используется хакерами для взлома коммерческого программного обеспечения, а конкурентами — для создания программного обеспечения с аналогичными результатами от конкурирующих компаний.
  • Язык ассемблера используется для повышения скорости выполнения, особенно в ранних персональных компьютерах с ограниченной вычислительной мощностью и ОЗУ.
  • Ассемблеры могут использоваться для генерации блоков данных без накладных расходов на языке высокого уровня из отформатированного и прокомментированного исходного кода для использования в другом коде.

Смотрите также

Ноты

Рекомендации

дальнейшее чтение

  • Бартлетт, Джонатан (2004). Программирование с нуля — введение в программирование с использованием языка ассемблера Linux . Bartlett Publishing . ISBN   0-9752838-4-7 . Архивировано 24 марта 2020 года . Проверено 24 марта 2020 . [4]
  • Бриттон, Роберт (2003). Программирование на языке ассемблера MIPS . Прентис Холл . ISBN   0-13-142044-5 .
  • Калингарт, Питер (1979) [1978-11-05]. Написано в Университете Северной Каролины в Чапел-Хилл . Горовиц, Эллис (ред.). Ассемблеры, компиляторы и перевод программ . Серия «Компьютерное программное обеспечение» (1-е изд., 1-е изд.). Потомак, Мэриленд, США: Computer Science Press, Inc. ISBN   0-914894-23-4 . ISSN   0888-2088 . LCCN   78-21905 . Проверено 20 марта 2020 . (2 + xiv + 270 + 6 страниц)
  • Дантеманн, Джефф (2000). Язык ассемблера. Пошаговые инструкции . Вайли . ISBN   0-471-37523-3 .
  • Канн, Чарльз В. (2015). «Введение в программирование на языке ассемблера MIPS» . Архивировано 24 марта 2020 года . Проверено 24 марта 2020 .
  • Нортон, Питер ; Соха, Джон (1986). Книга Питера Нортона по языку ассемблера для IBM PC . Нью-Йорк, США: Брейди Букс.
  • Певец, Майкл (1980). PDP-11. Программирование на языке ассемблера и организация машин . Нью-Йорк, США: John Wiley & Sons .
  • Sweetman, Доминик (1999). См. «Запуск MIPS» . Издательство Морган Кауфманн . ISBN   1-55860-410-3 .
  • Уолдрон, Джон (1998). Введение в программирование на языке ассемблера RISC . Эддисон Уэсли . ISBN   0-201-39828-1 .
  • Юричев, Денис (2020-03-04) [2013]. «Понимание языка ассемблера (обратный инжиниринг для начинающих)» (PDF) . Архивации (PDF) с оригинала на 2020-03-24 . Проверено 24 марта 2020 .
  • «Книга сообщества ASM» . 2009. Архивировано из оригинала на 2013-05-30 . Проверено 30 мая 2013 . («Электронная книга, полная полезной информации по ASM, руководств и примеров кода» от сообщества ASM, заархивированная в интернет-архиве. )

внешние ссылки

Как выбрать себе Ассемблер? Некоторые рекомендации новичку! « DevProg: Блог для программистов

Итак, вы решили-таки изучить язык ассемблера и научиться разговаривать с компьютером на его языке? Но вы на распутьи, вы не знаете какому ассемблеру посвятить себя, свои силы, ну а главное время? Ведь их так много и каждый пытается тянуть одеяло на себя. Вы читали форумы, но всё форумное комьюнити почему то разбивается на несколько групп и защищают свой любимый компилятор? Так что же мне делать? — Спросит новичок. А вот возьмите и просто прочитайте данный материал, обещаю будет очень интересно, и в конце концов вы выделите для себя тот единственный и прекрассный ассемблер. Для вас он будет самым удобным и лучшим.

В связи с тем, что под 16 битные операционные системы никто уже не программирует, мы остановим свой выбор на 3х самых ярых конкурентах, под ОС Windows. Это как вы уже поняли TASM32, MASM32, и молодой но прыткий FASM. Итак, мы начинаем.

TASM32 (TASM 5+) — Бородатый дедушка от Borland

Дедушка то бородатый, но вот порох в пороховнице ещё есть. Это наследник от TASM, который во времена MS DOS был очень крутым ассемблером и конечно очень популярным. Но время тех операционок прошло, и TASM преобрёл второе дыхание благодаря человеку по имени !tE (ник-нейм) и благодаря ему превратился в пакет (именно пакет) программирования под Windows. В составе пакета идёт сам ассемблер, документация, примеры написания программ и заголовочные файлы. К плюсу этого ассемблера наверное можно отнести то, что он полностью совместим с ассемблером MASM, но и не стоит забывать про то, что он имеет ещё и свой режим — IDEAL, который использует свой синтаксис. Как вы наверное уже поняли, поддержкой TASM больше никто не занимается, кроме энтузиастов, коим является !tE — за что ему отдельное человеческое спасибо.

Выводы:
Поддержка: Частичная
Распространённость: Низкая
Размер пакета: 2,14 MB
Общая оценка: 3
Ссылка: Turbo Assembler 5+ v5. 3

MASM32 от Стива Хатчессона — Добры папа-Добрый сын

Именно великий человек Стив, является отцом этого пакета для программирования под Windows. Ассемблер в нём используется от Microsoft, но Стив дополнил его библиотеками, заголовочными файлами, документацией и даже собственной IDE (средой разработки) не говоря уже о всяких других полезных утилит, запрограммированных кстати тоже Стивом. Кстати Хатч упорно и стойко поддерживает свой проект выпуская всё новые и новые версии своего пакета. На MASM32 программируют колоссальное колличество разработчиков, образующие целые комьюнити. Именно пакет MASM32 от Стива дал выход в свет огромному количеству талантливых программистов на ассемблере. Долгой ему жизни и успехов в процветании.

Выводы:
Поддержка: Хорошая
Распространённость: Высокая
Размер пакета: 3,4 MB
Общая оценка: 5
Ссылка: Hutch’s MASM32

FASM (Flat Assembler) — Пархает как бабочка, но совсем не жалит.

Как обычно, самое сладкое на последок. Вот он, кроссплатформенный, с открытым исходным кодом, с красивым синтаксисом, бесплантый и очень удобный (в плане компиляции) ассемблер, созданный человеком по имени Томаш Гриштар — польским и очень талантливым программистом! На FASM написаны целые операционные системы, такие как например MenuetOS или KolibriOS. Ассемблер с неимоверно развитым макроязыком. На сегодняшний день поддерживает все инструкции 32х и 64х разрядных процессоров. Версии ассемблера есть для DOS, UNIX, LINUX и конечно же Windows. Развивается очень стремительно как и набирает вокруг себя всё больше и больше приверженцев именно этого ассемблера. Ещё очень нравится то, что FASM не нужен компоновщик, он прекрасно обходится и без него! В то время как 2 предыдущих ассемблера этого недостатка не лишены.

Выводы:
Поддержка: Отличная
Распространённость: Высокая
Размер пакета: 820 КB (с учётом того что внутри ещё и целая книга 😉 )
Общая оценка: 5+
Ссылка: Flat Assembler

Вот так, а теперь вам не составит особого труда выбрать ассемблер по себе. Но я то знаю, что вы выбирете FASM 😉 Есть недочёты или неточности? Пишите — обсудим 🙂

———-
Интересное на блогах:
PHP mail под Windows. Отправка почты из PHP скриптов
Как создать облако тегов для своего сайта на PHP

———-
Полезная заметка? Есть способ получать новые посты не заходя на этот сайт! Как? Да просто подпишись на RSS-Фид !

Понравилось это:

Нравится Загрузка…

Похожее

знания и навыки шаг за шагом

Написание ОС-загрузчиков, драйверов, переписывание области памяти и другие задачи по работе с ЭВМ реализовываются с помощью ассемблера. Выбранные книги по ассемблеру помогут понять принцип работы машинно-ориентированного языка и освоить его.

«Свежая кровь» в области программирования микроконтроллеров. Подробно изложены особенности Atmel AVR, есть перечень команд и готовые рецепты – ассемблер на примерах. Хорошая вещь для радиолюбителей и инженерно-технических работников, хотя подойдет и начинающим кодерам: затронуты история, семейства и возможности МК AVR. Стоит отметить, что введение лаконичное, быстро перетекающее в суть, поэтому сетовать на лирику не придется.

 

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

Акцент делается на работе процессора в защищенном режиме и long mode. Это незаменимая база для программирования в Win32 и Win64, которая затрагивает команды ассемблера, прерывания, механизмы трансляции и защиты с учетом режимных отличий. Рассматривается разработка оконных приложений и драйверов. Данный ассемблер учебник подойдет начинающим кодерам и тем, кто сразу перешел к программированию на ассемблере, но плохо разобрался в аппаратной платформе x86-64.

Начиная терминологией и заканчивая взаимодействием с ОС, это без преувеличений одно из лучших учебных пособий. Для тех, кто стремится освоить программирование на ассемблере, но при этом не хочет перегружать книжные полки, достаточно этого учебника. Подробно расписан синтаксис языка ассемблера NASM, затронуты регистры и память, операции различной сложности, команды, а также приведены примеры.

5 книг по проектированию архитектуры ПО

Топ 10 самых популярных книг по программированию

Что такое язык Ассемблера


Эти уроки предназначены для тех, кто вообще не знаком с Ассемблером, или имеет весьма отдаленное представление о нем. Конечно, если вы имеете опыт программирования на других языках (Basic, C/C++, Pascal…), то это вам очень поможет.

Но даже если вы хорошо знаете Ассемблер, то просмотр этого документа вам не помешает, так как здесь вы можете изучить синтаксис Emu8086.

Подразумевается, что вы имеете некоторое представление о системах счисления (HEX/BIN). Ну а если нет, то рекомендуем вам изучить раздел Системы счисления перед тем, как вы продолжите ознакомление с этим документом.

Язык Ассемблера — это язык программирования низкого уровня. Для начала вы должны ознакомиться с общей структурой компьютера, чтобы в дальнейшем понимать, о чем идет речь. Упрощенная модель компьютера:

System bus — системная шина (окрашена желтым цветом) соединяет различные компоненты компьютера.

CPU — центральный процессор — это сердце компьютера. Большинство вычислений происходит в CPU.

RAM — оперативная память (ОЗУ). В оперативную память загружаются программы для выполнения.

РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ

Процессор 8086 имеет 8 регистров общего назначения, каждый регистр имеет имя:

  • AX — регистр-аккумулятор (разделен на два регистра: AH и AL).
  • BX — регистр базового адреса (разделяется на BH / BL).
  • CX — регистр-счетчик (разделяется на CH / CL).
  • DX — регистр данных (разделяется на DH / DL).
  • SI — регистр — индекс источника.
  • DI — регистр — индекс назначения.
  • BP — указатель базы.
  • SP — указатель стека.

Несмотря на имя регистра, программист сам определяет, для каких целей использовать регистры общего назначения. Основное назначение регистра — хранение числа (переменной). Разрядность вышеописанных регистров 16 бит, т.е., например, 0011000000111001b (в двоичной системе) или 12345 в десятичной (человеческой) системе.

4 регистра общего назначения (AX, BX, CX, DX) разделены на две части. К каждой части можно обращаться как к отдельному регистру. Например, если AX=0011000000111001b, то AH=00110000b, а AL=00111001b. Старший байт обозначается буквой «H», а младший байт — буквой «L».

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

СЕГМЕНТНЫЕ РЕГИСТРЫ

  • CS — указывает на сегмент, содержащий начальный адрес текущей программы.
  • DS — обычно указывает на начальный адрес сегмента данных (переменных).
  • ES — дополнительный сегментный регистр.
  • SS — содержит начальный адрес сегмента стека.
Хотя в сегментных регистрах можно хранить любые данные, делать это неразумно. Сегментные регистры имеют строго определенное назначение — обеспечение доступа к блокам памяти.

Сегментные регистры работают совместно с регистрами общего назначения для доступа к памяти. Например, если мы хотим получить доступ к памяти с физическим адресом 12345h (в шестнадцатиричном исчислении), мы должны установить DS = 1230h и SI = 0045h. И это правильно, потому что таким образом мы можем получить доступ к памяти, физический адрес которой больше, чем значение, которое может поместиться в одиночном регистре.

Процессор вычисляет физический адрес, умножая значение сегментного регистра на 10h и прибавляя к полученному результату значение регистра общего назначения (1230h * 10h + 45h = 12345h):

Адрес, сформированный с помощью двух регистров, называется реальным адресом.

По умолчанию регистры BX, SI и DI работают с сегментным регистром DS; регистры BP и SP

Работа программистом Assembler — вакансии в Москве. Найти работу на Profi.ru

Разработка на PHP

6 часов назад

40 000–200 000 ₽

Веб-разработка. Доработка существующего продукта, тестирование. Язык программирования: PHP. Нужно доработать сайт после неудачной попытки работы с подрядчиком. Язык программирования PHP, CMS Laravel. Сайт системой похож на profi.ru или youdo, но с узкой транспортной спецификой. Задача не для новичка. Рассмотрю найм сотрудника в рамках проек.

Разработка кроссплатформенных приложений

19 декабря 2020

30 000–200 000 ₽

Разработка мобильных приложений. Разработка с нуля. Приложение: кроссплатформенное, для Windows Phone, для Android, для iOS. Устройства для масштабирования: умные часы, ТВ, планшеты, смартфоны. Хранение данных: не знаю. 103 . Онлайн поиск врачей и онлайн консультация. Дневник прием лекарств.

Создание сайтов

18 декабря 2020

150 000 ₽

Требуется написать онлайн биржу по организации мероприятий. Есть Репозиторий / задача такая. Есть проект (который нужно дописать). Фриланс для эвент индустрии ( организация мероприятий). система работы аналогичной youdo, profi.ru, remontnik.ru, fl.ru.

Разработка приложений для Android

18 декабря 2020

150 000 ₽

Разработка с нуля. Приложение: для Android, для iOS. Устройства для масштабирования: смартфоны, планшеты. Хранение данных: удалённо на моём сервере. Разработка онлайн кошелька для криптовалюты, с возможностью оплачивать пользователям онлайн покупки и делать переводы за определенный процент.

Разработка приложений для Android

17 декабря 2020

100 000 ₽

Разработка мобильных приложений. Разработка с нуля. Приложение: для iOS, для Android, Браузер. Устройства для масштабирования: смартфоны, планшеты. Хранение данных: удалённо на моём сервере. Приложение для оптимизации и автоматизации процессов в строительстве.

Разработка компьютерных игр

20 декабря 2020

100 000 ₽

Сделать проект под ключ. Многопользовательская. Жанр: Развивающая. Платформа: Unity. Графика: 2D. Развивающая игра для детей от 3 до 6 лет . Четыре уровня , по три сета на каждом уровне , два игровых персонажа .Концепт , спрайты , пропсы имеются .

Создание сайта на 1С Битрикс

16 декабря 2020

50 000–80 000 ₽

Интернет-магазин. Есть готовый дизай в фигме, товары собраны в елдиный файл, который нжуно будте загрузить в 1с. сайт будет полностью синхронизирован с 1с. есть подбробное тз сроки срочные, стоимоть готова обсуждать. Количество товаров: 300.

Simple English Wikipedia, бесплатная энциклопедия

В информатике ассемблер — это программа, которая превращает язык ассемблера в машинный код. [1] Ассемблер — это программа, которая берет базовые компьютерные инструкции и преобразует их в набор битов, которые процессор компьютера может использовать для выполнения своих основных операций. Некоторые люди называют эти инструкции языком ассемблера, а другие используют термин язык ассемблера.

Большинство компьютеров поставляются с определенным набором очень простых инструкций, которые соответствуют основным операциям, которые компьютер может выполнять.Например, команда «Загрузить» заставляет процессор перемещать строку битов из места в памяти процессора в специальное место хранения, называемое регистром. Предполагая, что процессор имеет не менее восьми регистров, каждый из которых пронумерован, следующая инструкция переместит значение (строку бит определенной длины) из ячейки памяти 3000 в место хранения, называемое регистром 8:

 л 8,3000
 

Программист может написать программу, используя последовательность этих инструкций ассемблера.Эта последовательность инструкций ассемблера, известная как исходный код или исходная программа, затем указывается программе ассемблера при запуске этой программы. Программа на ассемблере берет каждый программный оператор в исходной программе и генерирует соответствующий битовый поток или шаблон (последовательность нулей и единиц заданной длины). Выходные данные программы на ассемблере называются объектным кодом или объектной программой относительно исходной программы ввода. Последовательность нулей и единиц, которые составляют объектную программу, иногда называют машинным кодом.После этого объектную программу можно запустить (или выполнить) в любое время. На самых ранних компьютерах программисты фактически писали программы в машинном коде, но вскоре были разработаны языки ассемблера или наборы инструкций для ускорения программирования. Сегодня программирование на ассемблере используется только там, где требуется очень эффективный контроль над операциями процессора. Однако это требует знания набора команд конкретного компьютера. Исторически сложилось так, что большинство программ было написано на языках «более высокого уровня», таких как COBOL, FORTRAN, PL / I и C. Эти языки легче изучать и быстрее писать программы, чем язык ассемблера. Программа, обрабатывающая исходный код, написанный на этих языках, называется компилятором. Как и ассемблер, компилятор принимает операторы языка более высокого уровня и сводит их к машинному коду.

Более новая идея в подготовке и переносимости программ — это концепция виртуальной машины. Например, при использовании языка программирования Java операторы языка компилируются в общую форму машинного языка, известную как байт-код, которая может выполняться виртуальной машиной, своего рода теоретической машиной, которая приближает большинство компьютерных операций.Затем байт-код можно отправить на любую компьютерную платформу, которая ранее была загружена или встроена в виртуальную машину Java. Виртуальная машина знает об определенной длине инструкций и других особенностях платформы и гарантирует, что байт-код Java может работать.

  1. ↑ Peter Calingaert, Ассемблеры, компиляторы и перевод программ (Лондон: Pitman, 1979), стр. 9

Программирование на языке ассемблера MPASM ™ — Справка разработчика

Переключить навигацию

  • Инструменты разработки
    • Какие инструменты мне нужны?
    • Программные инструменты
      • Начните здесь
      • MPLAB® X IDE
        • Начни здесь
        • Установка
        • Введение в среду разработки MPLAB X
        • Переход на MPLAB X IDE
          • Переход с MPLAB IDE v8
          • Переход с Atmel Studio
        • Конфигурация
        • Плагины
        • Пользовательский интерфейс
        • Проектов
        • Файлы
        • Редактор
          • Редактор
          • Интерфейс и ярлыки
          • Основные задачи
          • Внешний вид
          • Динамическая обратная связь
          • Навигация
          • Поиск, замена и рефакторинг
          • Инструменты повышения производительности
            • Инструменты повышения производительности
            • Автоматическое форматирование кода
            • Список задач
            • Сравнение файлов (diff)
            • Создать документацию
        • Управление окнами
        • Сочетания клавиш
        • Отладка
        • Контроль версий
        • Автоматика
          • Язык управления стимулами (SCL)
          • Отладчик командной строки
          • (MDB)
          • IDE Scripting с Groovy
        • Устранение неполадок
        • Работа вне MPLAB X IDE
        • Другие ресурсы
      • Улучшенная версия MPLAB Xpress
      • MPLAB Xpress
      • MPLAB IPE
      • Программирование на C
      • Компиляторы MPLAB® XC
        • Начните здесь
        • Компилятор MPLAB® XC8
        • Компилятор MPLAB XC16
        • Компилятор MPLAB XC32
        • Компилятор MPLAB XC32 ++
        • Охват кода
        • MPLAB
      • Сборщики
      • Компилятор IAR C / C ++
      • Конфигуратор кода MPLAB (MCC)
      • MPLAB Harmony версии 2
      • MPLAB Harmony версии 3
      • Atmel® Studio IDE
      • Atmel START (ASF4)
      • Advanced Software Framework v3 (ASF3)
        • Начни здесь
        • ASF3 Учебники
          • ASF Audio Sine Tone Учебное пособие
          • Интерфейсный ЖК-дисплей
          • с SAM L22 MCU Учебное пособие
      • Блоки устройств MPLAB® для Simulink®
      • Утилиты
      • Инструменты проектирования
      • FPGA
      • Аналоговый симулятор MPLAB® Mindi ™
    • Аппаратные средства
      • Начни здесь
      • Сравнение аппаратных средств
      • Инструменты отладки и память устройства
      • Исполнительный отладчик
      • Демо-платы и стартовые наборы
      • Внутрисхемный эмулятор MPLAB® REAL ICE ™
      • Эмулятор
      • SAM-ICE JTAG
      • Внутрисхемный эмулятор
      • Atmel® ICE
      • Power Debugger
      • Внутрисхемный отладчик MPLAB® ICD 3
      • MPLAB® ICD 4 внутрисхемный отладчик
      • PICkit ™ 3 Внутрисхемный отладчик
      • Внутрисхемный отладчик MPLAB® PICkit ™ 4
      • MPLAB® Snap
      • MPLAB PM3 Универсальный программатор устройств
      • Принадлежности
        • Заголовки эмуляции и пакеты расширения эмуляции
        • Пакеты расширения процессора
        • и заголовки отладки
          • Начни здесь
          • Обзор
          • PEP и отладочных заголовков
          • Требуемый список заголовков отладки
            • Таблица обязательных отладочных заголовков
            • AC162050, AC162058
            • AC162052, AC162055, AC162056, AC162057
            • AC162053, AC162054
            • AC162059, AC162070, AC162096
            • AC162060
            • AC162061
            • AC162066
            • AC162083
            • AC244023, AC244024
            • AC244028
            • AC244045
            • AC244051, AC244052, AC244061
            • AC244062
          • Дополнительный список заголовков отладки
            • Дополнительный список заголовков отладки — устройства PIC12 / 16
            • Необязательный список заголовков отладки — устройства PIC18
            • Дополнительный список заголовков отладки — Устройства PIC24
          • Целевые следы заголовка отладки
          • Подключения к заголовку отладки
      • SEGGER J-Link
      • Решения для сетевых инструментов
      • K2L
      • Рекомендации по проектированию средств разработки
      • Ограничения отладки — микроконтроллеры PIC
      • Инженерно-технические примечания (ETN) [[li]] Встраиваемые платформы chipKIT ™

68000 Assembly — Wikibooks, открытые книги для открытого мира

Этот документ содержит информацию о том, как программировать микропроцессоры Motorola серии 68K на языке ассемблера.

Микропроцессоры Motorola серии 68K использовались многими производителями:

  • Apple в своих компьютерах Macintosh, пока они не перешли на микропроцессоры серии PowerPC, и в своих принтерах LaserWriter, пока они не перешли на микропроцессоры серии AMD 29000.
  • Коммодор Amiga
  • Sun, HP, SGI и другие рабочие станции Unix 80-х до их перехода на процессоры RISC, такие как SPARC, PA-RISC и MIPS.
  • Линия персональных компьютеров Atari ST / STE / TT / Falcon.
  • Sinclair для Sinclair QL (который также был переименован в ICL по одному на стол).
  • NeXT, прежде чем они стали компанией, производящей только программное обеспечение.
  • Серия персональных компьютеров Sharp X68000.
  • Palm в своих карманных КПК, пока они не перешли на микропроцессоры серии ARM. Однако почти все приложения работают в режиме эмуляции 68K.
  • 680×0 был популярен в игровых автоматах до середины 1990-х годов. Его можно найти во многих играх Capcom.
  • Sega Mega Drive (Genesis в США) использовал 68000 в качестве основного процессора. Его преемник, Saturn, использовал его в качестве звукового процессора.
  • The Sequential Circuits Prophet VS, Ensoniq EPS и несколько других синтезаторов использовали 68000 в конце 80-х.
  • Atari Jaguar имел 68000 в качестве центрального процессора среди многих специализированных процессоров.
  • Калькуляторы Texas Instruments TI-89, TI-92, Voyage 200 и TI-89 Titanium.
  • Tandy / Radio Shack в своих TRS-80 Model 16 1982, 16B 1983 и Tandy 6000 1984, работающих под управлением Xenix OS 2.0 1981 и 3.0 1982 лицензированы у Microsoft, которые являются лицензированными вариантами AT&T UNIX OS 7 th Edition 1979 и System III 1981 соответственно.
  • Многие встраиваемые компьютерные системы используют микропроцессоры семейства 68K, часто под управлением операционных систем реального времени.

Следует отметить, что PowerPC не двоично совместим с процессором 68K. Их языки ассемблера совершенно разные. Однако Apple написала эмулятор (на языке ассемблера PowerPC), который позволяет микропроцессорам PowerPC интерпретировать код машинного языка, написанный для микропроцессоров 68K, хотя и со значительным снижением производительности по сравнению с машинным языком PowerPC.

Motorola 68K — это ЦП на базе CISC, который работает с памятью, организованной по принципу Big-Endian.

Дополнительная литература [править]

Регистры [править]

За исключением 16-битного регистра состояния, все регистры 68000 имеют 32-битную ширину.

Имеется восемь регистров данных: d0, d1, d2, d3, d4, d5, d6 и d7. Они предназначены для хранения чисел, с которыми будут выполняться различные математические и логические операции.

Имеется семь адресных регистров: a0, a1, a2, a3, a4, a5 и a6.Обычно они используются как указатели.

Имеется один активный указатель стека: SP, также называемый a7. Обычно процессор находится в пользовательском режиме. В пользовательском режиме SP относится к регистру указателя стека пользователя (USP). (Во время прерываний активный указатель стека SP представляет собой другой регистр, называемый указателем стека прерываний или указателем системного стека. Процессоры 68020 и выше имеют третий регистр, называемый указателем главного стека. Ни к ISP, ни к MSP нельзя получить доступ в пользовательском режиме. ).

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

Программный счетчик (ПК) указывает на текущую инструкцию. На 68000 на любые контакты выводятся только младшие 24 бита, что дает максимальный диапазон адресации 16 МБ. Программный счетчик изменяется автоматически при загрузке новой инструкции или при использовании инструкции BRA, Bcc, BSR, JMP, JSR, RTS или RTE. Его также можно использовать в качестве указателя в режимах относительной адресации ПК.

Регистр кода состояния (CCR) состоит из младшего байта регистра состояния (SR). В пользовательском режиме доступен только младший байт, из которых полезны только первые пять бит.В режиме супервизора доступен весь 16-битный регистр. Реестр выглядит так:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Т1 T0 S M 0 I2 I1 I0 0 0 0 Х N Z В С

Вот декодированное содержимое регистра:

Бит Описание
С Нести
В Перелив
Z Ноль
N Отрицательный
Х Расширить
I0 Бит 1 маски приоритета прерывания
I1 Бит 2 маски приоритета прерывания
I2 Бит 3 маски приоритета прерывания
млн Главный выключатель / прерыватель. Определяет, какой режим стека использовать, если установлен S. Если M ясно, SP относится к ISP, иначе SP относится к MSP. Этот бит всегда сброшен на моделях процессоров ниже 68020.
Ю Флаг режима супервизора. Если ясно, SP относится к USP. Если установлено, посмотрите на M, чтобы определить, на какой стек указывает SP.
T0 Бит отслеживания 1. Если установлен, отслеживать изменение выполнения программы. Этот бит всегда сбрасывается на моделях процессоров ниже 68020.
Т1 Бит трассировки 2.Если установлено, трассировка разрешена по любой инструкции. НЕ УСТАНАВЛИВАЙТЕ ОБЕ ТРЕЙСОВЫЕ БИТЫ ОДНОВРЕМЕННО!

Режимы адресации [править]

n — число от 0 до 7, обозначающее, какой регистр использовать.

Немедленная адресация с помощью регистров данных [править]

Синтаксис ассемблера

Непосредственно работают с содержимым регистра данных. Пример:

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

; допустим
              ; D0 = FFFFFFFF D1 = 01234567
 MOVE.B D1, D0; копирует байт из источника
              ; D0 = FFFFFF67 D1 = 01234567
....
              ; допустим
              ; D0 = FFFFFFFF D1 = 01234567
 MOVE.W D1, D0; копирует Word из источника
              ; D0 = FFFF4567 D1 = 01234567
 

Немедленная адресация с помощью адресных регистров [править]

Синтаксис ассемблера:

Непосредственно работают с содержимым адресного регистра.Пример:

Копирует целые A1 в D0. После инструкции оба регистра содержат одинаковую информацию. При передаче с регистрами ADDRESS вы должны использовать слово или длинное слово. Когда слово передается в адресный регистр, бит 15 (бит знака) будет скопирован через все старшее слово (биты 16-31). Если бы это было не так, отрицательное число стало бы положительным.

; допустим
              ; D0 = FFFFFFFF A1 = 01234567
 MOVE.W A1, D0; копирует Word из источника
              ; D0 = FFFF4567 A1 = 01234567
....
              ; допустим
              ; D0 = 01234567 A1 = FFFFFFFF
 MOVE.W D0, A1; копирует Word из источника
              ; D0 = 01234567 A1 = 00004567
              ; знак на А1, изменен
....
              ; допустим
              ; D0 = 0000FFFF A1 = 00000000
 MOVE.W D0, A1; копирует Word из источника
              ; D0 = 0000FFFF A1 = FFFFFFFF
              ; знак на А1, изменен
 

Косвенная адресация [править]

Синтаксис ассемблера:

Оперировать с ячейкой памяти, указанной An.Например:

 lea $ 1234, A1
move.w D0, (A1)
 

переместит первые 16 бит D0 в слово, начинающееся с $ 1234. Другой пример:

Копирует длинное слово, начиная с адреса, хранящегося в A0 (вы говорите, что A0 указывает на длинное слово). Если вы ссылаетесь на слово или длинное слово, адрес в адресном регистре должен быть ЧЕТНЫМ числом. Позаботьтесь об этом !!!

; допустим
                ; D0 = FFFFFFFF A1 = 00001000
                ; мем.адрес 1000 долларов США = 01234567
 MOVE.L (A1), D0; копирует длинное слово, начиная с адреса памяти, хранящегося в A1, в D0
                ; D0 = 01234567 A1 = 00001000
                ; mem.addr. 1000 долларов США = 01234567
 

Косвенная адресация с постинкрементом [править]

Синтаксис ассемблера:

То же, что и при косвенной адресации, но после выполнения инструкции значение An будет увеличено на размер операции. Единственное исключение — байтовые операции на A7 — этот регистр должен указывать на четный адрес, поэтому он всегда будет увеличиваться как минимум на 2.Пример:

Копирует в D0 длинное слово, на которое указывает A1, и увеличивает A1 на 4 (из-за Long).

; допустим
                 ; D0 = FFFFFFFF A1 = 00001000
                 ; mem. addr. 1000 долларов США = 01234567
 MOVE.L (A1) +, D0; копирует длинное слово, начиная с адреса, хранящегося в A1, в D0
                 ; затем увеличиваем A1 на 4
                 ; D0 = 01234567 A1 = 00001004
                 ; mem.addr. 1000 долларов США = 01234567
 

Косвенная адресация с предварительным приращением [править]

Синтаксис ассемблера:

То же, что и при косвенной адресации, но значение An будет уменьшено на размер операции ПЕРЕД выполнением инструкции.Единственным исключением являются байтовые операции на A7 — этот регистр должен указывать на четный адрес, поэтому он всегда будет уменьшаться как минимум на 2. Обратите внимание, что нет режима адресации постдекремента или прединкремента. Пример:

Сначала уменьшает A0 на 4 (размер операнда), затем копирует длинное слово, начиная с адреса, сохраненного в A0, в D2.

; допустим
                 ; D0 = FFFFFFFF A1 = 000010A8
                 ; mem. addr. 10A4 = 01234567
 MOVE.L - (A1), D0; сначала уменьшает A1 на 4, A1 = 000010A4
                 ; затем копирует длинное слово, начиная с адреса, хранящегося в A1, в D0
                 ; D0 = 01234567
                 ; мем.адрес 10A4 = 01234567
 

Косвенная адресация со смещением [править]

Синтаксис ассемблера:

Оперировать с местом, на которое указывает x + An, где x — это 16-битовое непосредственное значение. Все перечисленные синтаксисы эквивалентны, но некоторые ассемблеры не принимают их все.

Косвенная адресация с индексом [править]

Синтаксис ассемблера:

  • x (Ан, Дн.Ш)
  • x (An, Dn.W * масштаб)
  • x (Ан, Дн.Л)
  • x (An, Dn.L * масштаб)
  • х (Ан, Ан.Вт)
  • x (масштаб An, An.W *)
  • х (An, An.L)
  • x (масштаб An, An.L *)
  • (x) (Ан, Дн.Ш)
  • (x) (An, Dn.W * масштаб)
  • (x) (Ан, Дн.Л)
  • (x) (An, Dn. L * масштаб)
  • (x) (An, An.W)
  • (x) (An, An.W * масштаб)
  • (x) (An, An.L)
  • (x) (шкала An, An.L *)
  • (x, An, Dn.W)
  • (x, An, Dn.W * масштаб)
  • (х, Ан, Дн.Л)
  • (x, An, Dn.L * масштаб)
  • (x, An, An.W)
  • (x, An, An.W * масштаб)
  • (х, Ан, Ан.L)
  • (x, An, An.L * шкала)

То же, что и выше, но будет добавлен еще один регистр. Масштаб может быть 1, 2, 4 или 8. Масштаб поддерживается не на всех устройствах. Не все ассемблеры принимают все перечисленные синтаксисы.

Абсолютная близкая адресация [править]

Синтаксис ассемблера:

Действуйте в месте, указанном xxx. xxx расширяется ассемблером по знаку. Вы можете написать это как со скобками, так и без них, и большинство ассемблеров могут использовать любую из них.Что вы выберете, во многом зависит от личных предпочтений, но большинство людей находят (xxx) .W легче читать.

Абсолютная дальняя адресация [править]

Синтаксис ассемблера:

Действуйте в месте, указанном xxx. xxx расширяется ассемблером по знаку. Некоторые инструкции принимают только один или другой из близких или дальних абсолютных адресов, таким образом, разделение. Как и в случае с абсолютным рядом, круглые скобки можно поставить на свое усмотрение.

Программный счетчик косвенный со смещением [править]

Синтаксис ассемблера:

Оперировать значением памяти в x + PC, где x — это 16-битное непосредственное значение.Обратите внимание, что PC — это адрес добавочного слова, в котором хранится x (сразу после слова инструкции). Все синтаксисы эквивалентны, но некоторые ассемблеры не принимают их всех.

Программный счетчик косвенный с индексом [править]

Синтаксис ассемблера:

  • x (ПК, Дн.Ш)
  • x (ПК, Ду Ш * шкала)
  • x (ПК, Ду)
  • x (ПК, Ду L * шкала)
  • x (ПК, An.W)
  • x (ПК, масштаб An.W *)
  • x (ПК, An.L)
  • x (ПК, шкала An.L *)
  • (x) (ПК, Дн.Вт)
  • (x) (PC, Dn. W * шкала)
  • (x) (ПК, Дн. Л)
  • (x) (ПК, Ду L * шкала)
  • (x) (ПК, An.W)
  • (x) (ПК, шкала An.W *)
  • (x) (ПК, An.L)
  • (x) (ПК, шкала An.L *)
  • (x, ПК, Дн.Ш)
  • (x, PC, Dn.W * масштаб)
  • (x, ПК, Дн.л)
  • (x, PC, Dn.L * шкала)
  • (x, ПК, An.W)
  • (x, PC, An.W * масштаб)
  • (x, ПК, An.L)
  • (x, PC, An.L * scale)

Аналогично PC со смещением, но добавлен еще один регистр.Масштаб может быть 1, 2, 4 или 8. Масштаб поддерживается не на всех устройствах. Некоторые ассемблеры не принимают определенные синтаксисы.

Косвенная адресация памяти [править]

Синтаксис ассемблера:

  • ([bd, An], od)
  • ([bd, An], An.W * масштаб, od)
  • ([bd, An], An.L * масштаб, od)
  • ([bd, An], Dn.W * масштаб, od)
  • ([bd, An], Dn.L * масштаб, od)
  • ([bd, An, An.W * scale], od)
  • ([bd, An, An. L * scale], od)
  • ([bd, An, Dn.W * scale], od)
  • ([bd, An, Dn.L * масштаб], od)
  • ([bd, PC], od)
  • ([bd, PC], An.W * масштаб, od)
  • ([bd, PC], An.L * scale, od)
  • ([bd, PC], Dn.W * масштаб, od)
  • ([bd, PC], Dn.L * масштаб, od)
  • ([bd, PC, An.W * scale], od)
  • ([bd, PC, An.L * scale], od)
  • ([bd, PC, Dn.W * scale], od)
  • ([bd, PC, Dn.L * scale], od)

Эти режимы адресации выполняют два доступа к памяти — сначала чтение в таблицу адресов, а затем фактическое чтение или запись. Поддерживается не всеми устройствами.В режиме косвенного прединдексирования памяти ЦП сначала считывает масштаб bd + An + Rn *, затем добавляет od и использует полученное значение в качестве адреса для окончательного чтения или записи. В режиме косвенного постиндексирования памяти ЦП сначала считывает bd + An, затем добавляет Rn * scale + od и использует полученное значение как адрес для окончательного чтения или записи.

Немедленное обращение [править]

Синтаксис ассемблера:

Работать на xxx.

Адресация регистра состояния [править]

Синтаксис ассемблера:

SR — это полный регистр состояния, включая системный байт.CCR — это всего лишь флаги. Кроме этого, я не знаю, как это работает. SR доступен только в режиме супервизора.

Единственными командами, которым разрешено использовать этот режим адресации, являются: MOVE, ANDI (И немедленно), EORI (исключительное ИЛИ немедленно) и ORI (ИЛИ немедленно), известные как: MOVE to / from CCR, MOVE to / from SR, ANDI в CCR, ORI в CCR, EORI в CCR, ANDI в SR, ORI в SR, EORI в SR.

; Пример ORI для CCR
           ; допустим, CCR = $ 00
ORI # 5, CCR; устанавливает и флаг переноса (C), и нулевой флаг (Z)
           ; CCR = 05 $ -> 00000101
           ; большинство ассемблеров распознают как SR, так и CCR
           ; поэтому вам не нужно указывать длину операнда.

Условные тесты [править]

Везде, где вы видите «cc» в инструкции, вы должны заменить его соответствующим условным тестовым кодом. Обратитесь к этой таблице, чтобы узнать, что делает каждый тест.

Код Описание Тест
Т * Верно, всегда тесты верны. Недоступно для скрытой копии или Jcc. 1
Ф Ложь, всегда проверяет ложь. Недоступно для скрытой копии или Jcc. 0
HI Высокий. Верно, если оба значения Carry и Zero ясны. не C и не Z
LS Низкий или такой же. Истинно, если установлено значение Carry или Zero. C или Z
CC Carry Clear. Верно, если Керри ясно. не C
CS Набор для переноски. Истинно, если установлено «Переносить». С
NE Не равно.Истинно, если нулевой флаг снят. не Z
EQ Равно. Истинно, если установлен нулевой флаг. Z
ВК Сброс переполнения. Истинно, если параметр «Переполнение» снят. не V
ВС Набор перелива. Истинно, если установлено переполнение. В
PL Plus. Истинно, если отрицательное значение ясно. не N
MI Минус.Истинно, если установлено отрицательное значение. N
GE Больше или равно (N и V) или (не N и не V)
LT меньше чем (N, а не V) или (не N и V)
GT Больше чем ((N и V) или (не N и не V)), а не Z
LE Меньше или равно Z или (N, а не V) или (не N и V)

* В качестве компромисса большинство компиляторов 68k используют инструкцию BRA (BRanch Always) для этого значения поля «cc».

Ярлыки — это просто названия строк. Вы можете иметь столько ярлыков, сколько хотите. Как правило, есть только несколько мест, к которым вы хотите обратиться, например, начальные точки функций, начало и конец цикла, а также определенные места для хранения данных.

Ассемблер обрабатывает метки как псевдонимы для чисел. Когда он встречает один, он присваивает ему текущее значение ПК ассемблера. (Я буду называть это «объявлением» метки.) Затем эту метку можно использовать в качестве операнда везде, где может быть число.Обычно они используются в инструкциях Jcc или Bcc.

Обратите внимание, что вы можете ссылаться на метки до их фактического объявления. Это известно как прямое обращение к и обрабатывается по-разному в зависимости от ассемблера. Обычно он просто использует известное безопасное значение (например, текущий компьютер), отмечает местоположение и выполняет второй проход для замены реального значения. Это может изменить размер метки, и в этом случае потребуется третий проход и так далее. Некоторые ассемблеры требуют, чтобы вы явно определяли размер перехода / ветки, чтобы избежать необходимости делать третий проход.Ассемблер, который вы используете, может вести себя иначе.

Этикетки и место для хранения:

 МОИ ДАННЫЕ:
ds.b 16; Объявите 16 байт пространства, метка MYDATA относится к этому месту.
глобальный Main; Сообщите ассемблеру, что метка Main должна быть экспортирована (сделана видимой для кода, не находящегося в этом файле)

Главный:                ; Ярлык для основной функции
MOVEA.L #MYDATA, A0; Установите адресный регистр A0 для обращения к пространству MYDATA
MOVE.B # 0, 0 (A0); Скопируйте 0 в первый байт MYDATA
ПЕРЕЕХАТЬ.В №1, 1 (А0); Скопируйте 1 во второй байт MYDATA
rts; Возвращение
 

Набор команд [править]

Набор команд 68K очень ортогонален. Большинство инструкций могут работать со всеми размерами данных, и очень немногие ограничиваются менее чем тремя режимами адресации. Инструкции 68K довольно медленные, но они делают гораздо больше, чем инструкции для процессоров Z80 или x86.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *