Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прогр.docx
Скачиваний:
23
Добавлен:
21.12.2018
Размер:
2.58 Mб
Скачать
  1. Сам ассемблер — программа, которая переводит текст с языка, понятного человеку, в язык, понятный процессору, получает объектный модуль;

  2. Компоновщик (linker), который создает исполнимые файлы из одного или нескольких объектных модулей, полученных после запуска ассемблера;

  3. Дополнительные вспомогательные программы — компиляторы ресурсов, расширители dos и тому подобное (см. Табл.).

Таблица 1.1. Ассемблеры и сопутствующие программы

Microsoft

Borland

Watcom

DOS, 16 бит

masm или ml,

link (16 бит)

tasm

tlink

wasm

wlink

DOS, 32 бита

masm или ml,

link (32 бита) и dosx

link (16 бит) и dos32

tasm

tlink

wdosx или dos32

wasm

wlink

dos4gw, pmodew,

zrdx или wdosx

Windows

masm386 или ml,

link (32 бита)

rc

tasm32

tlink32

brcc32

wasm

wlink

wrc

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

Рис. 1.1. Схема трансляции ассемблерного модуля

С точки зрения удобства компиляции TASM лучше подходит для создания 16-битных программ для DOS, WASM — для 32-битных программ для DOS, MASM — для Windows. С точки зрения удобства программирования развитость языковых средств растет в ряду WASM—MASM—TASM.

Существует также компилятор, бесплатно распространяемый в сети Internet NASM или А86, но пользоваться ими проще, если вы уже знакомы с турбо- или макроассемблером. Бесплатно распространяемый GNU ассемблер Gas использует непохожий синтаксис и предназначен для программирования под UNIX.

Для работы необходим также и отладчик. Самый мощный отладчик на сегодняшний день — SoftICE от NuMega Software. Другие популярные отладчики, распространяемые вместе с соответствующими ассемблерами, — Codeview (MS), Turbo Debugger (Borland) и Watcom Debugger (Watcom).

Представление данных в компьютерах

Десятичная система относится к классу позиционных систем, в которых число А может быть представлено в виде:

А=а*zn+ а*zn-1+а*zn-2+ …+а*z1+ а*z0

Здесь а– цифры числа, z – основание системы исчисления, n – порядок числа. Например, число 1587 можно представить так:

1587=1*103+5*102+8*101+7*100=1000+500+80+7.

Двоичная система счисления

Двоичная система счисления использует только две цифры (0; 1), а вместо степеней десяти здесь используют степени двойки. Чтобы перевести двоичное число в десятичное, надо сложить двойки в степенях, соответствующих позициям, где в двоичном числе стоят единицы. Например:

10010110b = 1*27+0*26+0*25+1*24+0*23+1*22+1*21+0*20 =

= 128+16+4+2 = 150

Чтобы перевести десятичное число в двоичное, нужно делить его на 2, записывая 0 каждый раз, когда число делится на два, и 1, когда не делится (табл. 1.2). Пример, перевести десятичное число 150 в двоичную систему исчисления.

Таблица 1.2. Перевод числа из десятичной системы в двоичную

Остаток

Разряд

150/2 = 75

75/2 = 37

37/2 = 18

18/2 = 9

9/2 = 4

4/2 = 2

2/2 = 1

1/2 = 0

0

1

1

0

1

0

0

1

0

1

2

3

4

5

6

7

Результат: 10010110b

Чтобы отличать двоичные числа от десятичных, в ассемблерных программах в конце каждого двоичного числа ставят букву «b».

Основной и неделимой единицей данных является бит. Самый правый (нулевой) бит ещё называется LSB-битом (Least Significant Bit – наименее значимый бит). Самый левый бит называется MSB-битом (Most Significant Bit – наиболее значимый бит). Группа из четырёх битов называется полубайтом, группа из восьми бит образует байт. Группа из 16 бит (2 байта) называется словом, из 32 бит – двойным словом, 64 бита – учетверённое слово.

