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

Пояснения имеющихся некорректных конструкций

Синтаксические ошибки:

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.

Соседние файлы в папке Комплект лабораторных 1-6