Laba5 Ac [PDF]

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ МОЛДОВА ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ МОЛДОВЫ ФАКУЛЬТЕТ ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ, ИНФОРМАТИК

31 0 355KB

Report DMCA / Copyright

DOWNLOAD PDF FILE

Papiere empfehlen

Laba5 Ac [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ МОЛДОВА ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ МОЛДОВЫ ФАКУЛЬТЕТ ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ, ИНФОРМАТИКИ И МИКРОЭЛЕКТРОНИКИ ДЕПАРТАМЕНТ ИНЖЕНЕРИИ SOFTWARE И АВТОМАТИКИ

ОТЧЕТ По лабораторной работе №5 по дисциплине «Архитектура компьютеров» Тема: Создание и обработка массивов данных.

Выполнил:

ст. гр. TI-155 Корнеску Роберт

Проверил:

Колесник В.

Кишинев 2017

Цель лабораторной работы Работа рассматривает создание и обработку массивов данных.. 5.6 Задание к лабораторной работе Необходимо выполнить ассемблирование и анализ в пошаговом режиме в Debug Инициализация значениями области памяти. INCLUDE Irvine32.inc .data mes db 0ah,0dh,'String - ',0 mas db 10 dup (?),0 ;исходный массив i db 0 .code main proc xor eax,eax ;обнуление eax mov ecx,10 ;значение счетчика цикла в ecx mov esi,0 ;индекс начального элемента в esi go: ;цикл инициализации mov bh,i ;i в bh mov mas[esi],bh;запись в массив i inc i ;инкремент i inc esi ;продвижение к следующему элементу loop go ;повторить цикл ;вывод на экран получившегося массива mov edx,OFFSET mes call WriteString mov ecx,10 mov esi,0 show: movsx eax,mas[esi] call WriteInt inc esi loop show quit: call crlf exit main ENDP END main

массива

; элемент массива по пдресу esi копируется с противоположным знаком

Листинг 00000000 .data 00000000 0A 0D 53 74 72 mes 69 6E 67 20 2D 20 00 0000000C 0000000A [ mas 00 ] 00 00000017 00 i db 0 00000000 .code 00000000 main proc 00000000 00000002 00000007

33 C0 xor B9 0000000A BE 00000000

db 0ah,0dh,'String - ',0

db 10 dup (?),0

eax,eax mov ecx,10 mov esi,0

0000000C 0000000C 00000012 00000018 0000001E 0000001F 00000021 00000026

8A 88 FE 46 E2 BA E8

go: 3D 00000017 R BE 0000000C R 05 00000017 R inc EB loop 00000000 R 00000000 E

mov bh,i mov mas[esi],bh inc i esi go mov edx,OFFSET mes call WriteString

0000002B B9 0000000A mov ecx,10 00000030 BE 00000000 mov esi,0 00000035 show: 00000035 0F BE 86 movsx eax,mas[esi] 0000000C R 0000003C E8 00000000 E call WriteInt 00000041 46 inc esi 00000042 E2 F1 loop show 00000044 quit: 00000044 E8 00000000 E call crlf exit 00000049 6A 00 * push +000000000h 0000004B E8 00000000 E * call ExitProcess 00000050 main ENDP END main

Просмотр массива слов с использованием масштабирования INCLUDE Irvine32.inc .data ;начало сегмента данных ;тексты сообщений: mes1 db ' ne raven 0!',0ah,0dh,0 mes2 db ' raven 0!',0ah,0dh,0 mes3 db 0ah,0dh,'Element ',0 mas dw 2,7,0,0,1,9,3,6,0,8 ;исходный массив .code main proc xor eax,eax ;обнуление ax prepare: mov ecx,10 ;значение счетчика цикла в ecx mov esi,0 ;индекс в esi compare: mov dx,mas[esi*2] ;первый элемент массива в dx cmp dx,0 ;сравнение dx c 0 je equal ;переход, если равно, zf=1 not_equal: ;не равно mov edx,OFFSET mes3 call WriteString ;вывод сообщения на экран mov eax,esi;вывод номера элемента массива на экран call WriteDec ; вывод на экран целого числа mov call

edx,OFFSET mes1 WriteString

inc esi ;на следующий элемент dec ecx ;условие для выхода из цикла jecxz quit ; Если ecx=0 переход на метку jmp compare ;нет — повторить цикл

equal: mov call

;равно 0 edx,OFFSET mes3 ;вывод сообщения mes3 на экран WriteString

mov eax,esi call WriteDec mov call

edx,OFFSET mes2 ;вывод сообщения mes2 на экран WriteString

inc esi ;на следующий элемент dec ecx ;все элементы обработаны? jecxz quit jmp compare quit: call crlf exit main ENDP END main ;конец программы

Листинг 00000000 .data 00000000 20 6E 65 20 72 61 76 65 6E 20 30 21 0A 0D 00 0000000F 20 72 61 76 65 6E 20 30 21 0A 0D 00 0000001B 0A 0D 45 6C 65 6D 65 6E 74 20 00 00000026 0002 0007 0000 0000 0001 0009 0003 0006 0000 0008 00000000 .code 00000000

mes1 db ' ne raven 0!',0ah,0dh,0

mes2 db ' raven 0!',0ah,0dh,0

mes3 db 0ah,0dh,'Element ',0

mas

dw 2,7,0,0,1,9,3,6,0,8

main proc

00000000 33 C0 xor 00000002 prepare: 00000002 B9 0000000A 00000007 BE 00000000 0000000C compare: 0000000C 66| 8B 14 75 00000026 R 00000014 66| 83 FA 00 00000018 74 21 je 0000001A not_equal: 0000001A BA 0000001B R 0000001F E8 00000000 E

eax,eax mov mov

ecx,10 esi,0

mov cmp equal mov call

dx,mas[esi*2] dx,0

edx,OFFSET mes3 WriteString

00000024 00000026

8B C6 mov eax,esi E8 00000000 E call WriteDec

0000002B 00000030

BA 00000000 R E8 00000000 E

00000035 00000036 00000037

46 49 E3 23

mov call

inc esi dec ecx jecxz quit

edx,OFFSET mes1 WriteString

00000039 0000003B

EB D1

0000003B 00000040

BA 0000001B R E8 00000000 E

00000045 00000047

8B C6 mov eax,esi E8 00000000 E call WriteDec

0000004C 00000051

BA 0000000F R E8 00000000 E

00000056 00000057 00000058 0000005A 0000005C 0000005C

46 49 E3 02 EB B0

00000061 00000063 00000068

jmp equal:

compare

mov call

mov call

edx,OFFSET mes3 WriteString

edx,OFFSET mes2 WriteString

inc esi dec ecx jecxz quit jmp compare

quit: E8 00000000 E call crlf exit 6A 00 * push +000000000h E8 00000000 E * call ExitProcess main ENDP END main

Обработка массива элементов с нечетной длиной INCLUDE Irvine32.inc .data ;начало сегмента данных N=5 ;количество элементов массива mas byte 5 dup (3 dup (0)) .code ;сегмент кода main proc ;точка входа в программу xor mov mov go: mov inc mov add loop mov mov show: ;первых

eax,eax ;обнуление eax esi,0 ;0 в esi ecx,N ;N в ecx dl,mas[esi];первый байт поля в dl dl ;увеличение dl на 1 (по условию) mas[esi],dl;запись обратно в массив esi,3 ;сдвиг на следующий элемент массива go ;повтор цикла esi,0 ;подготовка к выводу на экран ecx,N ;вывод на экран содержимого байт полей

movsx eax,mas[esi] call WriteDec add esi,3 esi+3 loop show quit: call crlf exit ; выход main ENDP END main ;конец программы

Листинг

00000000

.data

= 00000005

N=5

00000000 00000005 [ mas 00000003 [ 00 ] ] 00000000 .code 00000000 main proc

byte 5 dup (3 dup (0))

00000000 33 C0 xor eax,eax 00000002 BE 00000000 mov esi,0 00000007 B9 00000005 mov ecx,N 0000000C go: 0000000C 8A 96 00000000 R mov dl,mas[esi] 00000012 FE C2 inc dl 00000014 88 96 00000000 R mov mas[esi],dl 0000001A 83 C6 03 add esi,3 0000001D E2 ED loop go 0000001F BE 00000000 mov esi,0 00000024 B9 00000005 mov ecx,N 00000029 show: 00000029 0F BE 86 movsx eax,mas[esi] 00000000 R 00000030 E8 00000000 E call WriteDec 00000035 83 C6 03 add esi,3 00000038 0000003A 0000003A 0000003F 00000041 00000046

E2 EF

loop show quit: E8 00000000 E call crlf exit 6A 00 * push +000000000h E8 00000000 E * call ExitProcess main ENDP END main

5.7 Варианты индивидуальных заданий 1. Подсчитать количество появлений двух символов, к примеру «ХХ», в некотором массиве символов. Вывести на монитор массив и результат. INCLUDE Irvine32.inc search mov lea lea

MACRO count ecx,len esi,mas1 ; lea загрузка эффективного адреса с индексацией edi,mas2

loop1: mov al,[esi] cmp al,simv je loop2 inc esi jmp endl loop2: mov al,[esi + 1] cmp al,simv je equal inc esi

jmp endl equal: inc esi inc count endl: cmp al,0 loopne loop1 ENDM .data mas1 db mas2 db len equ simv db msg1 db msg2 db .code

;

"xxxxe x yt xx xxxcfxx xxzs i.pxxl",0 30 dup(0) lengthof mas1 'x' "Your string: ", 0 "xx = ",0

main PROC lea edx, msg1 call WriteString lea edx, mas1 call WriteString call Crlf mov ebx, 0 search ebx lea edx, msg2 call WriteString mov eax, ebx call WriteDec call Crlf exit main ENDP END main

Результат работы программы

Листинг search mov lea lea

MACRO count ecx,len esi,mas1 edi,mas2

loop1: mov al,[esi] cmp al,simv je loop2 inc esi jmp endl loop2: mov cmp je inc jmp

al,[esi + 1] al,simv equal esi endl

equal: inc esi inc count endl: cmp al,0 loopne loop1 ENDM 00000000 .data 00000000 78 78 78 78 65 20 78 20 79 74 20 78 78 20 78 78 78 63 66 78 78 20 78 78 7A 73 20 69 2E 70 78 78 6C 00 00000022 0000001E [ 00 ] = 00000022 len equ 00000040 78 simv 00000041 59 6F 75 72 20 73 74 72 69 6E 67 3A 20 00 0000004F 78 78 20 3D 20 00 00000000 .code 00000000 00000000 00000006 0000000B 00000011 00000016 0000001B 00000020 00000025 0000002B 00000031 00000031

8D E8 8D E8 E8

mas1 db "xxxxe x yt xx xxxcfxx xxzs i.pxxl",0

mas2 db 30 dup(0)

lengthof mas1 db 'x' msg1 db "Your string: ", 0

msg2 db "xx = ",0

main PROC 15 00000041 R lea edx, msg1 00000000 E call WriteString 15 00000000 R lea edx, mas1 00000000 E call WriteString 00000000 E call Crlf

BB 00000000 mov ebx, 0 search ebx B9 00000022 1 mov ecx,len 8D 35 00000000 R 1 lea esi,mas1 8D 3D 00000022 R 1 lea edi,mas2 1 loop1: 8A 06 1 mov al,[esi]

00000033 00000039 0000003B 0000003C 0000003E 0000003E 00000041 00000047 00000049 0000004A 0000004C 0000004D 0000004E 00000050

3A 05 00000040 R 1 cmp al,simv 74 03 1 je loop2 46 1 inc esi EB 10 1 jmp endl 1 loop2: 8A 46 01 1 mov al,[esi + 1] 3A 05 00000040 R 1 cmp al,simv 74 03 1 je equal 46 1 inc esi EB 02 1 jmp endl 46 1 equal: inc esi 43 1 inc ebx 3C 00 1 endl: cmp al,0 E0 DF 1 loopne loop1

00000052 00000058 0000005D 0000005F 00000064

8D E8 8B E8 E8

00000069 0000006B 00000070

exit 6A 00 * push E8 00000000 E * main ENDP END main

15 0000004F R lea edx, msg2 00000000 E call WriteString C3 mov eax, ebx 00000000 E call WriteDec 00000000 E call Crlf

+000000000h call ExitProcess

2. Предполагается некоторый текст, состоящий из последовательностей символов, каждая последовательность имеет вид текстовой строки. Необходимо объединить все строки и разделить их при помощи пробела. Вывести все массивы на монитор. INCLUDE Irvine32.inc

procedure MACRO ad1 mov byte ptr [edi-1],' ' ENDM .data seq1 byte 'Sequence1 : ', 0 seq2 byte 'Sequence2 : ', 0 seq3 byte 'Sequence3 : ', 0 fin_seq byte 'Final Sequence : ', 0 s1 byte 'Assembler', 0 s2 byte 'is', 0 s3 byte 'awesome', 0 s4 byte 30 dup(?) .code main PROC cld mov edx, offset seq1 call WriteString mov edx, offset s1 call WriteString call Crlf mov edx, offset seq2 call WriteString mov edx, offset s2 call WriteString

call Crlf mov edx, offset seq3 call WriteString mov edx, offset s3 call WriteString call Crlf mov ecx, LENGTHOF s1 mov esi, offset s1 mov edi, offset s4 copy1 : movsb loop copy1 mov add mov mov add

ecx, ecx, esi, edi, edi,

LENGTHOF s2 1 offset s2 offset s4 LENGTHOF s1

procedure s4

copy2: movsb loop copy2 mov ecx, LENGTHOF s3 mov mov add add

esi, edi, edi, edi,

offset s3 offset s4 LENGTHOF s1 LENGTHOF s2

procedure s4 copy3: movsb loop copy3 mov edi, offset s4 mov ecx, lengthof s4 mov al, ' ' cld c1: scasb je c2 cmp ecx, 0 jz quit loop c1 c2: cld sub edi, 1 stosb jmp c1 quit: mov ecx, LENGTHOF s4 mov esi, OFFSET s4 mov ebx, 0 cycle: mov al, [esi] jmp exl

exl: movsb loop cycle mov edx, offset fin_seq call WriteString mov edx, offset s4 call WriteString call Crlf call ReadKey call ReadChar exit main ENDP END main

Вывод: В данной лабораторной работе были укреплены и дополнительно изучены некоторые аспекты языка ассемблер. В процессе выполнения работы были изучены методы и принципы использования команд работы со строками. В процессе выполнения лабораторной работы были написаны 2 программы:  Программа, которая объединяет все строки и удаляет все символы $, также выводит все массивы на монитор.  Программа, которая подсчитывает количество появлений двух символов, к примеру «ХХ», в некотором массиве символов и выводит на монитор массив и результат.