- •Отчет по лабораторной работе №2 «Организация памяти в программе»
- •2005 Г. Текст задания
- •Файл диагностических сообщений
- •Протокол пошагового исполнения программы
- •Пояснения корректных методов адресации
- •Пояснения имеющихся некорректных конструкций
- •Сведения о сегментировании
- •Пояснения о использовании псп в данной программе
Пояснения имеющихся некорректных конструкций
Синтаксические ошибки:
mov mem3, [bx]
LR2.ASM(55): error A2052: Improper operand type
Неподходящий тип операндов
Нельзя читать из памяти и писать в память одной командой
mov ex, vec2[di]
LR2.ASM(62): warning A4031: Operand types must match
Несоответствие типов операндов
Размер элементов массива ‘vec2’ 1 байт, а ‘сх’ - 2 байта
mov cx, matr[bx][di]
LR2.ASM(66): warning A4031: Operand types must match
Несоответствие типов операндов
Размер элементов матрицы ‘matr' 1 байт, а ‘сх' - 2 байта
mov ax, matr[bx*4][di]
LR2.ASM(67): error A2055: Illegal register value
Незаконное использование регистра
Нельзя умножать 16-битные регистры
Несоответствие типов операндов
Размер элементов матрицы ‘matr' 1 байт, а ‘ах' - 2 байта
mov ax, matr[bp+bx]
LR2.ASM(86): error A2046: Multiple base registers
Слишком много базовых регистров
Нельзя использовать более одного базового регистра
Несоответствие типов операндов
Размер элементов матрицы ‘matr' 1 байт, а ‘ах' - 2 байта
mov ax, matr[bp+di+si]
LR2.ASM(87): error A2047: Multiple index registers
Слишком много индексных регистров
Нельзя использовать более одного индексного регистра
Слишком много регистров
Нельзя использовать более двух регистров
Несоответствие типов операндов
Размер элементов матрицы ‘matr' 1 байт, а ‘ах' - 2 байта
Семантическая ошибка
push mem1
push mem2
Для завершения программы и возвращения в DOS необходимо, чтобы вершина стека содержала смещение и сегмент начала PSP, а в случае выполнения этих двух команд вершина стека содержит mem2 и mem1, поэтому при выполнении команды ret 2 управление перейдет на адрес meml:mem2 и программа не сможет корректно завершится.
Сведения о сегментировании
Данная программа содержит 3 сегмента:
сегмент стека
сегмент данных
сегмент кода
Сегментные регистры используются следующим образом:
CS указывает на сегмент кода
DS указывает на сегмент данных или PSP
ES указывает на сегмент данных
SS указывает на сегмент стека
Пояснения о использовании псп в данной программе
В ПСП по адресу PSP:0000 находится инструкция "CD20"="int 20h" Вектор прерывания 20h завершает программу, если CS=PSP. Так как для ЕХЕ-программ это условие может не выполняться, нельзя вызывать INT 20h непосредственно. Поэтому необходимо передать управление по адресу PSP:OOOO. Это можно сделать, поместив в стек сегмент PSP и смещение. Вначале программы DS указывает на PSP, поэтому последовательность команд:
push ds
push 0000
помещает в стек адрес начала PSP, поэтому для выхода из программы можно воспользоваться командой ret.