Академический Документы
Профессиональный Документы
Культура Документы
ОТЧЕТ
по лабораторной работе №5
по дисциплине «Arhitectura calculatoarelor»
Тема: «Создание и обработка массивов данных»
Кишинев 2021
Цель работы:
Работа рассматривает создание и обработку массивов данных.
Задание к лабораторной работе:
1. Необходимо выполнить ассемблирование вышеприведенных
примеров и проанализировать их в пошаговом режиме Debug.
2. Предполагаются две последовательности символов mas1, mas2 и
некий символ simv. Произвести поиск simv в массиве mas1 и после
каждого найденного simv занести mas1 в mas2. Вывести все массивы на
монитор.
INCLUDE Irvine32.inc
.data
mas1 db "fallaces sunt rerum species "
len1 equ lengthof mas1
mas2 db len1*len1+1 DUP (?)
mas3 db "simv = a",0
simv db "a"
temp dword 0
copi MACRO array1,array2
mov al,simv
mov ecx,len1
mov ebx,0
mov edi,0
DO:
mov temp,ecx
cmp al,array1[ebx]
je COPY
jne next
COPY:
mov ecx,len1
mov esi,0
face: mov dl,array1[esi]
mov array2[edi],dl
inc esi
inc edi
loop face
mov ecx,temp
jmp next
next:
inc ebx
loop DO
endM
Show macro array
mov edx, offset array
Call WriteString
Call Crlf
endM
.code
main PROC
Show mas1
copi mas1,mas2
Show mas2
mov edx,offset mas3
Call WriteString
exit
main ENDP
END main
Примеры программ:
Пример 1. В приведенной ниже программе каждый элемент
массива двойных слов array умножается на постоянное значение. Для
загрузки в регистр ЕАХ текущего элемента массива используется
команда LODSD, а для сохранения - STOSD.
INCLUDE Irvine32.inc
.data
array DWORD 1,2,3,4,5,6,7,8,9,10 ; test data
multiplier DWORD 10
.code
main PROC
cld ; direction = forward
mov esi,OFFSET array ; Загрузим адрес массива
mov edi,esi ; в регистры ESI и EDI
mov ecx,LENGTHOF array ; Загрузим длину массива
L1: lodsd ; Загрузим текущий элемент [ESI] в EAX
mul multiplier
stosd ; Запишем ЕАХ в текущий элемент
;массива (его адрес в [EDI])
loop L1
exit
main ENDP
END main
Листинг примера 1:
INCLUDE Irvine32.inc
C ; Include file for Irvine32.lib (Irvine32.inc)
C
C ;OPTION CASEMAP:NONE ; optional: make identifiers
case-sensitive
C
C INCLUDE SmallWin.inc ; MS-Windows prototypes, structures,
and constants
C .NOLIST
C .LIST
C
C INCLUDE VirtualKeys.inc
C ; VirtualKeys.inc
C .NOLIST
C .LIST
C
C
C .NOLIST
C .LIST
C
00000000 .data
00000000 00000001 array DWORD 1,2,3,4,5,6,7,8,9,10 ; test data
00000002
00000003
00000004
00000005
00000006
00000007
00000008
00000009
0000000A
00000028 0000000A multiplier DWORD 10
00000000 .code
00000000 main PROC
00000000 FC cld ; direction = forward
00000001 BE 00000000 R mov esi,OFFSET array ; Загрузим адрес массива
00000006 8B FE mov edi,esi ; в регистры ESI и EDI
00000008 B9 0000000A mov ecx,LENGTHOF array ; Загрузим длину массива
0000000D AD L1: lodsd ; Загрузим текущий элемент [ESI]
в EAX
0000000E F7 25 00000028 R mul multiplier
00000014 AB stosd ; Запишем ЕАХ в текущий элемент
;массива (его адрес в [EDI])
00000015 E2 F6 loop L1
exit
00000017 6A 00 * push +000000000h
00000019 E8 00000000 E * call ExitProcess
0000001E main ENDP
END main
mov ecx,10
mov esi,0
show:
movsx eax,mas[esi]
call WriteDec
inc esi
loop show
quit:
call crlf
exit
main ENDP
END main
Листинг примера 2:
INCLUDE Irvine32.inc
C ; Include file for Irvine32.lib (Irvine32.inc)
C
C ;OPTION CASEMAP:NONE ; optional: make identifiers
case-sensitive
C
C INCLUDE SmallWin.inc ; MS-Windows prototypes, structures,
and constants
C .NOLIST
C .LIST
C
C INCLUDE VirtualKeys.inc
C ; VirtualKeys.inc
C .NOLIST
C .LIST
C
C
C .NOLIST
C .LIST
C
00000000 .data
00000000 0A 0D 53 74 72 mes db 0ah,0dh,'String - ',0
69 6E 67 20 2D
20 00
0000000C 0000000A [ mas db 10 dup (?),0 ;исходный массив
00
] 00
00000017 00 i db 0
00000000 .code
00000000 main proc
main proc
mov eax,esi
call WriteDec
Листинг примера 3:
INCLUDE Irvine32.inc
C ; Include file for Irvine32.lib (Irvine32.inc)
C
C ;OPTION CASEMAP:NONE; optional: make identifiers case-sensitive
C
C INCLUDE SmallWin.inc ; MS-Windows prototypes, structures, and
constants
C .NOLIST
C .LIST
C
C INCLUDE VirtualKeys.inc
C ; VirtualKeys.inc
C .NOLIST
C .LIST
C
C
C .NOLIST
C .LIST
00000000 .data ;начало сегмента данных
;тексты сообщений:
00000000 20 6E 65 20 72 mes1 db ' ne raven 0!',0ah,0dh,0
61 76 65 6E 20
30 21 0A 0D 00
0000000F 20 72 61 76 65 mes2 db ' raven 0!',0ah,0dh,0
6E 20 30 21 0A
0D 00
0000001B 0A 0D 45 6C 65 mes3 db 0ah,0dh,'Element ',0
6D 65 6E 74 20
00
00000026 0002 0007 0000 mas dw 2,7,0,0,1,9,3,6,0,8 ;исходный массив
0000 0001 0009
0003 0006 0000
0008
00000000 .code
00000000 main proc
00000000 33 C0 xor eax,eax ;обнуление ax
00000002 prepare:
00000002 B9 0000000A mov ecx,10 ;значение счетчика цикла в ecx
00000007 BE 00000000 mov esi,0 ;индекс в esi
0000000C compare:
0000000C 66| 8B 14 75 mov dx,mas[esi*2] ;первый элемент массива в
dx
00000026 R
00000014 66| 83 FA 00 cmp dx,0 ;сравнение dx c 0
00000018 74 21 je equal ;переход, если равно
0000001A not_equal: ;не равно
0000001A BA 0000001B R mov edx,OFFSET mes3
0000001F E8 00000000 E call WriteString ;вывод сообщения на экран