![](/user_photo/2706_HbeT2.jpg)
- •5. Преобразование двоичных чисел в десятичные
- •Преобразование десятичных чисел в двоичные
- •1H ;Перенос от предыдущей операции.
- •10. Общая структура программы на языке Ассемблер. Сегмент кода. Сегмент данных.
- •11. Подготовка, компиляция, компоновка ассемблерных программ
- •12. Отладка ассемблерных программ. Выполнение ассемблерных программ.
- •13. Формат директив и машинных команд. Директивы инициализации данных. Директивы описания данных на языке Ассемблера.
- •14. Простейшие директивы сегментации. Модели памяти. Сегменты данных.
- •15. Стандартные директивы сегментации. Команды пересылки данных.
- •16. Организация стека. Команды работы со стеком.
- •17. Команды двоичной арифметики (сложение, вычитание). Влияние на регистр флагов
- •18. Команды двоичной арифметики (умножение, деление). Влияние на регистр флагов.
- •19. Логические операции
- •23. Команды передачи управления. Команды условной передачи управления для операндов без знака. Дальность адресации.
- •24. Команды передачи управления. Команды условного перехода и флаги.
- •25.Организация цикла
- •29.Обработка массивов
- •30.Вызов подпрограмм
- •32. Повторяющиеся блоки и макросы
- •35.Обработка прерываний в реальном режиме.
- •36.Ввод информации с клавиатуры
- •1. Средства dos
- •2. Средства bios
- •37. Использование функций Int 21h (01h, 06h, 07h) для ввода информации.
- •Использование функций Int 21h (08h, 0Ah, 0Bh) для ввода информации.
- •Использование функций Int 21h (0Ch, 3Fh) для ввода информации.
- •Использование функций Int 16h bios для ввода информации
- •Использование функций Int 21h (02h, 06h, 09h) для вывода информации на экран.
- •Использование функций Int 21h для ввода, вывода информации в файл.
- •Использование функций Int 10h bios (00h,4Fh,02h).
- •Использование функций Int 10h bios (03h,08h,09h).
- •Использование функций Int 10h bios (0Ah,0Eh,13h).
- •Вывод графической информации на экран. Видеорежимы.
- •47. Ассемблер и языки высокого уровня. Вызов процедур.
- •48. Создание встраиваемого ассемблерного кода. Ассемблер, встроенный в программу на языке Pascal.
- •49. Создание встраиваемого ассемблерного кода. Ассемблер, встроенный в программу на языке с.
- •50. Охарактеризуйте системные средства управления памятью. Опишите структуру и образ памяти программ .Exe и .Com.
- •51. Трансляторы и интерпретаторы - общая схема работы.
- •Формат командных операторов
- •Формат директив ассемблера и операторов распределения данных
- •Имя Директива Операнды ;Комментарий
- •Элементы операторов
- •Регистры
- •Переменные
- •Числовые константы
- •Символьные константы
- •Сегменты и процедуры
- •Segment (начало сегмента) и ends (конец сегмента).
- •Система команд микропроцессора 8086
- •Команды передачи данных
- •Общие команды передачи данных
- •Команда mov
- •Команда обмена xchg
- •Команда xlat
- •Команды lea, lds и les
- •Команды lahf и sahf
- •Стековые команды
- •Команды ввода-вывода
- •In ac,port out port,ac (прямая укороченная адресация)
- •In ac,dx out dx,ac (косвенная адресация) команды арифметических операций
- •Команды сложения Команда add
- •Команда imul
- •Команды деления
- •Команда div
- •Команда idiv
- •Команды преобразования
- •Команды десятичной арифметики
- •Команды для формата bcd
- •Команды для формата ascii
- •Команды логических операций и команды сдвигов команды логических операций
- •Команды сдвигов
- •Команды передачи управления
- •Команды безусловных переходов
- •Команды условных переходов
- •Команды вызова подпрограмм
- •Команды возврата из подпрограмм
- •Команды управления циклами
- •Команды прерываний
- •Int type - вызов прерывания с номером type (от 0 до 255),
- •Цепочечные команды
- •Префикс повторения
- •Команда movs
- •Команда cmps
- •Команда scas
- •Команда lods
- •Команда stos
49. Создание встраиваемого ассемблерного кода. Ассемблер, встроенный в программу на языке с.
- Конвенция С
Этот способ передачи параметров используется в первую очередь в языках С и C++. Параметры помещаются в стек в обратном порядке, и, в противоположность PASCAL-конвенции, удаление параметров из стека выполняет вызывающая процедура. Запись
some_proc(a,b,c,d,e)
превращается в
push e
push d
push с
push b
push a
call some_proc
add sp,10 ; освободить стек
Вызванная таким образом процедура может инициализироваться так: some_proc proc push bp mov bp,sp ; создать стековый кадр a equ [bp+4] ; определения для простого доступа к параметрам b equ [bp+6] с equ [bp+8] d equ [bp+10] e equ [bp+12] ; текст процедуры, использующей параметры a, b, с, d, e pop bp ret some_proc endp
Ассемблеры поддерживают и такой формат вызова при помощи усложненной формы директивы proc с указанием языка С:
some_proc proc С,а:word,b:word,с:word,d:word,e:word
; текст процедуры, использующей параметры a, b, с, d, e.
; Так как BP применяется как указатель стекового кадра,
; его использовать нельзя!
ret
some_proc endp
Мы не пользовались до сих пор этими формами записи процедур в ассемблере потому, что они скрывают от нас тот факт, что регистр ВР используется для хранения параметров и его ни в коем случае нельзя изменять, и, в случае PASCAL, что команда ret на самом деле — команда ret N.
- Встроенный ассемблер в С
Код на С.
_asm {
Код на ассемблере.
};
Код на С.
Для использования меток перед меткой нужно ставить знак @.
50. Охарактеризуйте системные средства управления памятью. Опишите структуру и образ памяти программ .Exe и .Com.
Все программы, запускаемые на выполнение в операционной системе DOS, загружаются в память с помощью функции Exec (Int 21h, функция 4Bh). Кроме загрузки программы, эта функция формирует PSP (префикс программного сегмента) загружаемой программы, создает копию окружения, а также настраивает регистры. Эту функцию может вызывать как COMMAND.COM, так и любой другой запущенный процесс, в том числе и пользовательский.
При запуске программы в DOS, ей отводится вся свободная память. Для того чтобы загрузить дочерний процесс, родительская программа должна определить объём памяти необходимый ей для выполнения, освободить неиспользуемую память, уменьшив выделенную ей память до необходимого размера. Операции с памятью реализуются функциями 48h (выделить блок памяти), 49h (освободить выделенную память) и 4Ah (изменить размер уже выделенного блока).
Размеры .СОМ и .ЕХЕ программ вычисляются различным образом. Для определения размера .ЕХЕ программы, состоящей из трех сегментов -сегмента кода, данных и стека, следует включить в программу пустой фиктивный сегмент, расположив его после всех остальных сегментов. Этому сегменту необходимо присвоить произвольный класс, гак как сегменты одного класса располагаются в памяти друг за другом. Сегменты без имени класса принадлежат к безымянному классу. Возможна ситуация, когда фиктивный сегмент без класса будет загружен сразу после другою сегмента без класса, а не в самом конце программы, как требуется. Учитывая, что при загрузке в регистре es находится адрес начала программы (адрес PSP), размер программы типа ЕХЕ можно определить следующим образом:
EXEC загружает в память программу типа .СОМ, начиная с адреса PSP:0100h, и передает; ей управление. При загрузке программы типа .ЕХЕ, в которой есть команды вызова дальних процедур (сегментов данных), DOS изменяет эти команды так, чтобы используемые в них сегментные адреса соответствовали сегментным адресам, по которым загружены в память указанные процедуры (сегменты данных).
После загрузки программы типа .СОМ содержимое регистров следующее:
в AL будет код OFFh, если первый аргумент командной строки содержит ошибочное имя диска, иначе - 00h;
в АН будет код OFFh, если второй аргумент командной строки содержит ошибочное имя диска, иначе - 00h;
в регистры CS, DS, ES, SS загружается сегментный адрес PSP;
в IP записывается 100Н, смещение точки входа в программу;
в SP - адрес последнего слова в сегменте (обычно OFFFEh; меньше, если не хватает памяти). Пользователь может выделить буфер под стек и, естественно, установить другое значение SP.
При запуске программы типа .ЕХЕ регистры ES, DS загружаются сегментным адресом PSP, CS - сегментным адресом кода программы, SS - сегментным адресом стека, а SP - адресом вершины стека, на IP записывается смещение точки входа в программу.
Затем в стек помещается слово OOOOh и управление передаётся на стартовую точку программы (для программы типа СОМ - PSP:0100h; для программы типа .ЕХЕ - указанная в директиве END точка входа).