Байт может содержать число в диапазоне 0-255, то есть 28=256 различных чисел. Байт используют для представления целых чисел (тип unsigned, char в С), целых чисел со знаком от -128 до +127 (тип signed char в С). Слово может содержать число в диапазоне 0–65535, то есть 216=65536 различных значений. Биты с 0 по 7 составляют младший байт слова, а биты с 8 по 15 — старший байт. Слова используют для представления целых чисел без знака со значениями 0 — 65 535 (тип unsigned short в С), целых чисел со знаком со значениями от -32 768 до +32 767 (тип short int в С), адресов сегментов и смещений при 16-битной адресации.

Шестнадцатеричная система счисления

На практике используется шестнадцатеричная система. В шестнадцатеричной системе используется 16 «символов»: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, А, В, С. D, E, F, и номер позиции цифры в числе соответствует степени, в которую надо возвести число 16, например:

96h = 9 * 16 + 6 = 150

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

9h = 1001b, 6h = 0110b, 96h = 10010110b

В ассемблерных программах при записи чисел, начинающихся с А, В, С, D, E, F, в начале приписывается цифра 0, чтобы нельзя было спутать такое число с названием переменной или другим идентификатором. После шестнадцатеричных чисел ставится буква «h» (табл. 2).

Таблица 2. Двоичные и шестнадцатеричные числа

Десятичное

Двоичное

Шестнадцатиричное

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

0000b

0001b

0010b

0011b

0100b

0101b

0110b

0111b

1000b

1001b

1010b

1011b

1100b

1101b

1110b

1111b

10000b

00h

01h

02h

03h

04h

05h

06h

07h

08h

09h

0Ah

0Bh

0Ch

0Dh

0Eh

0Fh

10h

Десятичные числа могут записываться без изменений либо они заканчиваются постфиксом «d». Например: 1234 или 1234d. Восьмеричные цифры заканчиваются на «q»: 12q =(12)8.

Двоичная арифметика

Компьютер выполняет арифметические действия только в двоичном формате. Правила сложения двоичных чисел:

0 + 0 = 0

1 + 0 = 1

1 + 1 = 10

1 + 1 + 1 = 11

0 + 1 = 1

Отрицательные числа

Двоичные числа имеют положительное значение, если самый левый (старший) разряд равен 0. Отрицательные двоичные числа содержат единичный бит в старшем разряде и выражаются двоичным дополнением. То есть, для представления отрицательного двоичного числа необходимо инвертировать все биты и прибавить 1. Например:

Число 65: 01000001 ; 41h

Инверсия: 10111110

Плюс 1: 10111111 (равно -65). ; BFh а не С1h=11000001b

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

Двоичное значение: 10111111

Инверсия: 01000000

Плюс 1: 01000001 (равно +65).

Сумма +65 и -65 должна составить ноль:

01000001 (+65) + 10111111 (-65) = (1) 00000000

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

Двоичное вычитание выполняется следующим образом: инвертируется знак вычитаемого и складываются два числа. Вычтем, например, 65-42. Двоичное представление для 42 есть 00101010, и его двоичное дополнение: — 11010110:

65 01000001 +(-42) 11010110 = 23 (1) 00010111

Логические операции

В ассемблере существуют четыре основные логические операции — И (AND), ИЛИ (OR), исключающее ИЛИ (XOR), отрицание (NOT), действие которых приводится в таблице 3.

Таблица 3. Логические операции

И

ИЛИ

ИСКЛЮЧАЮЩЕЕ ИЛИ

НЕ

0 AND 0 = 0

0 AND 1 = 0

1 AND 0 = 0

1 AND 1 = 1

0 OR 0 = 0

0 OR 1 = 1

1 OR 0 = 1

1 OR 1 = 1

0 XOR 0 = 0

0 XOR 1 = 1

1 XOR 0 = 1

1 XOR 1 = 0

NOT 0 = 1

NOT 1 = 0

Все эти операции побитовые. Чтобы выполнить логическую операцию над числом, надо перевести его в двоичный формат и выполнить операцию над каждым битом, например:

96h AND 0Fh = 10010110b AND 00001111b = 00000110b = 06h

xor ax,ax ; ax=00000000

При написании программы на ассемблере просто пишутся команды процессора, которые процессор последовательно выполняет. Пример команды:

MOV EAX, EBX

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

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

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

C++ Builder 4 - 22 kb

Delphi 5 - 291 kb

Ассемблер MASM - около 3 kb

Ассемблер это самый быстрый язык.

При создании программы необходимо: