A.C. Lab4 CerlatPavel FAF-192 [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

Raport Arhitectura Calculatoarelor Lucrarea de Laborator NR.4 Tema:,, SUBPROGRAME ȘI MACROINSTRUCȚIUNI ’’

Elaborat: Cerlat Pavel FAF-192 Controlat: Postovan Dumitru

Condiție: Programul următor adaugă două numere reprezentate ca două secvențe de caractere ASCII. INCLUDE Irvine32.inc

.DATA asc1

DB

'7','5','2','1','3'; 31257

asc2

DB

'6','1','9','9','5'; 59916

l

EQU

sizeof asc1

.CODE main PROC lea

esi,asc1

lea

edi,asc2

mov

ecx,l

clc cycle: mov

al,[esi]

adc

al,[edi]

aaa mov

[edi],al

inc

esi

inc

edi

loop

cycle

exit main ENDP END main

Listing: 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 37 35 32 31 33

asc1

DB

'7','5','2','1','3'; 31257

00000005 36 31 39 39 35

asc2

DB

'6','1','9','9','5'; 59916

= 00000005

l

EQU

00000000

.CODE

00000000

main PROC

sizeof asc1

00000000 8D 35 00000000 R

lea

esi,asc1

00000006 8D 3D 00000005 R

lea

edi,asc2

0000000C B9 00000005 00000011 F8

mov

ecx,l

clc

00000012

cycle:

00000012 8A 06

mov

00000014 12 07

adc

00000016 37

al,[esi] al,[edi]

aaa

00000017 88 07

mov

[edi],al

00000019 46

inc

esi

0000001A 47

inc

edi

0000001B E2 F5

loop

cycle

exit 0000001D 6A 00

*

push +000000000h

0000001F E8 00000000 E * 00000024

call ExitProcess

main ENDP

END main

Condiție: Programul următor efectuează o căutare secvențială pentru primul spațiu din secvența ASCII a poziției. Dacă în EAX nu se găsește spațiu, se scrie -1 și dacă se găsește, se scrie numărul de poziție a spațiului din secvență. Secvența pos are litere de caractere.

INCLUDE Irvine32.inc

.data pos DB 'This_is_a_sequence!' l EQU sizeof pos

.code main proc

mov ecx,l mov esi,0 mov al,' ' sld: inc esi cmp al,pos[esi] loopne sld jne ne_naiden mov eax,l sub eax,ecx jmp vihod ne_naiden: mov eax,-1 vihod: nop

exit main ENDP END main

Listing: 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 C .NOLIST C .LIST C C INCLUDE VirtualKeys.inc C ; VirtualKeys.inc

; MS-Windows prototypes, structures, and constants

C .NOLIST C .LIST C C C .NOLIST C .LIST C

00000000

.data

00000000 54 68 69 73 5F

pos DB 'This_is_a_sequence!'

69 73 5F 61 5F 73 65 71 75 65 6E 63 65 21 = 00000013

l EQU sizeof pos

00000000

.code

00000000

main proc

00000000 B9 00000013

mov ecx,l

00000005 BE 00000000

mov esi,0

0000000A B0 20 0000000C 0000000C 46

mov al,' ' sld: inc esi

0000000D 3A 86 00000000 R

cmp al,pos[esi]

00000013 E0 F7

loopne sld

00000015 75 09

jne ne_naiden

00000017 B8 00000013

mov eax,l

0000001C 2B C1

sub eax,ecx

0000001E EB 05

jmp vihod

00000020 B8 FFFFFFFF 00000025 90

ne_naiden: mov eax,-1

vihod: nop

exit 00000026 6A 00

*

push +000000000h

00000028 E8 00000000 E * 0000002D

call ExitProcess

main ENDP

END main

Varianta 8: De la tastatură se introduce o secvență de 10 caractere, se scrie un program care afișează 20 de linii de 75 de caractere pe fiecare linie care conține secvența introdusă. INCLUDE Irvine32.inc

print MACRO mov ecx,20 loopOuter: push ecx mov ecx,75 mov edx,0 loopInner: mov al,string[edx] call WriteChar inc edx cmp edx,10 jnz ifend mov edx,0 ifend: loop loopInner

call Crlf pop ecx loop loopOuter; ENDM .data string db 10 DUP(?) msg db "Symbol ",0 colon db ':' .code main PROC mov ecx,10 loop1: mov edx, OFFSET msg call WriteString mov eax,11 sub eax,ecx call WriteDec mov al,colon call WriteChar call ReadChar call WriteChar mov edx,10 sub edx,ecx mov string[edx],al call Crlf loop loop1; print exit

main ENDP END main

Listing: 00000000

.data

00000000 0000000A [

string db 10 DUP(?)

00 ] 0000000A 53 79 6D 62 6F

msg db "Symbol ",0

6C 20 00 00000012 3A

colon db ':'

00000000

.code

00000000

main PROC

00000000 B9 0000000A 00000005

mov ecx,10

loop1:

00000005 BA 0000000A R

mov edx, OFFSET msg

0000000A E8 00000000 E

call WriteString

0000000F B8 0000000B

mov eax,11

00000014 2B C1

sub eax,ecx

00000016 E8 00000000 E

call WriteDec

0000001B A0 00000012 R

mov al,colon

00000020 E8 00000000 E

call WriteChar

00000025 E8 00000000 E

call ReadChar

0000002A E8 00000000 E

call WriteChar

0000002F BA 0000000A

mov edx,10

00000034 2B D1

sub edx,ecx

00000036 88 82 00000000 R

mov string[edx],al

0000003C E8 00000000 E 00000041 E2 C2

call Crlf

loop loop1;

print 00000043 B9 00000014 00000048

1

00000048 51

1

mov ecx,20

loopOuter: 1

push ecx

00000049 B9 0000004B

1

mov ecx,75

0000004E BA 00000000

1

mov edx,0

00000053

1

loopInner:

00000053 8A 82 00000000 R 1 00000059 E8 00000000 E 0000005E 42

1

1

0000005F 83 FA 0A 00000062 75 05

1

cmp edx,10 jnz ifend

00000064 BA 00000000 1

00000069 E2 E8

call WriteChar inc edx

1

00000069

mov al,string[edx]

1

mov edx,0

ifend: 1

loop loopInner

0000006B E8 00000000 E

1

00000070 59

pop ecx

1

00000071 E2 D5

1

call Crlf

loop loopOuter;

exit 00000073 6A 00

*

push +000000000h

00000075 E8 00000000 E * 0000007A

call ExitProcess

main ENDP

END main

Concluzie: Codul scris a arătat cât de multe limbi de nivel înalt simplifică procesul de dezvoltare a aplicației, deși limbile la nivel înalt sunt compilate în codul mașinii și efectuează aceeași lucrare, deși procedurile și procedurile macro pot reduce codul.