Решенные задачи на языке Assembler - файл Текст вар 19.doc



Решенные задачи на языке Assembler
скачать (3323.7 kb.)
Доступные файлы (157):
1.asm
1.CRF
1.EXE
1.LST
1.OBJ
2.asm
2.EXE
2.OBJ
1.asm
1.EXE
1.OBJ
2.1.asm
2.1.EXE
2.1.OBJ
2.asm
2.EXE
2.OBJ
1.asm
1.CRF
1.EXE
1.LST
1.OBJ
2.asm
2.EXE
2.OBJ
1.ASM
1.EXE
1.OBJ
2.asm
2.EXE
2.OBJ
1.asm
1.EXE
1.OBJ
2.asm
2.EXE
2.OBJ
z12.asm
z22.asm
с.1.asm
1.1.asm
1.asm
1.EXE
1.OBJ
2.asm
p1.asm
p2.asm
1.asm
2.asm
1.asm
1.EXE
1.OBJ
2.asm
2.EXE
2.OBJ
1.asm
1.EXE
1.OBJ
2.asm
2.EXE
2.OBJ
1.asm
2.asm
1.asm
2.asm
2.asm
1.asm
strmir.asm
1.asm
Текст вар 19.doc141kb.26.01.2009 18:04скачать
1.asm
1.EXE
1.OBJ
2.asm
2.EXE
2.OBJ
sumconst.asm
1.asm
2.asm
Текст вар 20.doc106kb.27.01.2009 01:03скачать
1.asm
2.asm
sort2.asm
sumbcd.asm
1.asm
2.asm
1.asm
2.asm
1,1 плохой вариант.asm
1.asm
2.asm
размышление по 2 задаче.doc61kb.17.01.2009 22:37скачать
1.asm
2.asm
2.asm
1.asm
1.EXE
1.OBJ
2.asm
2.EXE
2.OBJ
1.asm
1.EXE
1.OBJ
2.asm
2.EXE
2.OBJ
1.asm
1.EXE
1.OBJ
1.asm
1.EXE
1.OBJ
2.asm
2.EXE
2.OBJ
1.asm
1.EXE
1.OBJ
1.asm
1.EXE
1.OBJ
2.asm
2.EXE
2.OBJ
1.asm
1.EXE
1.OBJ
2.asm
2.EXE
2.OBJ
1.asm
1.EXE
1.OBJ
2.asm
2.EXE
2.OBJ
1.asm
1.EXE
1.OBJ
2.asm
2.EXE
2.OBJ
File0003.jpg301kb.29.05.2010 18:53скачать
File0004.jpg397kb.29.05.2010 18:56скачать
File0005.jpg378kb.29.05.2010 18:57скачать
File0006.jpg247kb.29.05.2010 18:57скачать
File0007.jpg257kb.29.05.2010 19:00скачать
File0008.jpg298kb.29.05.2010 19:00скачать
File0009.jpg453kb.29.05.2010 19:00скачать
File0010.jpg425kb.29.05.2010 19:00скачать
File0011.jpg275kb.29.05.2010 19:00скачать
afd.com
AFDPRO.EXE
lib.exe
link.exe
masm.exe
содержание

Текст вар 19.doc

Реклама MarketGid:
Федеральное агентство по образованию

Государственное образовательное учреждение высшего профессионального образования Рыбинская государственная авиационная технологическая академия имени П. А. СОЛОВЬЕВА
Факультет заочного обучения

Кафедра «Вычислительные системы»

контрольная работа

по дисциплине

Программирование на Ассемблере

(Наименование дисциплины)

на тему

Разработка программ (вариант 19)
Пояснительная записка

Студент группы …ЗВП-07 …………………………

(Код) (Подпись, дата) (Фамилия И. О.)
Руководитель канд. техн. наук, проф. Комаров В. М.

(Уч. степень, звание) (Подпись, дата) (Фамилия И. О.)
Нормоконтролер канд. техн. наук, проф. Комаров В. М

(Уч. степень, звание) (Подпись, дата) (Фамилия И. О.)

Рыбинск 2009

Содержание

стр.

Введение ……………………………………………………………………………. 3

1 Формулировка 1-й задачи варианта ……….……..………………………… 4


1.1 Решение 1-й задачи варианта ………………………..……………………. 4

1.2 Граф-схемы алгоритмов решения 1-й задачи …..………………………. 5

1.3 Исходный текст для решения 1-й задачи ……………………………… 7

2 Формулировка 2-й задачи варианта ……………………………………… 11

2.1 Решение 2-й задачи варианта ……………………..…………………….. 11

2.2 Граф-схемы алгоритмов для решения 2-й задачи ………………….…. 12

2.3 Исходный текст для решения 2-й задачи……………………………………13

Заключение ……………………………………………………………………… 15


Список использованных источников ………………………………………….. 15
Введение
В данной работе разрабатываются 2 программы на языке Ассемблера. Одна программа предназначена для записи в элементы некоторого двумерного массива двойных слов, находящихся в пересечении строк и столбцов с четными индексами, строки «МИР». Другая предназначена для записи в элементы текущего стека, начиная от верхушки, результаты вычисления функции , где X – элементы некоторого массива байтов, которые могут иметь значения 5, 24, 61, 122.


1 Формулировка 1-й задачи варианта
Написать программу для записи в элементы некоторого двумерного массива двойных слов, находящихся в пересечении строк и столбцов с четными индексами, строки «МИР». С помощью этой подпрограммы обработать два массива.
1.1 Решение 1-й задачи варианта
Из условия задачи следует, что разрабатываемая подпрограмма должна обрабатывать два массива. Следовательно, она должна работать с передачей параметров. Способ передачи параметров не указан, поэтому используем передачу параметров через регистры.

Обрабатываемые данные представляют собой массивы двойных слов без знака, которые могут содержать различное количество элементов. Следовательно, описание входных массивов должно быть описанием двумерных массивов двойных слов. Результат (выходной массив) будет таким же массивом, что и входной.

Решение данной задачи сводится к проверке индексов строк и столбцов и записи строки «МИР» в элемент, находящихся на пересечении строк и столбцов с четными индексами, т. е. при условии, что индексы строки и столбца четные. Будем использовать базово-индексную адресацию. Так как элемент двумерного массива имеет размерность двойное слово или 4 байта, то при увеличении индекса столбца и строки на 1 смещение столбца и строки увеличится на 4. Будем считать, что размерность массива не более 256 х 256 элементов, тогда для хранения индекса можно использовать 8-разрядные регистры и анализировать их значения на четность и нечетность.

Так как в двойное слово записывается строка, элементы которой имеют размерность байт, то необходимо организовать цикл записи четырех байтов и использовать при этом директиву byte ptr.

Инициализировать входные массивы непосредственно в сегменте данных не имеет смысла, так как для их обработки все нужно задавать размерность. Для наглядности инициализируем входные массивы каким-либо шестнадцатеричным числом, например 11111111h и 22222222h.

Подпрограмма работает с передачей параметров, которая осуществляется на макроуровне программы. Поэтому полный алгоритм программы будет включать в себя алгоритм макроуровня и алгоритм подпрограммы, представленные на рисунке 1.1. и на рисунке 1.2.
1.2 Граф-схемы алгоритмов решения 1-й задачи







Рисунок 1.1 – Алгоритм макроуровня 1-й задачи

В качестве параметров используются базовый адрес входного массива, базовый адрес выходного массива и число строк и столбцов массива. Первые 2 параметра имеют размер слова, вторые 2 – размер байта, но для удобства организации цикла поместим последние 2 параметра в 16-разрядные регистры.

Проверка на четность выполняется путем анализа младшего бита (0 – четный, 1 – нечетный).


Адрес строки уже в BX и BP. Число строк уже в СХ.

Индекс строки в AL, AL = 0.





Смещение столбца в SI, SI = 0. Сохранить СХ. Число столбцов в СХ из DX. Индекс столбца в AH, AH = 0.






word ptr [BX+SI]  word ptr DS:[BP+SI]

word ptr [BX+SI+2]  word ptr DS:[BP+SI+2]

Выполняется через АХ, он сохраняется, затем восстанавливается







Да


SI = SI + 1; DI = DI + 1


Нет

Сохранить смещение столбца SI. Сохранить СХ и АХ. Счетчик циклов СХ = 4. Сохранить DI. Адрес строки символов «МИР» в DI.

Да

Нет

Да

Нет

^ AL DS:[BP+SI]


[DI]  AL








Да

BX = BX + 4* число столбцов в строке входного массива (DI)

BP = BP + 4* число столбцов в строке входного массива (DI)

AL = AL + 1

Нет

Да

Нет

SI = SI + 4; AH = AH + 1




Рисунок 1.2 – Алгоритм подпрограммы 1-й задачи

Из алгоритма (рисунок 1.2) следует, что значение « 4* число столбцов в строке входного массива » следует вычислить до вызова процедуры и передать как параметр, в противном случае это очень усложнит процедуру и замедлит время ее выполнения.
1.3 Исходный текст для решения 1-й задачи
На основании алгоритмов (см. рисунок 1.1 и рисунок 1.2) можно написать исходный текст программы.
Name STRMIR ; Имя программы

; Описание констант

nr1 = 3 ; число строк 1

nr2 = 5 ; число строк 2

nc1 = 3 ; число столбцов 1

nc2 = 4 ; число столбцов 2

Data Segment

Arr1S DD nr1 DUP (nc1 DUP (11111111h)) ; Описание входных

Arr2S DD nr2 DUP (nc2 DUP (22222222h)) ; массивов

Arr1D DD nr1 DUP (nc1 DUP (?)) ; Описание выходных

Arr2D DD nr2 DUP (nc2 DUP (?)) ; массивов

str DB 'MIR ' ; Строка «МИР »

Data Ends

n1 = 4* nc1 ; нужно добавить для получения адреса

; следующей строки массива 1 - длина строки 1 в байтах

n2 = 4* nc2 ; нужно добавить для получения адреса

; следующей строки массива 2 - длина строки 2 в байтах

Stack Segment

DW 10 DUP (?) ;

StkTop Label word ; Фиксация верхушки

Stack EndS ; пустого стека

Code Segment ; Сегмент программного кода

Assume CS: Code, DS: Data, SS: Stack

; Описание подпрограммы

MIR Proc

;Подготовка цикла для прохода по строкам

; Адрес строки уже в BX и BP

; Число строк в CX

MOV AL,0 ; Индекс строки равен 0

MAIN :

;Подготовка цикла для прохода по столбцам

PUSH CX ; Сохранить СХ - число строк

XOR SI, SI ; Смещение столбца 0

MOV CX,DX ;Число столбцов

MOV AH,0 ; Индекс столбца равен 0

M0:

;Просто копируем элемент входного массива в выходной

PUSH AX ; Сохраняем АХ

MOV AX, word ptr [BX+SI]; Копируем младшее слово

MOV word ptr DS:[BP+SI],AX;

MOV AX, word ptr [BX+SI+2]; Копируем старшее слово

MOV word ptr DS:[BP+SI+2],AX;

POP AX; Восстанавливаем АХ

;проверим индекс строки на четность

TEST AL,00000001b; Проверим младший бит

JNZ M1 ; Если 1, то столбец нечетный

;элемент входного массива уже скопировали

TEST AH,00000001b; Проверим младший бит

JNZ M1 ; Если 1, то строка нечетная

;элемент входного массива уже скопировали

;иначе записываем в элемент массива строку "МИР "

;Подготовка цикла для записи строки "МИР "

PUSH SI ;Сохранить смещение столбца SI

PUSH CX ;Сохранить СХ и АХ

PUSH AX ;

MOV CX,4 ;Счетчик циклов СХ = 4.

PUSH DI ;Сохранить DI

LEA DI,str ;Адрес строки символов «МИР» в DI

M2: ; Цикл записи строки «МИР»

MOV AL, [DI] ; Передать в аккумулятор текущий символ строки

MOV byte ptr DS:[BP+SI], AL ; Записать в выходной массив

INC DI ; Модификация адреса строки

INC SI ; Модификация адреса байта выходного массива

LOOP M2 ; Все символы?

; Да

POP DI ;Восстановить длину строки в байтах

POP AX ;Восстановить СХ и АХ

POP CX ;

POP SI ;Восстановить смещение столбца SI

M1: ADD SI, 4 ; Модифицировать смещение столбца

INC AH ; Модифицировать индекс столбца

LOOP M0 ; Переход, если не все столбцы

ADD BX, DI ;Модифицировать смещение строки

ADD BP, DI ;Модифицировать смещение строки

INC AL ;Модифицировать индекс строки

POP CX ; Восстановить счетчик строк

LOOP MAIN ; Все строки?

RET ; Возврат

Mir Endp ;

; Макроуровень программы

Start: MOV AX, Data ; Системная подготовка

MOV DS, AX ; инициализация

MOV AX, Stack ; сегментных

MOV SS, AX ; регистров и указателя

LEA SP, StkTop ; стека

; Передача параметров

; первого массива

MOV CX, nr1 ; Число строк 1

MOV DX, nc1 ; Число столбцов 1

MOV DI, n1 ; Длина строки 1 в байтах

LEA BX, Arr1S ; Адрес базы входного массива 1

LEA BP, Arr1D ; Адрес базы выходного массива 1

CALL Mir ; Обработка массива 1

; Передача параметров

; второго массива

MOV CX, nr2 ; Число строк 2

MOV DX, nc2 ; Число столбцов 2

MOV DI, n2 ; Длина строки 2 в байтах

LEA BX, Arr2S ; Адрес базы входного массива 2

LEA BP, Arr2D; Адрес базы выходного массива 2

CALL Mir ; Обработка массива 2

Code Ends

End Start ; Конец исходного текста

; программы

2 Формулировка 2-й задачи
Написать макрокоманду для записи в элементы текущего стека, начиная от верхушки, результаты вычисления функции , где X – элементы некоторого массива байтов, которые могут иметь значения 5, 24, 61, 122. С помощью этой макрокоманды обработать два массива.
2.1 Решение 2-й задачи

Из условия задачи следует, что разрабатываемая макрокоманда должна обрабатывать два массива. Следовательно, она должна работать с передачей параметров.

Обрабатываемые данные представляют собой массивы байтов без знака, которые могут содержать различное количество элементов. Следовательно, описание входных массивов должно быть описанием одномерных массивов слов. Результат имеет такую же длину, как и входной, но так как в стек передаются только слова, то элементами этого массива будут слова.

Функция Y вычисляется таблично, поэтому необходима таблица, в которой хранятся значения функции Y. Для вычисления функции используем команду XLAT.

Для адресации к стеку необходимо скопировать содержимое регистра SP регистр BP. В [2], с. 12 указывается, что «стек всегда существует в системе и поэтому не описывается», однако при демонстрации работы программы в отладчике AFD необходимо описать сегмент стека, так как в противном случае операционная система производит совмещение сегментов данных и стека, и данные в сегменте данных «затираются» при записи значений в стек. Стек должен иметь достаточный объем для записи данных, в противном случае операционная система может разместить сегменты так, что за сегментом стека будет следовать сегмент кода, и команды в сегменте кода «затираются» при записи значений в стек. Выделим под объем для записи данных суммарный объем результатов функции Y.

Для адресации к стеку необходимо скопировать содержимое регистра SP в регистр BP. Так как значение SP после выполнения макрокоманды не изменится, то данные будут каждый раз записываться с одного и того же адреса после очередного вызова макрокоманды.

Макрокоманда работает с передачей параметров, которая осуществляется на макроуровне программы. Поэтому полный алгоритм программы будет включать в себя алгоритм макроуровня и алгоритм макрокоманды, представленные на рисунке 2.1. и на рисунке 2.2.

В качестве параметров используются адрес входного массива и длина массива. Эти параметры имеют размер слова. Адрес таблицы и значение указателя стека SP параметрами не являются, так как являются одинаковыми для каждого вызова макрокоманды.
2.2 Граф-схемы алгоритмов решения 2-й задачи






Рисунок 2.1 – Алгоритм макроуровня 2-й задачи





Адрес входного массива в SI

Длина массива в СХ

Очистить AH – старшая половина результата

Поместить BP текущее значение SP

В ВХ адрес таблицы преобразования


Рисунок 2.2 – Алгоритм макрокоманды 2-й задачи


2.3 Исходный текст для решения задачи 2
На основании алгоритмов (рисунок 2.1 и рисунок 2.2) можно написать текст программы.

Name TablSteck

; Описание констант

Data Segment ; Сегмент данных

Arr1S DB 5, 24, 5, 61,122, 5 ;Описание входных

Arr2S DB 5, 5, 24, 24, 61, 61, 122, 122 ; массивов

Table DB 5 dup (?), 2, 18 dup (?), 3, 36 dup (?),4, 60 dup (?), 5

; Описание таблицы преобразования

N1 = offset Arr2S - offset Arr1S;

N2 = offset Table - offset Arr2S;

Data Ends

Stack Segment

DW 4 DUP (?) ;

StkTop Label word ; Фиксация верхушки пустого стека

DW (N1+N2) DUP (?);Область под запись результата

Stack EndS
Code Segment ; Сегмент программного кода

Assume CS: Code, SS: Stack, DS: Data

; Макроопределение

StkTable Macro ArrS, N

LOCAL M0 ; Локализация меток

LEA SI, ArrS ; Загрузка начальных

MOV BP, SP ; адресов

; Смещение адреса стека

MOV CX, N ; Загрузка счетчика циклов

XOR AH, AH ; Обнуление счетчика элементов

M0: MOV AL, [SI] ;Чтение элемента входного мас-ва

XLAT Table ; Преобразовать по таблице

MOV [BP], AX ; Записать в стек

INC SI ; Модификация адреса

; входного массива

ADD BP, 2 ; Модификация адреса стека

LOOP M0

Endm

; Макроуровень программы

Start: MOV AX, Data ; Системная подготовка

MOV DS, AX ; Инициализация

MOV AX, Stack;

MOV SS, AX ; регистров и указателя

LEA SP, StkTop ; стека
LEA BX, Table ; Адрес таблицы

; Обработка первого массива

StkTable Arr1S,N1 ; Макровызов

; Обработка вторoго массива

StkTable Arr2S,N2 ; Макровызов

Code Ends

End Start


Заключение
В данной работе разработаны простые программы на языке Ассемблера. Одна программа предназначена для записи в элементы некоторого двумерного массива двойных слов, находящихся в пересечении строк и столбцов с четными индексами, строки «МИР». Другая предназначена для записи в элементы текущего стека, начиная от верхушки, результаты вычисления функции , где X – элементы некоторого массива байтов, которые могут иметь значения 5, 24, 61, 122.
^

Список использованных источников



1 Комаров, В. М. Программирование на ассемблере [Текст]: программа учебной дисциплины и методические указания к выполнению контрольной работы / В. М. Комаров – Рыбинск: РГАТА, 2004 г. – 18 с.

2 Комаров, В. М. Программирование на ассемблере в упражнениях и задачах [Текст]: учеб. пособие / В. М. Комаров – Рыбинск: РГАТА, 2004 г. – 52 с.



Реклама:





Скачать файл (3323.7 kb.)

Поиск по сайту:  

Учебный материал
© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru