Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Разработка приложений на языке ассемблер в среде MS MASM. Учебно-методическое пособие по дисциплинам «Ассемблер» и «Операционные системы и системное п

.pdf
Скачиваний:
1
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
goto TheEnd :TheEnd rem Выполнение "hello.exe"
2. Для запуска командного файла введите в командной строке
runasm
и нажмите Enter.
Убедитесь, что программа hello.exe выполнена (на экране должна появиться фраза «Здравствуйте...»).
3. Внесите изменения в командный файл runasm.bat, сделав его
универсальным, т.е. пригодным для выполнения любой исходной про­граммы. Для этого в командном файле вместо имени файла программы hello введите символы %1 (так принято обозначать формальные пара-
метры командного файла):
rem Командный файл для выполнения EXE программ rem Программист ... (укажите своё имя) @echo off if exist "%1.obj" del "%1.obj" if exist "%1.exe" del "%1.exe" rem Ассемблирование c:\masm32\bin\ml /c /coff /Sn /Fl"%1.lst" "%1.asm" if errorlevel 1 goto errasm rem Редактирование связей c:\masm32\bin\PoLink /SUBSYSTEM:WINDOWS "%1.obj" if errorlevel 1 goto errlink dir "%1.*" goto TheEnd :errlink echo _ echo Link error goto TheEnd :errasm echo _ echo Assembly Error goto TheEnd :TheEnd rem Выполнение "%1.exe"
Теперь для запуска командного файла runasm.bat нужно в команд­ной строке после имени командного файла указывать фактическое значение
формального параметра, которое заменит используемые в тексте значки %1. В данном случае следует указать имя исходной программы без расши­рения (.asm), например:
runasm hello
21
или
runasm data
4. Опираясь на приведенные выше примеры, создайте универсальный
командный файл с именем asmdebug.bat, с помощью которого можно было бы компилировать, линковать и запускать в отладчике загрузочный
файл заданной исходной программы.
5. Продемонстрируйте преподавателю работающие программы
hello и data, использование отладчика в пошаговом режиме, а также разработанные командные файлы.
2.5 Требования к отчету
Отчет должен включать:
- описание полного цикла разработки программы на языке ассемблер
в среде MASM32;
- краткое описание используемых ключей программ ассемблирова-
ния и редактирования связей;
- текст программы hello;
- сегмент данных и сегмент кода из листинга программы
hello(hello.lst);
- текст программы data;
- сегмент данных и сегмент кода из листинга программы data
(data.lst);
- результаты работы в отладчике программы data в виде таблиц 2.2,
2.3, 2.4;
- тексты разработанных командных файлов и их назначение.
ВНИМАНИЕ! Для представления текстов программ, листингов, дам­пов в данном и последующих отчетах используйте моноширинный шрифт (например, Courier New).
2.6 Контрольные вопросы
1. Дайте определения понятиям машинный язык, язык ассемблер, ас­семблер, ассемблирование, редактирование связей, исходный файл, объект­ный код, загрузочный код.
2. Из каких сегментов состоит ассемблерная программа? Для чего слу­жит регистр EIP?
3. В чем заключаются основные отличия между сегментированной и плоской моделью размещения программ в оперативной памяти?
4. Перечислите и охарактеризуйте основные этапы разработки ассем­блерных программ.
22
5. Как формируется и для чего служит файл листинга программы? Объясните основные данные, представленные в листинге.
6. Для чего служит отладчик? Какие приемы отладки программ вы знаете? Какая информация о разрабатываемой программе представлена в окнах отладчика?
7. Объясните содержимое таблиц, представленных в отчете.
23
3 АРИФМЕТИЧЕСКИЕ ВЫЧИСЛЕНИЯ. ЛАБОРАТОРНАЯ
РАБОТА №2.
Содержание работы
- изучение арифметических команд сложения, вычитания, умноже­ния и деления;
- изучение команд сравнения и перехода;
- написание и отладка программы вычисления арифметических вы­ражений с ветвлением;
3.1 Флаги
Особую роль при выполнении арифметических операций играют флаги. Флаги – это однобитовые признаки, формируемые процессором в соответствии с результатом, полученным при выполнения некоторых ко­манд. Все флаги хранятся в регистре EFLAGS. Вот некоторые из них.
CF (Carry Flag) - флаг переноса. Содержит значение «переносов» или «заемов», затрагивающих старший разряд результирующего операнда при
выполнении арифметических операций и логических операций сдвига.
OF (Overflow Flag) - флаг переполнения. Фиксирует арифметическое переполнение, т.е. перенос (заем) в/из старшего (знакового) бита при вы-
полнении знаковых арифметических операций.
ZF (Zero Flag) - флаг нуля. Формируется в качестве результата выпол­нения арифметических команд и команд сравнения. Ненулевой результат
приводит к установке нулевого значения этого флага, а нулевой - к уста­новке единичного значения. Команды условного перехода JE и JZ прове-
ряют значение именно этого флага.
SF (Sign Flag) - флаг знака. Устанавливается в соответствии со знаком старшего бита результата после выполнения арифметических операций: по-
ложительный результат устанавливает 0, а отрицательный - 1. Команды условного перехода JG и JL проверяют именно этот флаг.
PF (Parity Flag) - флаг четности. Проверяет младшие восемь битов ре­зультата арифметической операции над данными. Нечетное число бит при-
водит к установке этого флага в 0, а четное - в 1.
3.2 Арифметические команды
Рассмотрим реализацию основных арифметических операций и опе­рации преобразования типов данных в ассемблере. При описании команд типы операндов будут представлены в символическом виде с использова­нием следующих обозначений:
m - операнд в памяти (переменная), r - регистровый операнд, i ­непосредственный операнд, a - адресный операнд.
24
Число, записываемое после символа, указывающего тип операнда, означает: 8 - байт, 16 - слово, 32 - двойное слово. Например: r8 - однобай-
товый регистр, m16 - двухбайтовый операнд (слово) в памяти и т.п.
3.2.1 Команда сложения ADD
ADD приемник,источник
Действие команды: приемник := приемник + источник
Типы операндов
приемник – m8,r8,m16,r16,m32,r32 источник - m8,r8,i8,m16,r16,i16,m32,r32,i32
Приемник и источник должны иметь одинаковый размер в байтах!
Приемник и источник не могут быть одновременно операндами в па­мяти (переменными)!
Устанавливаемые флаги: CF, OF, ZF, SF, PF.
Флаг переноса CF устанавливается, если при сложении зафиксирован перенос из старшего разряда. Флаг переполнения OF устанавливается, если имеет место только один из двух переносов: из знакового (старшего) раз-
ряда, либо в знаковый (старший) разряд.
Признаком правильности результата сложения беззнаковых чисел яв­ляется значения флага переноса CF=0 (CF=1 – ошибка). Признаком пра-
вильности результата сложения чисел со знаком является значения флага переполнения OF=0 (OF=1 – ошибка).
Примеры:
ADD AL,100 ; AL:=AL+100 ADD MEM,1Fh ; MEM:=MEM+1Fh ADD CX,DX ; CX:=CX+DX
MOV AH,100 ;AH:=100 ADD AH,100 ;AH:=AH+100=200, CF=0 ADD AH,56 ;AH:=AH+56=0, CF=1
3.2.2 Команда вычитания SUB
SUB приемник,источник
Действие команды: приемник := приемник - источник
Типы операндов (согласуются по размеру):
приемник – m8,r8,m16,r16,m32,r32 источник - m8,r8,i8,m16,r16,i16,m32,r32,i32
Приемник и источник не могут быть одновременно операндами в па­мяти (переменными)!
Устанавливаемые флаги: CF, OF, ZF, SF, PF.
25
Флаг переноса CF устанавливается, если при вычислении старшего
Тип операнда
Действие команды
разряда результата потребовался заем (т.е. если приемник меньше источ­ника). Флаг переполнения OF устанавливается, если имеет место только
один из двух заемов: из знакового (старшего) разряда, либо в знаковый (старший) разряд (т.е., если вычитаются числа разных знаков и результат находится вне диапазона представления знаковых чисел).
Признаком правильности результата вычитания беззнаковых чисел является значения флага переноса CF=0 (CF=1 – ошибка). Признаком пра-
вильности результата сложения чисел со знаком является значения флага переполнения OF=0 (OF=1 – ошибка).
Примеры:
SUB AL,100 ; AL:=AL-100 SUB MEM,1Fh ; MEM:=MEM-1Fh SUB CX,DX ; CX:=CX-DX
MOV AH,100 ;AH:=100 SUB AH,100 ;AH:=AH-100=0, CF=0, OF=0, ZF=1 SUB AH,1 ;AH:=AH-1=255, CF=1, OF=0, ZF=0
3.2.3 Команды умножения MUL, IMUL
Для умножения беззнаковых чисел используется команда MUL, для умножения чисел со знаком – IMUL.
MUL операнд
IMUL операнд
Действие команды определяется типом операнда:
m8,r8 AX := операнд * AL m16,r16 (DX:AX):= операнд * AX m32,r32 (EDX:EAX):= операнд * EAX
Устанавливаемые флаги: CF, OF, ZF, SF, PF. CF и OF устанавливаются в 0, если старшая половина результата нулевая (произве-
дение имеет такой же размер, как и сомножители).
Примеры:
MOV AL,20 MOV BL,7 MUL BL ; AX:=BL*AL=140<255 ; CF=OF=0
MOV AL,20 MOV BL,13 MUL BL ; AX:=BL*AL=260>255
26
; CF=OF=1
Действие команды
Частное
Остаток
3.2.4 Команды деления DIV, IDIV
Для деления беззнаковых чисел используется команда DIV, для де­ления чисел со знаком – IDIV.
DIV операнд
IDIV операнд
Действие команды определяется типом операнда, частное размеща­ется в 1-м регистре, остаток во 2-м:
Тип
операнда
m8,r8 AL := AX / операнд AH := MOD (AX / операнд) m16,r16 AX := (DX:AX)/ операнд DX := MOD (AX / операнд) m32,r32 EAX :=(EDX:EAX)/ операнд EDX :=(EDX:EAX)/ операнд
Операнд имеет размер в два раза меньше, чем делимое, размещаемое в регистрах AX, DX:AX или EDX:EAX.
Устанавливаемые флаги: нет. Вызывает исключение типа “ошибка деления” при делении на ноль либо, когда частное слишком велико для размещения в регистрах AL/AX/EAX.
Примеры:
MOV BL=17 MOV AX,175 DIV BL ; AL:=AX/BL=10, AH:=MOD(AX/BL)=5
MOV BL=2 MOV AX,600 DIV BL ; AX/BL>255 => Divide overflow error!
3.2.5 Команды преобразования типа MOVSX, MOVZX
Команды MOVSX и MOVZX позволяют перемещать данные между ре­гистрами и ячейками памяти с расширением разрядности. Если использу-
ется команда MOVSX, то расширение происходит с учетом знака числа (ре­зультат дополняется битами так, чтобы сохранить знак числа). Команда
MOVZX расширяет разрядность чисел без учета знака (результат дополня­ется нулевыми битами).
Синтаксис:
MOVSX приемник,источник MOVZX приемник,источник
Типы операндов:
27
приемник - r16,r32 источник - r8,r16,m8,m16
В качестве приемника могут использоваться только 16- или 32-раз­рядные регистры общего назначения. В качестве источника могут исполь­зоваться только 8- или 16-разрядные регистры или ячейки памяти (перемен­ные). Разрядность источника всегда меньше разрядности приемника!
Флаги не изменяются.
Примеры:
MOVSX EAX,AX MOVSX EDX,CL MOVZX EBX,BX MOVZX CX,DL
3.3 Команды сравнения и передачи управления
Команды передачи управления служат для скачкообразного перехода на указанную команду, которая помечается символической меткой. Пере­ход реализуется путем изменения указателя команд EIP в соответствии с
адресом размещения помеченной команды.
3.3.1 Команда безусловного перехода JMP
JMP метка
Команда JMP реализует безусловный переход на строку программы, на которую указывает заданная метка
Тип операнда-метки – a8,a16,a32
Устанавливаемые флаги: нет
Примеры:
JMP CYCLE ;переход вперед . . . CYCLE: MOV AX,1Fh . . . NEXT: MOV AX,0 . . . JMP NEXT ;переход назад
3.3.2 Команда сравнения CMP
CMP операнд1,операнд2
Команда CMP производит вычитание операнд1-операнд2 и формирует флаги, как в команде вычитания. При этом операнды не изме-
няются, результат никуда не заносится!
Типы операндов (согласуются по размерам):
операнд1 – m8,r8,m16,r16,m32,r32
28
операнд2 - m8,r8,i8,m16,r16,i16,m32,r32,i32
Переход, если больше или равно
Переход, если меньше
Переход, если меньше или равно
Переход, если больше или равно
Переход, если меньше
Переход, если равно
Переход, если не равно
При прямой проверке флагов
Переход, если ноль
Переход, если не ноль
Операнды не могут быть одновременно операндами в памяти (пере­менными)!
Устанавливаемые флаги: CF, OF, ZF, SF, PF
Примеры:
MOV AX,20 CMP AX,10 ;20-10=10 -> CF=0,OF=0,ZF=0,SF=0 CMP AX,20 ;20-20=0 -> CF=0,OF=0,ZF=1,SF=0 CMP AX,30 ;20-30=-10 -> CF=1,OF=0,ZF=0,SF=1
3.3.3 Команды условного перехода
Jxx метка
Особенностью команд условного перехода является включение в наименование команды символов, определяющих условие перехода. Дей­ствие команды: переход на выполнение команды, которой предшествует указанная метка, в случае если определенное условие истинно. В против­ном случае выполняется следующая команда. Проверка условия связана с анализом состояния флагов, устанавливаемых, обычно, по команде срав­нения CMP (но не обязательно!).
Тип операнда: метка – a8,a16,a32
Устанавливаемые флаги: нет
В таблице 3.1 представлены все поддерживаемые типы команд условного перехода.
Таблица 3.1 - Команды условного перехода
Команда Наименование Условия перехода
При сравнении чисел без знака по команде CMP JA или JNBE
JAE или JNB JB или JNAE JBE или JNA
При сравнении чисел со знаком по команде CMP JG или JNLE
JGE или JNL JL или JNGE JLE или JNG
При сравнении любых чисел по команде CMP JE JNE
Переход, если больше
Переход, если больше
Переход, если меньше или равно
CF=0 и ZF=0 CF=0 CF=1
CF=1 или ZF=1
ZF=0 и SF=OF SF=OF SF <> OF
ZF=1 и SF <> OF
ZF=1 ZF=0
JZ JNZ
ZF=1 ZF=0
29
Команда Наименование Условия перехода
Переход, если есть перенос
Переход, если нет переноса
Переход, если переполнение
Переход, если нет переполнения
Переход, если знак минус
Переход, если знак плюс
Переход, если четный
Переход, если нечетный
JC JNC JO JNO JS JNS JP JNP
При проверке регистра CX/ECX JCXZ
JECXZ
Переход, если CX=0 Переход, если ECX=0
CF=1 CF=0 OF=1 OF=0 SF=1 SF=0 PF=1 PF=0
CX=0 ECX=0
Примеры:
CMP X,30 JGE CONT ;переход, если больше или равно . . . CONT: MOV AX,0
Обратите внимание: для сравнения значений знаковых и беззнако­вых чисел на "больше-меньше" представлены разные наборы команд!
3.4 Рабочее задание
1. Написать и отладить программу вычисления функции Y(X) (по ва-
риантам, представленным в таблице) с учетом следующих требований:
- типы переменных X и Y задаются преподавателем;
- при выполнении арифметических операций там, где это необхо-
димо, производить контроль флагов переноса (СF) и переполнения (OF) с целью выявления ошибочного результата;
- арифметические ошибки фиксировать с помощью переменной
MYERR, которой присваивается значение 1 при наличии ошибки, и 0 в про­тивном случае;
- в шапку программы включить в виде комментария сведения об ав-
торе, номер варианта и расчетную формулу.
Пример программы представлен в п. 3.7 (X и Y - однобайтовые беззна­ковые числа).
Таблица 3.2 - Варианты задания
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]