Code segment ;директива начала сегмента кода
assume cs: code, ds: data ;задание сегментных регистров
Start: mov ax,data ;загрузка адреса
Mov ds,ax ;сегмента данных в регистр ds
.
.
Текст программы
Quit: mov ax,4c00h ;код завершения 0
Int 21h ;выход в DOS
Code ends ;директива конца сегмента кода
End start ;конец трансляции программы
Загрузка адреса сегмента данных состоит из двух команд, так как непосредственные данные нельзя заносить прямо в сегментный регистр.
Для завершения программы и выхода в DOS имеется несколько возможностей, рекомендуется использовать две команды, начинающиеся с метки quit.
Обработка программ в MS-DOS
Обработка программ на языке ассемблера в MS-DOS состоит из следующих этапов:
1) создать с помощью текстового редактора файл с текстом программы на языке ассемблера;
2) транслировать программу с помощью ассемблера TASM (или MASM);
3) Скомпоновать программу с помощью компоновщика (редактора связей) TLINK(или LINK);
Запустить программу на выполнение (через отладчик).
Файл исходного текста программы должен иметь расширение *.asm.
Запуск транслятора осуществляется командой: tasm <исходный файл >.
При этом будет создан объектный файл (*.obj).
Компоновщик использует объектный файл и создаёт исполняемый файл с расширением по умолчанию *.exe. Запуск компоновщика осуществляется командой: link < объектный файл >.
Для запуска под отладчиком необходимо запустить отладчик и загрузить исполняемый файл.
Пример выполнения работы
Задание: Вычислить Х = 3А+(В+5)/2–С–1, где А,В,С,Х – целые знаковые числа занимающие слово. Написать программу, реализующую данную формулу.
Распишем формулу по отдельным операциям:
АХ ← А ; значение А в регистре АХ
АХ ← 2*(АХ) ; значение 2А в регистре АХ
АХ ← (АХ) + А ; значение 3А в регистре АХ
ВХ ← В ; значение В в регистре ВХ
ВХ ← 5 + (ВХ) ; значение (В+5) в регистре ВХ
ВХ ← (ВХ)/2 ; значение (В+5)/2 в регистре ВХ
АХ ← (BX)+(AX) ; значение 3А+(В+5)/2 в регистре АХ
АХ ← (АХ)–С ; значение 3А+(В+5)/2–С в регистре АХ
АХ ← (АХ)–1 ; значение 3А+(В+5)/2–С–1 в регистре АХ
Х ← (АХ) ; значение 3А+(В+5)/2–С–1 в регистре Х
В листинге 2.9 приведена структура этой программы на ассемблере.
Листинг 2.9. Пример программы
Data segment
A dw 10
B dw 20
C dw 5
X dw ?
Data ends
Code segment
Assume cs: code, ds: data
Start: mov ax, data
Mov ds, ax
Mov ax, a
Sal ax, 1
Add ax, a
Mov bx, b
Add bx, 5
Sar bx, 1
Add ax, bx
Sub ax, c
Dec ax
Mov x, ax
quit:
Mov ax, 4c00h
Int 21
Code ends
End start
Варианты заданий
Разработать программу, реализующую указанную формулу (переменные в программе имеют размер слова). Проверить работоспособность программы на нулевом, единичном и произвольном наборах входных данных. Объяснить полученные результаты. Подтвердить полученные значения расчетами вручную или на калькуляторе.
Блок 1.
1. Х= 4А–3В+С/4
2. Х= 6А-5*(В+С)/2–1
3. Х= (А+2В–С)/4
4. Х= (С–А)/2+(В+С)/8
5. Х= (4А–7В–32С)/2
6. Х= – (–(С+2А)*5+В)
7. Х= 3*(А–2В)+50–С/2
8. Х= (3А+2В) –С/4+217
9. Х= 3*(С–2A)+(В–С+1)/2
10. Х= (2А+В)/4–С/2+168
11. Х= 6*(А-2В+С/4)+10
12. Х= 3*(А–4В)+С/4
13. Х= – (– (С +2А)*5+В*16)
14. Х= А/2–3*(А+В)+С*4
15. Х= 3*(А–2В)+50–С/2
16. Х= 5А+2В–С/4+131
17. Х= А–5*(В–2С)+2
18. Х= –4А+(В+С)/4+2
19. Х= 7А–2В–100+С/2
20. Х= –А /2+4*(В+1)+3С
21. Х= 5*(А–В) –2С+5
22. Х= (А/2+В)/4+С–1
23. Х= – (С+2А+4В)+18
24. Х= 6А+(В–С+1)/2
25. Х= 2–8*(А+В)+С/4
Блок 2.
1. Х= 2В–1+4*(А–3С)
2. Х= (2А+В)/4–С/2+144
3. Х= 6*(А–2В+С/4)+10
4. Х= (С–3А)/4+В/8
5. Х= (5А–В–10С)/4
6. Х= – (–(2*С+5А)*3+2В)
7. Х= –7*(3А–В)+40–С/4
8. Х= (6А–В)+С/2–103
9. Х= 15*(С–A)+(В–С)/8
10. Х= (А+4В)/8–2С+16А
11. Х= 4*(3А-7В+С/16)+12
12. Х= –3*(4А–3В)+С/2
13. Х= – (С +6А)*15+В/16
14. Х= –А/4–5*(2А–В)+С/2
15. Х= –16*(3А–2В)+77–С/64
16. Х= 18А+64В–(С–А)/64+17
17. Х= 4А–15*(2В–2) –22
18. Х= 4А+3*(В+С)/4–42
19. Х= 7А+9В–106+С/16
20. Х= –А/4–9*(В+11)+15С
21. Х= 2*(7А–В) –12С+55
22. Х= 3*(А/2+В/16)+С/32–61
23. Х= –(–(С+2А+4В)+16А)
24. Х= –4А+(В+3С–1)/2
25. Х= 12+16*(2А+3В)+С/2
Блок 3.
1. Х= 3В+19+3*(2А–3С)
2. Х= –(С–2А–3В) –98
3. Х= –6А+(3В–4С+11)/4
4. Х= –2–8*(7А–В)–С/4
5. Х= – (2А+В)/2–С/2–101
6. Х= –6*(3А–В–С/4) –55
7. Х= (2С–3А)/2–В/4
8. Х= (–3А–4В+С)/16
9. Х= 5*(–3А+В) –14–С/8
10. Х= – (6–А+В) –С/2+13
11. Х= –8*(4А–С)–(В+3С)/4
12. Х= (А–3В)/8+3С–55
13. Х= 6*(3А–В)+С/4
14. Х= –(–(3С–11А)*16–В/4)
15. Х= А/8–4*(А+3С)+А/2
16. Х= 14*(2–3А)+64В+С/8
17. Х= –4А+16*(–2В+11)–65С
18. Х= –4А+5*(2В+С)/4+100
19. Х= 129А+9В–256–С/16
20. Х= А/16+2*(3В–91) –16С
21. Х= –2*(7А+В) +33С+400
22. Х= А/2–В/8+4*(С/32–61)
23. Х= –(–2*(С–3А+35В) –А)
24. Х= 4А-5*(2*В–С–11)/4
25. Х= 93–8*(2А+3В) –С/2
2.4 Контрольные вопросы
Назначение директив SEGMENT и ENDS.
Назначение директивы ASSUME.
Назначение директив DB, DW.
Назначение оператора DUP в директивах DB, DW.
Назначение директивы END.
Из каких полей состоит строка программы на ассемблере?
Какие поля обязательны, а какие можно опустить?
8. В чем различие между командами: mov AX, BX и mov AX, [BX]?
В чем разница между командой mov A, 1 и директивой А dw 1?
10. Как Вы считаете, почему в рассмотренном примере для вычитания единицы использовался оператор: dec ax, а не оператор sub ax,1?
Лабораторная работа № «Команды языка Ассемблер. Циклические и разветвляющиеся программы»
Цель работы: научиться использовать циклы и условия при написании программ на языке ассемблер.
Для выполнения работы студент должен: иметь представление об условном и безусловном переходах, уметь составлять программы с использованием циклов и условий, знать определение и свойства массивов.
Теоретические сведения
Электронное представление чисел
Команды передачи, управления служат для передачи управления инструкции, не следующей непосредственно за данной. Управление может передаваться как внутри текущего сегмента кода (внутрисегментная передача управления), так и за его пределы (межсегментная передача управления). Тип передачи управления может быть задан ассемблеру предшествующим адресу перехода ключевым словом NEAR (внутрисегментная) или FAR (межсегментная).
Безусловные переходы
Инструкция безусловного перехода передаёт управление команде, адрес которой указан в инструкции. Команда безусловного перехода имеет вид, представленный в листинге 3.1.
Листинг 3.1. Синтаксис команды условного перехода
jmp [< тип > ptr ] операнд.
<тип> - тип перехода short (короткий) – смещение 127 байтов вперёд или 128 байтов назад, near (близкий) – смещение в пределах сегмента (64 Кбайта), far (дальний) – в любой сегмент с любым смещением.
ptr – приставка, которую можно перевести как указанный в...