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

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Костенко Т. П.Программирование на языке ассемблер. Методические указания к выполнению лабораторных работ
СОДЕРЖАНИЕ
[1] 1 ЦЕЛЬ РАБОТЫ [2] 2 ПОДГОТОВКА К ВЫПОЛНЕНИЮ РАБОТЫ [3] 3 ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ ПОЛОЖЕНИЯ ПО ПРОГРАММИ-РОВАНИЮ НА ЯЗЫКЕ АССЕМБЛЕР [4] 4 ПРОЦЕСС АССЕМБЛИРОВАНИЯ И ВЫПОЛНЕНИЯ ПРОГРАММЫ [5] 5 ПРОГРАММИРОВАНИЕ НА АССЕМБЛЕРЕ [6] 6 ЗАДАНИЕ [7] 7 СОДЕРЖАНИЕ ОТЧЕТА [8] 8 КОНТРОЛЬНЫЕ ВОПРОСЫ |
СПИСОК ЛИТЕРАТУРЫ.....................................................................................30
Целью проведения лабораторной работы является:
Лабораторная работа рассчитана на студентов, не имеющих опыта работы на языке ассемблер. Студент должен уметь работать в любом текстовом редакторе, c проводником или в Norton Commander. При подготовке к работе студент должен ознакомиться с материалом, изложенным в разделе 3, 4 и 5, а также с общей структурой данного методического указания. Готовность студента к выполнению лабораторной работы определяется путем проведения собеседования.
Защита лабораторной работы осуществляется после написания студентом отчета. В ходе защиты студент должен ответить на контрольные вопросы и продемонстрировать на ЭВМ работу программы.
3.1 Режимы адресации данных микропроцессора Intel 8086
1) Непосредственный. Данное длинной 8 или 16 бит является частью команды.
Например: выражение-константа: 12; 1010В; 08АH; AB; XX-YY-5.
2) Прямой. 16-битный эффективный адрес данного является частью команды.
Например: переменнаявыражение-константа: CNT; CNT+5; ARRAY-5.
3) Регистровый. Данное содержится в определяемом командой регистре (Аx,bx,cx,dx,si,di,sp,bp).
Например: регистр: AX; BH; DL.
4) Регистровый косвенный. Эффективный адрес данного находится в базовом регистре BX или индексном SI,DI:
.
Например: [регистр]: [BX].
5) Регистровый относительный. Эффективный адрес равен сумме 8 или 16 битного смещения и содержимого базового или индексного регистров:
.
Например: переменная + [регистрвыражение константа]: CST[BX]; MES[SI+10H]; [BX-1].
6) Базовый индексный. Эффективный адрес равен сумме содержимого базового и индексного регистров, определяемых командой:
.
Например: [базовый регистр][индексный регистр] : [BX][DI].
7) Относительный базовый индексный. Эффективный адрес равен сумме 8 или 16 битного смещения и базово - индексного адреса:
.
Например: переменная + [базовый регистрвыражение константа] [индексный регистрвыражение константа] : E[BX+5][SI-2]; DATA[BX][SI]; [BX+2][SI].
3.2 Режимы адресации переходов микропроцессора Intel 8086
1) Внутрисегментный прямой. ЭА перехода равен сумме смещения и текущего содержимого IP. В команде условного перехода смещение только 8 бит (короткий переход).
Например: меткавыражение константа: Labl1+27.
2) Внутрисегментный косвенный. ЭА перехода есть содержимое регистра или ячейки памяти, указанных в любом режиме кроме непосредственного. Допустим только для безусловных переходов.
3) Межсегментный прямой. Заменяет содержимое IP одной частью команды, а содержимое CS - другой.
Например: меткавыражение константа: BRANCH_EXT.
4) Межсегментный косвенный. Заменяет содержимое IP и CS содержимым двух смежных слов из памяти, определенных в любом режиме кроме, непосредственного и регистрового.
3.3 Слово состояния микропроцессора Intel 8086
Флажки условий:
Флажок знака SF. Равен старшему биту результата.
Флажок нуля ZF. Устанавливается в единицу при получении нулевого результата и сбрасывается в ноль, если результат отличается от нуля.
Флажок паритета PF. Устанавливается в единицу, если младшие 8 бит результата содержат четное число единиц, в противном случае он сбрасывается в ноль.
Флажок переноса CF. При сложении (вычитании) устанавливается в единицу, если возникает перенос (заем) из старшего бита.
Флажок вспомогательного переноса AF. Устанавливается в единицу, если при сложении (вычитании) возникает перенос (заем) из бита 3. Только для двоично-десятичной арифметики.
Флажок переполнения OF. Устанавливается в единицу, если возникает переполнение, т.е. получение результата вне допустимого диапазона. При сложении этот флажок устанавливается, если имеется перенос в старший бит и нет переноса из старшего бита и наоборот.
Флажки управления:
Флажок направления DF. Применяется в командах манипуляции цепочками.
Флажок разрешения прерываний IF. Когда установлен этот флажок, центральный процессор распознает маскируемые прерывания, иначе прерывания игнорируются.
Флажок прослеживания (трассировки) TF. Когда этот флажок установлен, после выполнения каждой команды генерируется внутреннее прерывание.
3.4 Список сокращений и условных обозначений
СОКРАЩЕНИЕ СМЫСЛОВОЕ ЗНАЧЕНИЕ СОКРАЩЕНИЕ СМЫСЛОВОЕ ЗНАЧЕНИЕ
OPR Операнд DATA8 8-битный непосредственный
операнд
SRC Операнд-источник DATA16 16-битный непосредственный
операнд
DST Операнд-получатель AX,BX.CX,DX Регистры 16-битные
REG Регистр AL,AH,BL,BH Регистры 8-битные
RSRC Регистр-источник CL,CH,DL,DH Регистры 8-битные
RDST Регистр-получатель IP Регистр-указатель команды
CNT Счетчик SP Регистр-указатель стека
DISP Смещение (общее обозн.) BP Регистр базовый
D8 8-битное смещение SI,DI Регистры индексные
ADDR Адрес CS,SS,DS,ES Регистры сегментные
EA Эффективный адрес оF,IF,TF Флажки управляющие
SEG Сегмент DF,SF,ZF Флажки условий
DATA Непосредственный операнд AF,PF,CF Флажки условий
3.5 Общий формат ассемблерной команды
Метка: Мнемоника Операнд, Операнд ; Комментарий
Первым символом в метке должна быть буква. Все имена регистров являются зарезервированными и их использовать в качестве метки нельзя. Они используются для указания соответствующих регистров.
Команда - указывает транслятору с ассемблера какое действие должен выполнить данный оператор. В сегменте данных команда или псевдооператор определяет поле, рабочую область или константу.
Операнды - регистры, метки данных или непосредственные данные.
3.6 Определение данных
Формат операторов резервирования и инициализации данных:
Переменная Мнемоника Операнд,...,Операнд ; Комментарий
Переменной назначается смещение первого резервируемого байта.
Мнемоника определяет длину каждого операнда:
Операнды показывают инициализируемые данные или объем резервируемого пространства. Операнд резервирует место без инициализации. Выражение может содержать константу напр. 25 или ? для неопределенного значения.
Примеры:
Data_Byte DB 104,56,12
Data_word DW 100H,FFH,-5
Data_DW DD 5*25,0FFFDH,1
Data_str DB H,E,L,L,O
Data_str1 DB HELLO
При определении большого числа ячеек можно применять оператор повторения DUP (Операнд,...,Операнд). Например конструкции:
Arr DB 30 DUP(1,2) - зарезервирует 30 однобайтовых ячеек с начальными значениями 1 в нечетных и 2 в четных;
ММ1 DB 15 DUP (14) - означает, что по адресу ММ1 находятся 15 байт содержащих шестнадцатиричную цифру 0ЕH.
3.7 Команды языка ассемблер
В персональных ЭВМ форматы команд достаточно разнообразны. Имеются команды с одним или двумя операндами.
Например:
Предназначены для пересылок данных, адресов и непосредственных операндов в регистры или в ячейки памяти. Их описание представлено в таблице 1.
Таблица 1 - Формат команд передачи данных
Название команды |
Мнемоника и формат команды |
Описание действия |
Передать |
MOV DST,SRC |
(DST)(SRC) |
Загрузить эффективный адрес |
LEA DST,SRC |
(REG) (SRC) |
Загрузить в DS указатель |
LDS DST,SRC |
(REG) (SRC) (DS) (SRC+2) |
Загрузить в ES указатель |
LES DST,SRC |
(REG) (SRC) (ES) (SRC+2) |
Обменять |
XCHG OPR1,OPR2 |
(OPR1) (OPR2) |
Ни один из флажков не изменяется.
Режимы адресации. Получатель не может быть непосредственным и не может быть CS. В командах LEA, LES, LDS операнд REG не может быть сегментным регистром, а источник не может иметь непосредственный или регистровый режим. В команде MOV один из операндов должен быть регистром. В команде XCHG хотя бы один из операндов должен быть регистром, но ни один из операндов не может быть сегментным регистром.
3.7.2 Команды двоичных сложений и вычитаний
Применяются для выполнения арифметических операций над двоичными, упакованными и неупакованными двоично-кодированными десятичными числами. Их описание представлено в таблице 2.
Таблица 2 - Формат команд двоичных сложений и вычитаний
Название команды |
Мнемоника и формат команды |
Описание действия |
Сложить |
ADD DST,SRC |
(DST)(SRC) + (DST) |
Сложить с переносом |
ADC DST,SRC |
(DST) (SRC) + (DST) +(CF) |
Вычесть |
SUB DST,SRC |
(DST)(DST) - (SRC) |
Вычесть с заемом |
SBB DST,SRC |
(DST)(DST)-(SRC)-(CF) |
Модифицируются все флажки условий.
Режимы адресации. Один из операндов должен находиться в регистре. Другой операнд может иметь любой режим адресации.
3.7.3 Однооперандные команды двоичной арифметики и команды сравнения
Применяются для увеличения или уменьшения на единицу операнда и для сравнения двух операндов. Их описание представлено в таблице 3.
Таблица 3 - Формат однооперандных команд двоичной арифметики и команды сравнения
Название команды |
Мнемоника и формат команды |
Описание действия |
Инкремент |
INC OPR |
(OPR)(OPR) + 1 |
Декремент |
DEC OPR |
(OPR)(OPR) - 1 |
Изменить знак |
NEG OPR |
(OPR)(OPR) - (OPR) |
Сравнить |
CMP OPR1,OPR2 |
(OPR1) - (OPR2) |
Модифицируются все флажки условий, но команды INC и DEC не воздействуют на флажок CF.
Режимы адресации. В командах INC, DEC, NEG не допускается непосредственный режим. В команде CMP один из операндов должен быть регистром. Другой операнд может иметь любой режим адресации, но OPR1 не может быть непосредственным значением.
3.7.4 Команды двоичных умножения и деления
1) Умножить со знаком .
IMUL SRC
операнды-байты: (AX) (AL)*(SRC) ,
операнды-слова: (DX:AX) (AX)*(SRC) .
Произведения со знаком. Знак определяется по алгебраическим правилам.
2) Умножить без знака.
MUL SRC .
Аналогична команде IMUL, но операнды и произведения беззнаковые.
3) Разделить со знаком.
IDIV SRC
делитель-байт: (AL) частное (AX)/(SRC) ,
(AH) остаток (AX)/(SRC) .
Делитель-слово: (AX) частное (DX:AX)/(SRC),
(DX) остаток (DX:AX)/(SRC) .
Частное и остаток имеют знаки, знак остатка равен знаку делимого.
4) Разделить без знака
DIV SRC .
Аналогична команде IDIV, но операнды, частное и остаток, беззнаковые
Флажки. Команды IMUL, MUL устанавливают OF и CF в состояние 1, если для результата требуется два байта (слово). Иначе эти флажки нулевые. Остальные флажки не определены.
Режимы адресации. Операнды источники не могут быть непосредственными значениями, а все другие режимы адресации допустимы. Получателем должен быть регистр AX или DX:AX.
Команды микропроцессора, реализующие логические операции. Все команды обрабатывают операнды (байты или слова) поразрядно. Логические команды наиболее часто используются для селективных установок, инвертирования, сброса или проверки бит в операнде получателе в соответствии с двоичным набором операнда-источника. Такие действия часто встречаются в операциях над битами регистров и данных ввода-вывода. При этом операнд источник называют маской, а сама операция называется маскированием. Их описание представлено в таблице 4.
Таблица 4 - Формат логических команд
Название команды |
Мнемоника и формат команды |
Описание действия |
Инвертировать |
NOT OPR |
(OPR)not OPR |
Объединить по "или" |
OR DST,SRC |
(DST)(DST) or (SRC) |
Объединить по "и" |
AND DST,SRC |
(DST)(DST) and (SRC) |
Сложить по MOD2 |
XOR DST,SRC |
DST)(DST) xor (SRC) |
Проверить |
TEST OPR1,OPR2 |
OPR1 and OPR2 |
Флажки. Команда NOT не воздействует на флажки. Остальные команды сбрасывают OF и CF, оставляют АF не определенным и устанавливают СF, ZF, PF по обычным правилам.
Режимы адресации. В команде NOT не допускается непосредственный операнд. В остальных командах один из операндов должен быть регистром. Другой операнд может иметь любой режим адресации.
Эти команды перемещают все биты операнда влево на указанное CNT число. В командах сдвига влево с правой стороны операнда "вдвигаются" нули, а старшие биты "выдвигаются" с левой стороны и теряются, но последний из них сохраняется во флаге CF. Команды сдвига вправо аналогичным образом сдвигают биты вправо. Но арифметический сдвиг вправо не помещает слева нули, а дублирует в старшие биты знак операнда. Команды циклического сдвига отличаются от команд сдвига тем, что операнд считается "кольцом", в котором выдвигаемые с одной стороны вдвигаются с другой стороны. Их описание представлено в таблице 5.
Таблица 5 - Формат команд сдвигов и циклических сдвигов
Название команды |
Мнемоника и формат команды |
Описание действия |
Сдвинуть логически влево |
SHL OPR,CNT |
0 CF OPR |
Сдвинуть арифметически влево |
SAL OPR,CNT |
Аналогична SHL |
Сдвинуть логически вправо |
SHR OPR,CNT |
0 OPR CF |
Сдвинуть арифметически вправо |
SAR OPR,CNT |
OPR CF |
Сдвинуть циклически влево |
ROL OPR,CNT |
CF OPR |
Сдвинуть циклически вправо |
ROR OPR,CNT |
OPR CF |
Сдвинуть циклически влево через перенос |
RCL OPR,CNT |
CF OPR |
Сдвинуть циклически вправо через перенос |
RCR OPR,CNT |
OPR CF |
Число сдвигов определяется CNT. Он может быть 1, выражением - константой равной 1 или регистр CL. В CL любое число.
Флажки. Перенос CF устанавливается в соответствии с режимом адресации. Флажки SF, ZF, PF модифицируются командами сдвига, но команды циклических сдвигов на них не воздействуют. Флажок OF имеет смысл, если только счетчик равен 1. Команды сдвигов влияют на состояние флажка АF, но оно определенного смысла не имеет.
Режимы адресации. OPR может иметь любой режим адресации, кроме непосредственного.
3.7.7 Команды безусловных переходов
Эти команды нарушают естественный порядок выполнения команд посредством загрузки в командный счетчик адреса команд, к которой осуществляют переход. Межсегментные передачи управления реализуются только командами безусловных переходов.
Название мнемоника и формат описание
Внутрисегментный прямой JMP SHORT OPR (IP)(IP)+ 8-битное
короткий переход смещение, определяемое OPR
Внутрисегментный прямой JMP NEAR OPR (IP) (IP)+ 16-битное
близкий переход смещение, определяемое OPR
Внутрисегментный прямой JMP OPR * (IP)(EA), где EA
косвенный переход определяется OPR
Межсегментный прямой JMP FAR PTR OPR (IP) смещение OPR в
далекий переход сегменте (CS ) сегментный
адрес сегмента, содержащего OPR
Межсегментный JMP OPR * (IP)(EA), где EA определяется косвенный переход OPR, (CS)(EA+2), где EA
определяется OPR
Тип перехода определяется типом операнда.
Не модифицируются все флажки условий.
Режимы адресации. Во внутрисегментных прямых переходах применяется относительный режим, в межсегментных прямых переходах - прямой режим. В косвенных переходах не допускается непосредственный режим, а в межсегментных косвенных переходах должна адресоваться память.
В этих командах, также как и в командах безусловного перехода, нарушается естественный порядок выполнения команд. Но в условном переходе замена содержимого программного счетчика зависит от состояния флагов.
Название Мнемоника и формат Проверочное условие
Перейти, если нуль или равно JZ OPR или (JE) ZF = 1
Перейти, если не нуль или не равно JNZ OPR или (JNE) ZF = 0
Перейти, если знак установлен JS OPR SF = 1
Перейти, если знак сброшен JNS SF = 0
Перейти, если есть переполнение JO OPR OF = 1
Перейти, если нет переполнения JNO OPR OF = 0
Перейти, если паритет установлен JP OPR или (JPE) PF = 1
Перейти, если паритет сброшен JNP OPR или (JPO) PF = 0
Перейти, если ниже/не выше или JB OPR или (JC) CF = 1
равно (без знака)
Перейти, если не ниже/выше или JNB OPR или (JNC) CF = 0
равно (без знака)
Перейти, если ниже или равно/ JBE OPR или (JNA) CZ ZF=1
не выше (без знака)
Перейти, если не ниже или равно JNBE OPR или (JA) CF ZF=0
выше (без знака)
Перейти, если меньше/не больше JL OPR или (JNGE) SF OF=1
или равно (со знаком)
Перейти, если не меньше/больше JNL OPR или (JGE) SF OF=0
или равно (со знаком)
Перейти, если меньше или JLE OPR или (JNG) (SF OF) ZF=1
равно/не больше (со знаком)
Перейти, если не меньше или JNLE OPR или (JG) (SF OF) ZF=1
равно/ больше (со знаком)
Если проверочное условие удовлетворяется,
(Программный счетчик) ( Программный счетчик)+ 8-битное смещение с расширением знака. В противном случае программный счетчик не изменяется и программа продолжается в естественном порядке.
Не модифицируются все флажки условий.
Режимы адресации. Режим относительно программного счетчика. Операнд OPR должен быть в пределах -128...127 байт от команды, находящейся за командой перехода.
3.7.9 Команды циклов
НАЗВАНИЕ МНЕМОНИКА И ФОРМАТ ПРОВЕРЯЕМОЕ УСЛОВИЕ
Зациклить LOOP OPR (CX) 0
Зациклить, пока нуль или равно LOOPZ OPR ZF=1 и (CX) 0
Зациклить, пока не нуль или не равно LOOPNZ OPR ZF=0 и (CX) 0 Перейти по CX JCXZ OPR (CX) = 0
За исключением команды JCXZ, которая не изменяет (CX), производится (CX)(CX)-1, затем, если проверяемое условие удовлетворяется, (IP)(IP)+D8 с расширением знака; в противном случае (IP) не изменяется и программа продолжается в естественном порядке.
Не модифицируются все флажки условий.
Режимы адресации. Режим относительно IP. Операнд OPR должен быть меткой, которая находится в диапазоне -128...127 байт от команды, следующей за командой цикла.
НАЗВАНИЕ МНЕМОНИКА И ФОРМАТ ОПИСАНИЕ
Включить в стек PUSH SRC (SP)(SP)-2 ((SP)+1:(SP) (SRC)
Извлечь из стека POP DST (DST)((SP)+1:(SP) (SP)(SP)+2
Для работы с программой необходимо:
1) Создать в любом pедактоpе пpогpамму на ассемблеpе т.е. символьный файл- исходный модуль. Имя файла должно иметь pасшиpение - .ASM.
2) Файл с pасшиpением .ASM стpанслиpовать т.е. набpать на клавиатуpе:
TASM Имя файла.ASM /Z .
После тpансляции на экpане появится сообщение:
Assembling file: транслируемый файл.
Error messages: сообщения об ошибках. ( None - нет ошибок)
Warning messages: предупреждающее сообщение.
Passes: количество страниц.
Remaining memory: занимаемая память.
Результатом работы транслятора будет файл с расширением - .OBJ - объектный модуль. После трансляции можно получить листинг - отпечатанную программу с относительными адресами и машинным кодом.
3) Странслированный без ошибок файл необходимо обработать компоновщиком т.е. набрать на клавиатуре:
TLINK Имя файла.OBJ /V .
Результатом будет файл с расширением .EXE или .COM - загрузочный модуль. Эти программы готовы к выполнению на ЭВМ. Их имена можно набрать на клавиатуре и нажать Enter. Выполнение команд программы можно посмотреть в отладчике.
4) Для работы в отладчике необходимо иметь программу с расширением .EXE или .COM. Набрать на клавиатуре:
TD Имя файла.EXE
4.1 Работа с отладчиком программ
Нижнее меню в отладчике - меню функциональных клавиш.
Значения некоторых функциональных клавиш:
Запускаются команды или с помощью мыши или с помощью куpсоpа на клавиатуре.
Курсором выбирается нужная команда и нажимается клавиша Enter или нажимается левая крайняя кнопка мыши, если выбоp был мышью.
В верхнем меню по команде FILE можно открыть любой файл, если он не был указан в команде TD при запуске отладчика.
По команде VIEW появляется еще меню, в котором Dump - команда получения содержимого памяти по соответствующему адресу заданному в регистре DS, т.е. содержимое данных определенных в нашей программе. Данные начинаются с нулевого относительного адреса. Эти данные можно изменять.
Registers - после запуска этой команды появляется окно с регистрами и данные находящиеся в этих регистрах можно изменять.
Курсором или мышкой выбрать изменяемый регистр и перевести курсор на изменяемое данное, на клавиатуре в появившемся окне набрать новое данное и нажать Enter.
Выход из отладчика по нажатию Alt-X.
Выход из любой команды по нажатию клавиши Esc.
Переход в верхнее меню можно осуществлять с помощью мыши.
Закрыть появившееся окно можно или нажать ALT-F3 или надо перевести мышкой курсор в левый угол окна на зеленый квадрат и нажать левую кнопку мыши.
5.1 Примеры программ
1) Программа сложения двух чисел:
s_s segment stack "stack" ; адрес начала сегмента стека
dw 12 dup(?) ; зарезервировано в памяти 12 слов с любым
; значением
s_s ends ; адрес конца сегмента стека
d_s segment ; адрес начала сегмента данных
aa dw 45h,23h ; данные т.е. числа 45 и 23 записаны по адре-
; су аа и аа+2 соответственно т.к. они опреде-
; лены как слова
sum dw 0 ; данное т.е. число 0 записано по адресу sum
; (это метка)
d_s ends ; адрес конца сегмента данных
c_s segment ; начало сегмента кода
assume ss:s_s,ds:d_s,cs:c_s ;псевдооператор, определяющий каким
;сегментным регистрам соответствуют
;назначенные метками адреса начала
;сегментов
beg: ; начало пpогpаммы - имя и после него двоеточие
mov ax,d_s; ; пересылка в регистр сегмента данных (ds) адреса
; начала сегмента данных т.е. метки начала сегмента
; данных
mov ds,ax ; пересылку в ds можно сделать только через
; промежуточную пересылку в рабочий регистр,
; например ax
mov ax,aa ; пересылка в регистр ax содержимого, находящегося
; по адресу аа т.е. числа 45
add ax,aa+2 ; сложить число, которое находится в регистре ax с
; содержимым, находящимся по адресу аа+2
; т.е.числа 23 и результат записывается в регистр ax
mov sum,ax ; переслать содержимое ax т.е. результат в ячейку
; памяти по адресу sum
mov ah,4ch ; для правильного завершения программы необходи-
; мо переслать в регистр ah - байт равный 4ch
int 21h ; и вызвать прерывание равное 21h
c_s ends ; конец сегмента кода
end begin ; конец программы. Метки начала и конца програм
; мы должны совпадать.
2) Программа сложения двух чисел c учетом переноса из старшего разряда:
s_s segment stack "stack" ; начало сегмента стека
dw 12 dup(?) ; зарезервировано в памяти 12 ячеек
s_s ends ; конец сегмента стека
d_s segment ; начало сегмента данных
aa dw 5435h,4531h; данные т.е. числа 5435h,4531h записаны по адресу аа
;и аа+2 соответственно т.к. они определены как слова
s1 dw 2h ; по адресу s1 записано число 2
sum dw ? ; любое данное записано по адресу sum (это метка)
d_s ends ; конец сегмента данных
c_s segment ; начало сегмента кода
assume ss:s_s,ds:d_s,cs:c_s;
begin: mov ax,d_s; начало программы.
mov ds,ax
mov ax,aa ; пересылка в регистр ax содержимого, находящегося
; по адресу аа т.е. числа 5435h
add ax,aa+2 ;сложить число, которое находится в регистре ax с
;содержимым, находящимся по адресу аа+2 т.е.числа
;4531h, результат записывается в ax
jno kof ; перейти, если нет переполнения (OF=0)
mov ax,aa ;если OF=1 - переполнение, выбрать опять число
add ax,s1 ; и сложить его с другим
kof: mov sum,ax ; переслать содержимое ax т.е. результат в ячейку
;памяти по адресу sum
mov ah,4ch ; для правильного завершения программы необходимо
;переслать в регистр ah 4ch
int 21h ; и вызвать прерывание равное 21h
c_s ends ; конец сегмента кода
end begin ; конец программы.
3) Программа сброса 3 и 4 бита в байте:
s_s segment stack "stack"
dw 12 dup(?)
s_s ends
d_s segment
аа db 75h
sum db 0
d_s ends
c_s segment
assume ss:s_s,ds:d_s,cs:c_s
begin: mov ax,d_s
mov ds,ax
mov dl,aa ; пересылка в регистр dl содержимого, находящегося
; по адресу аа
and dl,11100111b ; сбросить биты 3 и 4 т.е. установит в ноль
mov sum,dl ; записать результат в sum
mov ah,4ch
int 21h
c_s ends
end begin
s_s segment stack "stack"
dw 12 dup(?)
s_s ends
d_s segment
aa dw 5h,3h
sum dw "ОК",0ah,0dh,"$" ;в пеpвых кавычках то, что выводим, затем
;0ah -пеpевод стpоки, 0dh- возвpат каpетки,
;$- стpока должна завеpшаться этим символом
d_s ends
c_s segment
assume ss:s_s,ds:d_s,cs:c_s;
begin: mov ax,d_s
mov ds,ax;
mov ah,9h ; вывод стpоки символов на экpан. Функция 9h
lea dx,sum ;адpес стpоки для вывода
int 21h ;печатаем стpоку
mov ah,4ch
int 21h
c_s ends
end begin
5) пpогpамма, использующая условный переход:
s_s segment stack "stack"
dw 12 dup(?)
s_s ends
d_s segment
aa dw 10
d_s ends
c_s segment
assume ss:s_s,ds:d_s,cs:c_s;
begin: mov ax,d_s
mov ds,ax;
cmp aa,10
jge vvv ; вызывает переход к метке vvv, если содержимое аа >=10
................. иначе будут выполняться следующие команды
................
vvv: ..............
mov ah,4ch
int 21h
c_s ends
end begin
s_s segment stack "stack"
dw 12 dup(?)
s_s ends
d_s segment
aa dw 10
d_s ends
c_s segment
assume ss:s_s,ds:d_s,cs:c_s;
begin: mov ax,d_s
mov ds,ax;
call pr1 ;вызов подпрограммы
...............
call pr1 ;вызов подпрограммы
...............
mov ah,4ch
int 21h
pr1 proc near ;начало подпрограммы (ближний вызов)
push ax ; записать в стек регистр ах
.............
pop ax ;выбрать из стека регистр ах
ret ; команда возврата на следующую команду после
; вызова прцедуры
pr1 endp ;конец подпрограммы
c_s ends
end begin
s_s segment stack "stack"
dw 12 dup(?)
s_s ends
d_s segment
sum db 0
d_s ends
c_s segment
assume ss:s_s,ds:d_s,cs:c_s
begin: mov ax,d_s
mov ds,ax
mov al,14h ; переписать N регистра (14-хранит информацию о
out 70h,al ; периферии) в 70h порт (через дополнительную
; пересылку в регистр al)
in al,71h ; прочесть содержимое 14 регистра через 71h порт
test al,10b ; проверить 1 бит, который указывает есть ли
; сопроцессор
JZ NO_C ; если не установлен 1 бит, то переход на метку
................ ; если установлен (равен 1) то выполняются следующие
................ ; команды
NO_C ............... ; сопроцессора нет
................
mov ah,4ch
int 21h
c_s ends
end begin
Программы, имеющие такой вид, компонуются в файл с расширением .EXE.
Для инициализации ассемблеpной пpогpаммы необходимо:
Пpогpамма в фоpмате ЕХЕ может иметь любой pазмеp.
Программа с расширением .COM не должна пpевышать 64 Кбайт памяти.
Комментарий в программе начинается на любой строке с символа ”;”. При определении данных, начинающихся с буквы, необходимо перед буквой ставить цифру 0.
Физический адрес = (DS)*16 + EA.
Отчет должен содержать следующую информацию:
Необходимо ответить на такие вопросы:
11) что означает корректное завершение программы.
СПИСОК ЛИТЕРАТУРЫ