Общие сведения
Общая технология разработки программ
Упрощенная Технология разработки программ с использованием TASM
Структура программы
Команды и директивы
Формат команды Ассемблера.
Команды и операнды
Комментарии
Основные директивы языка
Директивы управления листингом
Директивы определения сегментов
Параметры сегмента
Примеры определения сегментов
Директива определения типа сегмента Assume
Пример
Директивы определения процедур
Атрибут дистанции
Пример
Управление трансляцией
Пример
Структура программы
Директивы определения данных
Типы констант
Директивы определения данных
Общий формат
Выражения
Директивы определения идентификаторов
Операции
Операции, возвращающие значение
Операции изменения атрибутов
Начальные значения регистров при загрузке программы
184.00K
Категория: ПрограммированиеПрограммирование

Структура программы на языке Ассемблера. Лекция 1

1.

Структура программы на языке
Ассемблера

2. Общие сведения

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

3. Общая технология разработки программ

• Разработка программ на Ассемблере осуществляется с
помощью систем программирования. Наиболее
распространенная MASM (IBM), Tasm (Borland).
Системы программирования должны включать в себя:
Транслятор с языка Ассемблера.
Компоновщик
Отладчик.
• Система программирования Tasm – Borland включает:
• транслятор tasm.exe,
• Компоновщик tlink.exe,
• отладчик Td.exe.

4. Упрощенная Технология разработки программ с использованием TASM

• С помощью текстового редактора cформировать
файл с расширением .asm, содержащий текст
программы.
• 1. Выполнить трансляцию программы с помощью
командной строки
• Tasm prog.asm.
• Результат – файл prog.obj.
• 2. Выполнить компоновку
• Tlink prog.obj
• Результат – файл prog.exe
• 3. Выполнить отладку программы
• Td prog.exe
• 4. Выполнять рабочие расчеты
• prog.exe

5. Структура программы

Программа на языке Ассемблера это
Последовательность операторов
описывающих выполняемые
операции.
Операторы языка делятся на команды и
директивы и операции.

6. Команды и директивы

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

7. Формат команды Ассемблера.

Общий формат команды следующий :
[метка:] команда [операнды] [;комментарий]
Обязательным является только поле команды. По крайней мере один
пробел обязателен между полями. Максимальная длина строки - 132
символа.
Метка или имя используется для указания адреса команды. Метка служит
для присваивания имени 1-му байту области памяти, в которой
располагается машинный эквивалент команды. Это имя можно
использовать в программе для ссылки на соответствующую команду,
например, для передачи управления на эту команду.
Метка может содержать :
-латинские буквы от А до Z (А и а не различаются )
-цифры от 0 до 9
-специальные символы ? . , “_”, @.
-Первым символом должна быть буква или символ. Максимальная длина
метки 31 символ. Это соглашение справедливо для всех имен в
Ассемблере.

8. Команды и операнды

Команда определяет выполненные действия в программе.
Обозначения команды содержит от 2 до 6 символов.
Операнды определяют данные, над которыми выполняется команда.
•В качестве операндов могут выступать:
•непосредственные данные т.е. числа или символы
•адреса ячеек памяти
•содержимое регистров
•содержимое ячеек памяти
•адрес текущей команды (обозначается $)
В команде операнды могут отсутствовать, команда может иметь 1 или
2 операнда .
Между собой операнды отделяются “,”. Если команда имеет 2
операнда то 1 операнд называется приемником 2-ой источником.
При выполнении любой команды источник никогда не изменяется
приемник меняется почти всегда.

9. Комментарии

Комментарий служит для пояснения текста программы.
Любой текст, который начинается с “;” и до конца строки
считается комментарием.
Примеры команд:
Fld1: mov ax,bx ; переслать содержимое регистра
; bx в ax
Jmp Fld1; перейти на метку Fld1
; занести в регистр ax смещение (в
;сегменте команд) текущей команды
mov ax,$
Add bh,12
текущем

10. Основные директивы языка

1. Управления листингом
2. Определения сегментов
3. Определения процедур
4. Определения данных
5. Управления трансляцией

11. Директивы управления листингом

