Uploaded by Viktor Oreshkin

ЛР4

advertisement
Федеральное государственное бюджетное образовательное учреждение высшего
образования
«Московский государственный технический университет
имени Н.Э. Баумана
(национальный исследовательский университет)»
(МГТУ им. Н.Э. Баумана)
ФАКУЛЬТЕТ Информатика и системы управления
КАФЕДРА Компьютерные системы и сети
Отчет
по лабораторной работе № 4
Дисциплина: Машинно-зависимые языки и основы компиляции
Название лабораторной работы: Программирование обработки массивов и
матриц
Вариант 24
Студент гр. ИУ6-43
__________________ Прокопенко М. О.
(Подпись, дата)
Преподаватель
(И.О. Фамилия)
__________________ __________________
(Подпись, дата)
Москва, 2017
(И.О. Фамилия)
Задание: Дана матрица 6х4. Вычеркнуть строки с отрицательной суммой элементов.
Организовать ввод матрицы и вывод результатов.
Схема алгоритма:
Текст программы:
; Template for console application
.586
.MODEL flat, stdcall
OPTION CASEMAP:NONE
Include kernel32.inc
Include masm32.inc
IncludeLib kernel32.lib
IncludeLib masm32.lib
.CONST
MsgExit
DB "Press Enter to Exit",0AH,0DH,0
msgInput DB
"Please, enter the value: ", 0
nextL
DB
" ", 0
nextY
DB
" ", 0AH, 0DH,0
.DATA
res SWORD ?
stri dd
"-", 0
array
SWORD 28 DUP (?)
resStr
DB
16 DUP (' '), 0AH, 0DH ,0
.DATA?
inbuf DB 100 DUP (?)
buffer
DB 10 DUP (?)
mas dd 10 dup (?)
.CODE
Start:
xor eax, eax
xor ecx,ecx
mov ecx, 24
mov ebx, 0
cycleInput:
push ecx
Invoke StdOut, ADDR msgInput
Invoke StdIn, ADDR inbuf, LengthOf inbuf
Invoke StripLF, ADDR inbuf
Invoke atol, ADDR inbuf
mov array[ebx * 4], eax
inc ebx
pop ecx
loop cycleInput
xor ebx, ebx
xor eax, eax
xor ecx, ecx
xor esi, esi
xor edi, edi
mov ecx, 6
cycl1:
add eax, array[ebx*4]
inc ebx
loop cycl1
xor edx, edx
mov edx, 0
cmp eax, edx
jl find
mov ecx, 6
xor eax, eax
inc esi
cmp ebx, 24
jge fin
jmp cycl1
find:
inc esi
mov mas[edi*4], esi
dec esi
inc edi
sub ebx, 6
mov ecx, 6
xor edx, edx
mov edx, stri
loop cycl2
mov ecx, 6
cmp ebx, 24
jge fin
inc esi
xor eax, eax
jmp cycl1
fin:
xor eax, eax
xor edx, edx
xor ecx, ecx
xor esi, esi
xor ebx, ebx
mov ecx, 24
mov edx,0
kek:
push ecx
push edx
push eax
inc eax
cmp mas[esi*4], eax
je ero
Invoke dwtoa, array[ebx * 4], ADDR resStr
Invoke StdOut, ADDR resStr
Invoke StdOut, ADDR nextL
xor edx, edx
xor eax, eax
pop eax
pop edx
inc edx
cmp edx,6
je lol
inc ebx
xor ecx, ecx
pop ecx
loop kek
lol:
push eax
Invoke StdOut, ADDR nextY
xor eax, eax
pop eax
xor edx, edx
inc ebx
xor ecx, ecx
pop ecx
inc eax
loop kek
jmp final
cycl2:
mov array[ebx*4], edx
inc ebx
ero:
xor ecx, ecx
mov ecx, 6
inc esi
dab:
push ecx
Invoke StdOut, ADDR array[ebx * 4]
Invoke StdOut, ADDR nextL
xor ecx, ecx
pop ecx
inc ebx
loop dab
dec ebx
pop eax
pop edx
xor ecx, ecx
pop ecx
sub ecx, 5
push ecx
jmp lol
final:
XOR EAX,EAX
Invoke StdOut,ADDR MsgExit
Invoke StdIn,ADDR inbuf,LengthOf inbuf
Invoke ExitProcess,0
End Start
Исходные данные
Таблица тестирования:
Ожидаемый результат
Полученный результ
1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4
1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4
1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4
1, 1, 1, 1, 1, -56,
2, 2, 2, -95, 2, 2,
3, 3, 3, 3, 3, 3,
4, -58, 99, 4, 4, 4
------------3, 3, 3, 3, 3, 3,
4, -58, 99, 4, 4, 4
------------3, 3, 3, 3, 3, 3,
4, -58, 99, 4, 4, 4
-1, -1, -1, -1, -1, -1,
-2, -2, -2, -2, -2, -2,
-3, -3, -3, -3, -3, -3,
-4, -4, -4, -4, -4, -4,
-------------------------
-------------------------
Вывод: В это лабораторной работе были усвоены приемы работы с матрицами в
ассемблере. В данной работе у меня большое затруднение вызвал корректный вывод
матрицы, содержащей и символы, и цифры.
Контрольные вопросы:
1) Массив и матрица во внутреннем представлении – это последовательность
элементов в памяти. Программирование обработки выполняется с использованием адресного
регистра, в котором хранится либо смещение текущего элемента относительно начала
сегмента данных, либо его смещение относительно начала массива. При переходе к
следующему элементу и то и то смещение увеличиваются на длину элемента.
2) В ассемблере такую последовательность можно определить, например, так:
A SWORD 10,13,28,67,0,-1 ; массив из 6 чисел длиной слово.
3) См. Вопрос 1
4) См. Вопрос 1
5) Матрица расположена в памяти построчно, как и массив. При последовательном
прохождении по матрице используют один регистр, а при произвольном прохождении
используются 2 регистра (регистр номера строки и столбца).
Download