Содержание
- 5. Лабораторные работы (5) Арифметические операции ( для 4 типов данных ) Условные переходы Ввод-вывод на АССЕМБЛЕРЕ
- 6. Семейство процессоров 80х86 Семейство процессоров 80х86 корпорации Intel включает в себя микросхемы: 8086, 80186, 80286, 80386,
- 7. Регистры Для того, чтобы писать программы на ассемблере, нам необходимо знать, какие регистры процессора существуют и
- 9. Регистры Процессор 8086 имеет 14 шестнадцатиразрядных регистров, которые используются для управления исполнением команд, адресации и выполнения
- 10. регистр АХ служит для временного хранения данных (регистр аккумулятор); часто используется при выполнении операций сложения, вычитания,
- 11. Регистры сегментов. Имеются четыре регистра сегментов, с помощью которых память можно организовать в виде совокупности четырех
- 12. Регистр указателя команд IP. Регистр указателя команд IP, иначе называемый регистром счетчика команд, имеет размер 16
- 14. Указанные на рисунке флаги наиболее часто используются в прикладных программах и сигнализируют о следующих событиях: OF
- 17. Сегменты, принцип сегментации Числа, устанавливаемые процессором на адресной шине, являются адресами, то есть номерами ячеек оперативной
- 18. Когда процессор выбирает очередную команду на исполнение, в качестве ее адреса используется содержимое, регистра IP. Этот
- 20. Существуют три основных типа сегментов: сегмент кода – содержит машинные команды, Адресуется регистром CS; сегмент данных
- 21. Стек Во многих случаях программе требуется временно запомнить некоторую информацию. Эта проблема в персональном компьютере решена
- 22. Адресация данных Для четкого понимания того, как осуществляется адресация данных, проанализируем способ образования адреса операнда. Адрес
- 24. Режимы адресации В зависимости от местоположения источников образования полного (абсолютного) адреса в языке ассемблера различают следующие
- 25. Регистровая адресация Регистровая адресация подразумевает использование в качестве операнда регистра процессора, например: PUSH DS MOV BP,SP
- 26. Прямая адресация При прямой адресации один операнд представляет собой адрес памяти, второй – регистр: MOV Data,AX
- 27. Непосредственная адресация Непосредственная адресация применяется, когда операнд, длинной в байт или слово находится в ассемблерной команде:
- 28. Косвенная адресация При использовании косвенной адресации абсолютный адрес формируется исходя из сегментного адреса в одном из
- 29. Базовая адресация В случае применения базовой адресации исполнительный адрес является суммой значения смещения и содержимого регистра
- 30. Индексная адресация При индексной адресации исполнительный адрес определяется как сумма значения указанного смещения и содержимого регистра
- 31. Базово-индексная адресация Базово-индексная адресация подразумевает использование для вычисления исполнительного адреса суммы содержимого базового регистра и индексного
- 32. // #include int dddS,cccS,aaaS; extern "C" {void Lab3S(void);} void F_C(void) { dddS=aaaS+cccS; cout cout } void
- 33. .MODEL Large,C .data Extrn aaaS:byte,cccS:byte,dddS:byte .code Public Lab3S Lab3S proc far mov al,aaaS add al,cccS mov
- 34. Организация программы Сегменты Программа состоит из одного или нескольких сегментов. Обычно область памяти, в которой находятся
- 35. READONLY. Если этот операнд присутствует, MASM выдаст сообщение об ошибке на все команды, выполняющие запись в
- 36. Тип. Выбирает один из возможных типов комбинирования сегментов: тип PUBLIC (иногда используется синоним MEMORY) означает, что
- 37. Разрядность. Этот операнд может принимать значения USE16 и USE32. Размер сегмента, описанного как USE16, не может
- 38. Для обращения к любому сегменту следует сначала загрузить его сегментный адрес (или селектор в защищенном режиме)
- 39. Перечисленные директивы удобны для создания больших программ на ассемблере, состоящих из разнообразных модулей и содержащих множество
- 40. Модели памяти и упрощенные директивы определения сегментов Модели памяти задаются директивой .MODEL .model модель,язык,модификатор где модель
- 41. Язык — необязательный операнд, принимающий значения C, PASCAL, BASIC, FORTRAN, SYSCALL и STDCALL. Если он указан,
- 42. После того как модель памяти установлена, вступают в силу упрощенные директивы определения сегментов, объединяющие действия директив
- 43. Директива .CODE описывает основной сегмент кода .code имя_сегмента эквивалентно _TEXT segment word public ’CODE’ для моделей
- 44. .const Описывает сегмент неизменяемых данных: CONST segment word public ’CONST’ В некоторых операционных системах этот сегмент
- 45. Директивы задания набора допустимых команд По умолчанию ассемблеры используют набор команд процессора 8086 и выдают сообщения
- 46. Структура программы на языке Ассемблера Исходный программный модуль – это последовательность предложений. Различают два типа предложений:
- 47. Программа типа СОМ Программа, выводящая на экран текст «Hello world!». ; hello-l.asm ; Выводит на экран
- 48. Компиляция Для TASM: tasm hello-1.asm Для MASM: ml /c hello-1.asm Компоновка Для TLINK: tasm /t /x
- 49. Листинг трансляции
- 50. Команды программы имеют различную длину и располагаются в памяти вплотную друг к другу. Так, первая команда
- 51. Директивы инициализации и описания данных Данные могут размещаться в участках памяти, которые называются сегменты. Обычно это
- 52. Директивы для задания простых типов данных.
- 53. Мнемокоды директив инициализации данных Dx означают следующее: DB (Define Byte) — определить байт. DW (Define Word)
- 55. Арифметические команды Все арифметические команды устанавливают флаги CF, AF, SF, ZF, OF и PF в зависимости
- 56. Пример
- 57. Команды сложения ADD, ADC, INC Командам БЕЗРАЗЛИЧНО какие числа складываются (знаковые или нет). Если в результате
- 58. Состояние флагов после выполнения команд ADD, ADC, INC
- 59. Команда ADD ADD (ADDition — сложение). Синтаксис: ADD Приемник, Источник Логика работы: = +
- 60. Команда ADC - сложение с переносом Эта команда от команды ADD отличается использованием бита переноса CF
- 62. Команда INC Мнемокод этой команды получен в результате сокращения такого предложения: INCrement operand by 1 —
- 63. Команды вычитания SUB, SBB, DEC и NEG Команды вычитания SUB, SBB, DEC ОБРАТНЫ соответствующим командам сложения
- 64. title subaL ;x=a-b data segment para public Extrn x:Dword,a:Dword,b:Dword data Ends code segment para public assume
- 66. Команда NEG Команда NEG (NEGate operang — изменение знака операнда). Синтаксис: NEG Операнд Логика работы команды:
- 67. Команды умножения MUL и IMUL Это одни из САМЫХ НЕПРИЯТНЫХ команд целочисленной арифметики из-за наличия неявных
- 69. выводы Команда IMUL реагирует на ЗНАК перемножаемых чисел. Расположение Множимого и Произведения — строго определенное и
- 71. Умножение больших чисел Чтобы умножить большие числа, придется вспомнить правила умножения десятичных чисел в столбик: множимое
- 73. Чтобы выполнить умножение со знаком, потребуется сначала определить знаки множителей, изменить знаки отрицательных множителей, выполнить обычное
- 74. Команды деления DIV и IDIV DIV (DIVide - БЕЗЗНАКОВОЕ деление), IDIV (Integer Divide - ЗНАКОВОЕ деление
- 75. Неявные операнды команд DIV, IDIV
- 76. Выводы Команда IDIV реагирует на ЗНАК обрабатываемых чисел. Расположение Делимого и Результата — строго определенное и
- 78. Преобразование байта в слово и слова в двойное слово Данное преобразование для знаковых и беззнаковых данных
- 83. Деление больших чисел Общий алгоритм деления числа любого размера на число любого размера нельзя построить с
- 86. Команды передачи управления Команды передачи управления позволяют нарушить естественную последовательность выполнения команд. Команды безусловной передачи управления
- 87. Команды безусловной передачи управления JMP CALL RET
- 88. Команда безусловного перехода JMP Команда JMP LABEL осуществляет переход на указанную метку. Если заранее известно, что
- 89. NEAR переход в пределах сегмента FAR межсегментный переход Логика работы NEAR IP=IP+смещение FAR CS=CODE2 IP=IP+смещение
- 90. Команды условной передачи управления Команды условного перехода реализуют короткий переход, т.е. смещение в пределах [-128...127]. Если
- 91. Первая буква команды J от уже известного нам слова (Jump — прыжок). Остальные буквы (сс) в
- 92. Условный переход обычно реализуется в два шага: Сравнение (CMP), в результате чего формируются флаги Условная передача
- 93. Знаковые и беззнаковые данные Рассматривая назначение команд условного перехода следует пояснить характер их использования. Типы данных,
- 94. Разница в командах перехода для знаковых и беззнаковых данных объясняется тем, что они реагируют на РАЗНЫЕ
- 95. Переходы для беззнаковых данных Мнемоника Описание Проверяемые флаги JE/JZ Переход, если равно/нуль ZF JNE/JNZ Переход, если
- 96. Переходы для знаковых данных Мнемоника Описание Проверяемые флаги JE/JZ Переход, если равно/нуль ZF JNE/JNZ Переход, если
- 97. Специальные арифметические проверки Мнемоника Описание Проверяемые флаги JS Переход, если есть знак (отрицательно) SF JNS Переход,
- 98. Промоделируем на Ассемблере простейшую задачу для 16-разрядных знаковых и беззнаковых данных: unsigned int c, d; int
- 100. Команды циклов LOOPx Группа команд условного перехода LOOPх служит для организации циклов в программах. Все команды
- 101. Аналог реализации команды LOOP на Ассемблере: MOV СХ, Counter short_label: ; Выполнение тела цикла ; ;
- 102. MOV CX, Counter JCXZ ExitCicle ; если CX = 0, цикл ОБОЙТИ short_label: ; Выполнение тела
- 103. ПРИМЕР Вычислить значение факториала р = n! = 1*2*3*...*n Известно, что 0! = 1. Отрицательным значение
- 104. Public proizv2 Proizv2 Proc far ; Вариант 2 mov cx ,n ; количество повторений mov ax,1
- 105. Директива locals Директива locals позволяет нам не думать о дублировании имен меток в разных подпрограммах. Метки
- 106. Команда LOOPE (LOOPZ) Команда LOOPE (LOOPZ) переход по счетчику и если равно Данная команда имеет два
- 107. Команда LOOPNE (LOOPNZ) Команда LOOPNE (LOOPNZ) переход по счетчику и если НЕ равно Данная команда тоже
- 108. Синтаксис команды: LOOPNE короткая метка LOOPNZ короткая_метка Логика работы команды: СХ = Counter shortlabel: Выполнение тела
- 109. Вычислить значение суммы чисел натурального ряда: s = 1+2+3+...+n. Вычисления закончить, как только значение суммы станет
- 110. Работа с подпрограммами Команды CALL proc – Вызов подпрограммы proc RET - Возврат из подпрограммы
- 111. Команда вызова процедур CALL Команда CALL (вызов) аналогична команде JMP. Поскольку команда CALL предназначена для вызова
- 112. Если у вызываемой процедуры есть параметры, они передаются через стек ДО вызова процедуры. Паскаль и С++
- 113. Команда возврата в точку вызова RET Команда RET (RETurn from procedure — возврат из процедуры) по
- 114. Соглашения о вызовах в стиле Pascal Параметры в стек передаются по порядку слева направо, т.е. первым
- 115. Порядковый тип (integer, word, byte, shortint, char, longlnt, boolean, перечисления): Байт AL Слово AX Двойное слово
- 116. Написать функцию с параметрами для вычисления арифметического выражения i+j-k для 16-разрядных целых знаковых или беззнаковых чисел
- 117. Процедуру TESTA вызывается в Паскале: ta:= TESTA(i,j,k); До вызова процедуры в стек должны быть переданы параметры
- 118. Содержимое стека после вызова процедуры TESTA(i, j, k).
- 119. В конце процедуры происходит восстановление значения регистра BP и возврат в точку вызова с очисткой стека.
- 120. Директива ARG Существует более простой способ реализации подпрограмм с параметрами. В директиве ARG перечисляют по порядку
- 121. Синтаксис директивы: ARG список формалъных параметров [=их_длина] [RETURNS возв_значение] При этом с параметрами и возвращаемым значением
- 122. ; i+j-k : integer or word ; Called as: TESTA(i, j, k) ; ; Вариант 2
- 123. Соглашения о вызовах в стиле C/C++ Параметры в стек передаются справа налево. Первым в стек помещается
- 127. Модель large означает, что все процедуры имеют атрибут FAR. Функция int prim (int a, lilt b,
- 128. Содержимое стека после вызова подпрограммы prim
- 129. В конце подпрограммы происходит восстановление значения регистра BP и возврат в точку вызова. Очистка стека здесь
- 130. Команды сдвигов Команды сдвига перемещает все биты в поле данных либо вправо, либо влево, работая либо
- 131. Общая черта всех команд сдвига – установка флага переноса. Бит, попадающий за пределы операнда, сохраняется во
- 132. Команды сдвигов команды логического сдвига вправо SHR и влево SHL; команды арифметического сдвига вправо SAR и
- 134. Пример использования команды SHR MOV CL,03 ; AX: MOV AX,10110111B ; 10110111 SHR AX,1 ; 01011011
- 135. Команда арифметического сдвига вправо SAR MOV CL,03 ; AX: MOV AX,10110111B ; 10110111 SAR AX,1 ;
- 136. При сдвигах влево правые биты заполняются нулями. Таким обpазом, результат команд сдвига SHL и SAL идентичен.
- 137. Команды циклического сдвига Циклический сдвиг представляет собой операцию сдвига, при которой выдвинутый бит занимает освободившийся разряд.
- 138. Команда циклического сдвига ROR: MOV CL,03 ; BX: MOV BX,10110111B ; 10110111 ROR BX,1 ; 11011011
- 139. КОМАНДЫ ЛОГИЧЕСКИХ ОПЕРАЦИЙ: AND, OR, XOR, TEST, NOT Логические операции являются важным элементом в проектировании микросхем
- 140. AND: Если оба из сравниваемых битов равны 1, то результат равен 1; во всех остальных случаях
- 141. Первый операнд в логических командах указывает на один байт или слово в регистре или в памяти
- 142. Пример: вывести на экран шестнадцатеричное представление кода символа «Q». ;Сегмент стека SSEG SEGMENT STACK DB 256
- 143. MOV AH,2 ;В AH номер функции вывода MOV BX,0 ;Вывод на экран цифры соответствующей левой тетраде
- 144. Операции ввода с клавиатуры и вывода на экран в DOS приложениях Непосредственное чтение из клавиатурного буфера
- 145. ВЫВОД НА ЭКРАН СРЕДСТВАМИ DOS Вывод на экран средствами DOS осуществляет 09 функция INT 21H DOS.
- 146. ВВОД ДАННЫХ С КЛАВИАТУРЫ Для ввода с клавиатуры используется функция 0AH INT 21H. Она требует наличия
- 147. Так как в списке параметров директива LABEL не занимает места, то NAMEPAR и MAXLEN указывают на
- 148. Команда INT ожидает пока пользователь не введет с клавиатуры текст, проверяя при этом, чтобы число введенных
- 149. ПРИМЕР: ВВОД И ВЫВОД ИМЕН EXE-программа запрашивает ввод имени, затем отображает в середине экрана введенное имя
- 150. В процедуре E10CODE имеется команда, которая устанавливает cимвол звукового сигнала (07) в области ввода непосредственно после
- 151. ;-------------------------------------------------------- STSCKSG SEGMENT PARA STACK 'Stack' DW 32 DUP(?) STACKSG ENDS ;-------------------------------------------------------- DATASG SEGMENT PARA 'Data'
- 152. CODESG SEGMENT PARA 'Code" BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG PUSH DS SUB AX,AX PASH AX MOV
- 153. Вывод текста запроса: B10PRMP PROC NEAR MOV AH,09 ;Функция вывода на экран LEA DX,PROMPT INT 21H
- 154. Ввод имени с клавиатуры: D10INPT PROC NEAR MOV AH,0AH ;Функция ввода LEA DX,NAMEPAR INT 21H RET
- 155. Установка звукового сигнала и ограничителя '$': E10CODE PROC NEAR MOV BH,00 ;Замена символа Return (0D) MOV
- 156. Центрирование и вывод имени на экран: F10CENT PROC NEAR MOV DL,NAMELEN ;Определение столбца: SHR DL,1 ;
- 157. Очистить экран: Q10CLR PROC NEAR MOV AX,0600H ;Функция прокрутки экрана MOV BH,30 ;Цвет (07 для ч/б)
- 158. Установка курсора (строка/столбец): Q20CURS PROC NEAR ;DX уже установлен MOV AH,02 ;Функция установки курсора MOV BH,00
- 159. Преобразование строки в число и числа в строку Данные, вводимые с клавиатуры, имеют ASCII-формат, например, буквы
- 160. ПРЕОБРАЗОВАНИЕ ASCII-ФОРМАТА (строки) В ДВОИЧНЫЙ ФОРМАТ (число) Для выполнения арифметических операций часто требуется преобразование их в
- 161. Для примера рассмотрим преобразование числа 1234 из ASCII-формата в двоичный формат: Десятичное Шестнадцатеричное 4 х 1
- 162. В процедуре B10ASBI выполняется преобразование ASCII-числа 1234 в двоичный формат. В примере предполагается, что длина ASCII-числа
- 163. CODESG SEGMENT ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H BEGIN: JMP SHORT MAIN ; ------------------------------------------- ASCVAL DB '1234' ;Элементы
- 164. ПРЕОБРАЗОВАНИЕ ДВОИЧНОГО ФОРМАТА В ASCII-ФОРМАТ Для того, чтобы напечатать или отобразить на экране pезультат выполнения арифметических
- 165. Преобр. дв. в ASCII: C10BIAS PROC MOV CX,0010 ;Фактор деления LEA SI,ASCVAL+3 ;Адрес ASCVAL MOV AX,BINVAL
- 166. Программирование в LINUX (первый пример) #include #include extern void asm_calc(int,int,int*,int*); int main(void){ int i,j,iplusj=0,imulj=0; scanf("%d %d",&i,&j);
- 167. section .text global asm_calc asm_calc: ;параметры: int i,int j, int* iplusj, int* imulj ;то есть -
- 168. makefile LDFLAGS=-g CFLAGS=-g all: main main: main.o asm_file.o main.o: main.c asm_file.o: asm_file.asm nasm -g -o $@
- 169. Утилита make Студенты привыкают к использованию графических интерфейсов для разработки программного обеспечения и часто не понимают,
- 170. Допустим, вы разрабатываете некую программу под названием foo, состоящую из пяти заголовочных файлов 1.h, 2.h, 3.h,
- 171. Утилита make Задача утилиты make - автоматически определять, какие файлы проекта были изменены и требуют компиляции,
- 172. Файл Makefile Для использования утилиты необходимо описать сценарии в файле Makefile. Сценарии указывают взаимосвязь между файлами
- 173. Правила компиляции составных частей проекта заносятся в Makefile. Затем все необходимые действия по компиляции и сборке
- 174. Стандартизация процедуры сборки программ с использованием утилиты make позволяет собирать пакеты программ из исходных кодов не
- 175. Структура Makefile Мakefile состоит из так называемых "правил", имеющих вид: имя-результата: исходные-имена ... команды ... ...
- 176. Стандартные правила К числу стандартных правил относятся: all - основная задача, компиляция программы. install - копирует
- 177. Пример Makefile Ниже приводится простой пример (номера строк добавлены для ясности). 1 client: conn.o 2 g++
- 178. Более подробно о примере Задается цель -- исполняемый файл client, который зависит от объектного файла conn.o;
- 179. Комментарии Строки, начинающиеся с символа "#", являются комментариями. Пример makefile с комментариями: # Создать исполняемый файл
- 180. "Ложная" цель Обычно "ложные" [phony] цели, представляющие "мнимое" имя целевого файла, используются в случае возникновения конфликтов
- 181. Декларация .PHONY Однако, данное правило не будет работать, если в текущем каталоге будет существовать файл с
- 182. Переменные Определить переменную в makefile вы можете следующим образом: $VAR_NAME=value В соответствии с соглашениями имена переменных
- 183. Вывод на экран через INT 80H section .text global _start _start: mov eax,15 mov ebx,20 mul
- 184. all_ok: mov edx,len1 ;third argument: message length mov ecx,msg1 ;second argument: pointer to message to write
- 185. error: mov edx,len2 ;third argument: message length mov ecx,msg2 ;second argument: pointer to message to write
- 186. exit1: mov ebx,0 ;first syscall argument: exit code mov eax,1 ;system call number (sys_exit) int 0x80
- 187. section .data ;section declaration msg1 db "All OK!",0xa len1 equ $ - msg1 ;length of our
- 188. makefile all:main main: main.o ld -s -o main main.o main.o:main.asm nasm -f elf $^ clean: rm
- 189. Вывод с помощью printf extern printf section .text ;section declaration global main main: ;write our string
- 190. makefile LDFLAGS=-g all:main main: main.o main.o:main.asm nasm -g -f elf $^ clean: rm main *.o
- 191. Вызов функций scanf и printf из Nasm Функции scanf и printf определены в библиотеке glibc. Эти
- 192. mov eax, dword [a] add eax, dword [b] push eax push dword msg2 call printf add
- 193. Арифметические операции в формате ASCII Данные, вводимые с клавиатуры, имеют ASCII-формат, например, цифры 1234 - шест.31323334.
- 194. Сложение в ASCII-формате Рассмотрим процесс сложения чисел 8 и 4 в ASCII-формате: Шест. 38 34 --
- 195. В качестве примера, предположим, что регистр AX содержит шест.0038, а регистр BX - шест.0034. Числа 38
- 196. Сложение в ASCII-формате CODESG SEGMENT ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H BEGIN: JMP SHORT MAIN ; ----------------------------------------------- ASC1
- 197. В программе используется команда ADC, так как любое сложение может вызвать перенос, который должен быть прибавлен
- 198. Вычитание в ASCII-формате Команда AAS (ASCII Adjust for Subtraction - коррекция для вычитания ASCII-кодов) выполняется aналогично
- 199. Умножение в ASCII-формате Команда AAM (ASCII Adjust for Multiplication - коррекция для умножения ASCII-кодов) выполняет корректировку
- 200. Команда AAM делит содержимое регистра AL на 10 (шест.0A) и записывает частное в регистр AH, а
- 201. Следующий пример демонстрирует умножение четырехбайтового множимого на однобайтовый множитель. Так как команда AAM может иметь дело
- 202. CODESG SEGMENT ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H BEGIN: JMP MAIN ; --------------------------------------------- MULTCND DB '3783' ;Элементы данных
- 203. Деление в ASCII-формате Команда AAD (ASCII Adjust for Division - коррекция для деления ASCII-кодов) выполняет корректировку
- 204. AND CL,0FH ;Преобразовать CL в распак.дес. AND AX,0F0FH ;Преобразовать AX в распак.дес. 0208 AAD ;Преобразовать в
- 205. CODESG SEGMENT ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H BEGIN: JMP SHORT MAIN ; --------------------------------------------- DIVDND DB '3698' ;Элементы
- 206. ДВОИЧНО-ДЕСЯТИЧНЫЙ ФОРМАТ (BCD) В предыдущем примере деления в ASCII-формате было получено частное 00090204. Если сжать это
- 207. Обработка полей также осуществляется по одному байту за одно выполнение. В примере программы выполняется преобразование чисел
- 208. CODESG SEGMENT PARA "Code" ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H BEGIN: JMP SHORT MAIN ; ------------------------------------------- ASC1 DB
- 209. ; Преобразование ASCII в BCD: ; -------------------------- B10CONV PROC MOV CL,04 ;Фактор сдвига MOV DX,03 ;Число
- 210. ; Сложение BCD-чисел: ; ------------------ C10ADD PROC XOR AН,AН ;0чистить AН LEA SI,BCD1+2 ;Инициализация LEA DI,BCD2+2
- 211. Обработка строк 1. В мнемонике команд обработки строк всегда содержится буква S (String — строка). Она
- 212. 5. Строка-приемник должна находиться обязательно в дополнительном сегменте памяти ES со смещением DI (адресация ). 6.
- 213. 7. В процессе циклического выполнения команд указатели SI и DI автоматически модифицируются в зависимости от длины
- 216. MOVS - переслать один байт или одно слово из одной области памяти в другую; LODS -
- 217. В примере выполняется пересылка 20 байт из STRING1 в STRING2. Предположим, что оба регистра DS и
- 218. Обработка одномерных массивов Для того чтобы обрабатывать массив, нужно знать, где он хранится (его начальный аарес),
- 222. Двумерные массивы Для двухмерных массивов (матриц) идея будет та же самая, только нужно определиться, как такой
- 225. Математический сопроцессор Для обработки данных с плавающей точкой служит специальное устройство — математический сопроцессор (FPU —
- 227. Особые числа Кроме обычных чисел, спецификация стандарта IEEE предусматривает несколько специальных форматов, которые могут получиться в
- 228. Регистры: 8-дынные, 5-вспомогательные
- 229. Регистры данных Регистры данных сопроцессора R0-R7 имеют длину 80 бит (т.е. пять 16-разрядных слов) и рассматриваются
- 230. Система команд Система команд сопроцессора достаточно простая, если знать ключ и немного понимать английский язык. Для
- 234. Арифметические команды
- 237. ; Вычислить действительные корни квадратного уравнени¤: ; a*x*x + b*x + c = 0 .387 .model
- 238. quadr proc C far finit ;иниц. 8087 ;-------ST(0)-------!------ST(1)------! fild b ;b !? fmul st(0),st(0) ;b*b !?
- 239. fsqrt ;sqrt(d) !? fld st(0) ;sqrt(d) !sqrt(d) fchs ;-sqrt(d) !sqrt(d) fiadd b ;b-sqrt(d) !sqrt(d) fchs ;-b+sqrt(d)
- 240. Распределение программы в памяти Рассмотрим распределение памяти на примере простейшей программы. ;Данные программы DATA SEGMENT MSG
- 241. В этой программе явно описаны три сегмента – кода с именем CODE, данных с именем DATA
- 242. Распределение в памяти ЕХЕ программы
- 243. Распределение в памяти СОМ программы
- 244. После инициализации в регистре IP находится смещение первой команды программы относительно начала кодового сегмента, адрес которого
- 245. EXE- и COM-программы DOS может загружать и выполнять программные файлы двух типов – COM и EXE.
- 246. Заголовок EXE-файла Заголовок EXE-файла состоит из форматированной зоны и таблицы расположения сегментов (Relocation Table). Форматированная зона
- 248. Таблица расположения сегментов программы начинается сразу после форматированной области и состоит из четырехбайтовых значений в формате
- 249. Описание структуры заголовка EXE файла и таблицы расположения сегментов typedef struct _EXE_HDR_ { unsigned signature; unsigned
- 250. Процесс загрузки программ в память Загрузка COM- и EXE-программ происходит по-разному, однако есть некоторые действия, которые
- 251. Для COM-программ Для COM-программ, которые представляют собой двоичный образ односегментной программы, выполняется чтение файла программы с
- 252. Загрузка EXE-программ Загрузка EXE-программ происходит значительно сложнее, так как связана с настройкой сегментных адресов: Считывается во
- 253. Для каждого элемента таблицы: 1. Считывается содержимое элемента таблицы как два двухбайтных слова (OFF,SEG). 2. Вычисляется
- 254. Префикс программного сегмента
- 256. Структура PSP typedef struct _PSP_ { unsigned char int20h[2]; unsigned mem_top; unsigned char reserv1; unsigned char
- 257. Программы могут получить из PSP такую информацию, как параметры командной строки при запуске, размер доступной памяти,
- 258. EXE-программы. EXE-программы содержат несколько программных сегментов, включая сегмент кода, данных и стека. В процессе загрузки считывается
- 259. COM-программы. COM-программы содержат единственный сегмент . Образ COM-файла считывается с диска и помещается в память, начиная
- 260. Выход из программы Завершить программу можно следующими способами: через функцию 4CH (EXIT) прерывания 21H в любой
- 261. Машинные коды Машинным кодом будем называть внутреннее представление команд Ассемблера в памяти компьютера, т.е. собственно команды
- 272. Скачать презентацию