Page - директива управления размером страницы . Формат такой:
Page [кол-во строк] [,кол-во символов в строке]
определяет сколько строк исходной программы будет размещено на одной
странице листинга распечатки, а также количество символов в строке. По
умолчанию Page 66,80
Пример
Page 60,132
Page
; действует режим умолчания
Title - директива определения заголовка программы в листинге. Формат
Title текст
По этой директиве этот текст будет размещаться во второй строке каждой
странице листинга (в первой строке – номер страницы).
Использование директив Page и Title позволяют пронумеровать страницы
листинга и размещать на каждой странице идентификатор программы.

12. Директивы определения сегментов

Предназначены для разбиения программы на сегменты,
указания транслятору какой тип имеет каждый сегмент, а
также для определения адреса начала сегмента (сегментного
адреса)
Segment – директива начала сегмента
Еnds – директива конца сегмента.
Любой сегмент должен начинаться директивой Segment и
заканчиваться директивой Ends.
Формат директивы Segment:
имя Segment [параметры]
формат директивы Ends:
имя Ends

13.

Текст программы между директивой Segment с
некоторым именем и директивой Ends с тем же
именем является некоторым сегментом программы.
Имя сегмента идентифицирует адрес начала
сегмента (сегментный адрес). Это имя можно
использовать в программе как сегментный адрес
сегмента. Имя должно быть уникальным для
каждого сегмента
Каждой директиве Segment с некоторым именем
обязательно должна соответствовать директива Ends
с тем же именем.
В любой программе обязателен по крайней мере 1
сегмент : сегмент команд.

14. Параметры сегмента

Директива Segment может содержать следующие параметры:
•Параметр выравнивания.
Обычно (и по умолчанию) этот параметр равен Para. Означает что
сегмент выровнен на границу параграфа т.е. начинается по адресу
кратному 16-ти.
•Параметр объединения.
Обычно принимает 2 значения : Public означает что все сегменты с
одинаковыми параметрами и именами объединяются в один
общий сегмент. Stack имеет то же значение что и Public, но для
сегментов стека.
• Параметр класса.
Этот параметр служит для идентификации предназначения
сегмента (но не типа сегмента). Типичные значения ‘data’ - для
сегмента данных, ‘code’ – для сегмента команд, ‘stack’ – для

15. Примеры определения сегментов

; Типичное определение сегмента данных
dseg1 segment para public ‘data’
; здесь могут размещаться данные программы
……………………………….
dseg1 ends
; Типичное определение сегмента стека
stseg segment para stack ‘stack’
; директивы выделения места под сегмент стека
Stseg ends
; Типичное определение сегмента команд
сseg1 segment para public ‘code’
; здесь могут размещаться команды программы
……………………………….
stseg ends
seg1 segment
seg1 ends
здесь параметры по умолчанию

16. Директива определения типа сегмента Assume

Директива указывает транслятору какой тип имеет
каждый из определенных в программе сегментов.
Тип сегмента определяется указанием того, какой из
сегментных регистров будет использоваться для
доступа к данным в сегменте.
В процессе выполнения программы программист
может переопределить тип сегментов.
Формат директивы:
Assume сегментный_регистр.: имя сегмента
[,необязательное повторение]

17. Пример

Assume cs:cseg, ds:dseg, ss:stseg
Эта директива показывает транслятору, что сегмент
cseg будет являтся сегментом команд
dseg – сегментом данных,
stseg – сегментом стека.
Директива Assume обязательна в программе и
обычно она является первой директивой в сегменте
команд (после директивы segment, определяющей
сегмент команд).

18. Директивы определения процедур

Процедура – это исполнимая часть программы, которая
может рассматриваться как одно целое. Процедура может
иметь имя, и по этому имени к процедуре можно обращаться
(например, вызывать на выполнение).
Вся программа на Ассемблере также может рассматривается
как процедура (по отношению к операционной системе), и
исполнимая часть программы обычно оформляется как
процедура.
Процедура начинается директивой Proc и заканчивается
директивой Endp
Форматы директив:
Имя_процедуры Proc [атрибут дистанции]
*
*
имя_процедуры Endp

19.

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

20. Атрибут дистанции

Far – процедура и вызывающая ее
программа (процедура) находятся в
разных сегментах.
Основная программа в Ассемблере
обычно имеет атрибут дистанции Far.
Т.к. она вызывается из операционной
системы.
Near - процедура и вызывающая ее
программа (процедура) находятся в
одном сегменте.

21. Пример

cseg segment para public ‘code’
assume cs: cseg, ds: dseg, ss: stseg
main proc far ; начало основной программы
*
*
*
*
Ret ; возврат в ОС
main endp
Cseg ends

22. Управление трансляцией

END [Метка точки входа]
Последняя директива программы в модуле (файле).
Текст программы после этой директивы не
транслируется.
Если программа состоит из нескольких модулей
(файлов), то каждый модуль должен закончиться
директивой End.
При этом только один модуль должен иметь директиву
End с меткой. Эта метка будет являться точкой
входа в программу из операционной системы.
Обычно метка – это имя программы, указанной в
директиве Proc.

23. Пример

Определение сегмента команд
сseg segment para public ‘code’
assume cs: cseg, ds: dseg, ss: stseg
main proc Far ; начало основной программы
……………………………..
main endp
сseg ends
здесь параметры по умолчанию
end main ; Конец программы

24. Структура программы

Title
заголовок программы
Page
; Определение сегмента стека
stseg segment para stack ‘stack’
DW
32 Dup(?)
; стек размером 32
;слов
Stseg ends
;Определение сегмента данных
dseg1 segment para public ‘data’
; здесь могут размещаться данные программы
……………………………….
dseg1 ends

25.

; Определение сегмента команд
сseg segment para public ‘code’
assume cs: cseg, ds: dseg, ss: stseg
main proc
Far ; начало основной программы
; Занести в стек такие значения, чтобы программа могла вернуть
; управление в ОС
push ds
; занести ds в стек
sub ax,ax ; ax=0
push ax
; занести 0 в стек
; Инициализировать регистр сегмента данных адресом начала
сегмента данных
mov ax,dseg
mov ds,ax
; Команды программы
…………..
Ret
; возврат в ОС
main endp
; закрыть процедуру
сseg ends
; закрыть сегмент команд
end main ; Конец программы

26. Директивы определения данных

1. Данные в языке Ассемблера.
Константы – данные, которые не могут
быть изменены в ходе выполнения
программы
Переменные – данные, которые могут
меняться при выполнении программы.
Переменной соответствует некоторая
область памяти в программе.

27. Типы констант

1. Двоичная константа – число задана в 2-ом виде,
представляет из себя последовательность 0 и 1,
заканчивающаяся символом b. Пример. 10001111b
2. Десятичные константы – это 10-ое число возможно со
знаком . Можно писать 10d. Пример: 150, 2567d, -10
3. 16-ричные константы – представляет из себя
последовательность 16-ричных цифр, заканчивающихся
буквой h. 10h (H). Первый символ – всегда цифра (чтобы
отличить 16-ричные числа от имен ). Пример: 256h,
100h,0ffffh
4. Символьные константы или литералы.
Последовательность символов ASCII, заключенные в
кавычки ‘ ‘. Если кавычки являются частью литерала, то сам
литерал должен быть заключен в кавычки другого вида
например “ “ или наоборот.
Пример: ‘ Напечатать запрос “ Введите данные“ ’

28.

•Расположение в памяти числовых констант зависит от
длины константы. Если константа имеет длину 1 байт, то она
располагается в этом байте.
•Если константа имеет длину 2 байта т.е. слово, то она
располагается в памяти в обратной последовательности
байтов. Пример: 0FFAAh в памяти : AAFF
•Для символьных констант под каждый символ отводится 1
байт и символьные константы располагается в памяти в
прямой последовательности .
Отрицательные значения констант записываются со знаком
(десятичные константы), или в дополнительном коде.
Пример. -32<-> 11100000b<-> 0E0h
Константы в программе на Ассемблере определяется либо
путем на посредственного указания константы в команде,
либо путем присвоения значения константы в качестве
значения некоторой переменной.
Например: mov bx, 4

29. Директивы определения данных

Вводят (определяют) переменные или области
изменяемых данных в программе.
Типы директив.
DB – определить байт
DW – определить слово
DD – определить двойное слово
DQ – определить 4 слова (8 байт)
DT – определить 10 байт
При определении данных с помощью директив:
1. Выделяется место в памяти под переменную
2. Переменной может быть дано имя
3. Может быть задано начальное значение
переменной

30. Общий формат

[имя переменной] директива выражение [,…]
имя переменной - это правильное имя Ассемблера.
Если имя переменной присутствует, то это имя
определяет адрес соответствующей переменной или
адрес первого байта области памяти, отводимой под
переменную. По этому имени в программе можно
сослаться на соответствующую переменную.
Если имя переменной отсутствует, то директива
определяет область памяти, сослаться к которой
можно только по адресу. Программист должен уметь
вычислять этот адрес.

31. Выражения

1. Последовательность констант, которые
задают начальные значения переменной.
Пример.
Tabl
db 11,12,13,14
db 15,16,17,18
Эти директивы отводят в памяти программы 7
байт. Первый байт имеет имя Tabl и
содержит значение 11. Байт с адресом
Tabl+3 cодержит значение 13.
Mov ah,tabl+5 ; занести в ah значение 16

32.

•Пример:
VVOD db 3,’Введите данные’,4
mov bh, vvod+11
mov bl, vvod+3 ;bh=‘н’, bl=‘e’

33.

2)выражение может содержать знак вопроса ?. В этом случае под
переменную лишь отводиться область памяти соответствующей
длины, но этой области не присваивается значение.
Пример:
HIGH dw ?
H1
dw ?, ?
3. Выражение может содержать операцию dup. Операция
позволяет дублировать повторяющиеся значения
H2 db 2000 dup(?) ; выделить 2000 байт
H3 db 100 dup(?, 1); выделяет 200 байт вида ?,1, ?, 1
4. Выражение может содержать адрес ячейки памяти. Если ячейка
памяти находится в том же сегменте, что и директива, то эта
директива может быть директивой dw. Если же ячейка памяти
находиться в другом сегменте, то эта директива должна иметь
длину dd.
Пример.
Fld1
db
?
Adr_fld dw
fld1
;переменная adr_fld1 содержит смещение
; переменной fld1

34. Директивы определения идентификаторов

Если в программе многократно используется какая либо
константа, то при изменении этой константы в тексте
программы приходиться выполнять большую работу по
изменению программы.
Для решения этой проблемы в программе можно ввести
идентификатор (или символьное имя), которому
присваивается значение константы. После этого в программе
можно использовать идентификатор всюду, где нужно
значение константы. Существуют 2 практических
равноценных директивы определения идентификаторов:
1) K EQU 1024 ; определить идентификатор константы
K=1024
2) M=10 ;определить идентификатор M=10
mov ax, K
add bx, M
Записываются обычно в сегменте данных.

35. Операции

Выполняются на этапе трансляции
программы и не порождают машинных
кодов.
Основные операции:
Арифметические операции: +, -, *, /
mov tabl+1, ax

36. Операции, возвращающие значение

Offset – операция позволяет определить смещение
ячейки памяти в сегменте, где эта ячейка памяти
находиться.
Пример:
mov bx, offset tabl
Seg – позволяет определить сегментный адрес
ячейки памяти.
Пример:
mov dx, seg tabl ; занести в регистр dx
;сегментный адрес tabl

37. Операции изменения атрибутов

Ptr – явное указание атрибута типа данных или атрибута
дистанции.
mov [bx], 1 ?????? ошибка
mov byte ptr [bx], 1
word
dword
call far ptr subprg
near
Операции изменения префикса сегмента
mov es: [bx], ax - операция изменения префикса
сегмента
ss: [bx], ax
cs: [bx], ax
ds: [bx], ax

38. Начальные значения регистров при загрузке программы

При входе в .exe программу регистры
микропроцессора имеют следующие
значения:
1. DS и ES содержат сегментный адрес области
PSP (префикс программного сегмента). PSP
выравнен на границу параграфа и в первом
байте PSP находится команда INT 20h –
выход в операционную систему. На первый
байт PSP передается управление командой
RET в программе.

39.

2. CS – сегментный адрес точки входа в
программу (обычно, сегментный адрес
сегмента команд)
3. IP – смещение точки входа в программу
(обычно – 0)
4. SS – сегментный адрес сегмента стека
5. SP – число байтов, отведенных в
программе под стек.
Остальные регистры не определены.
English     Русский Правила