PROGRAMYAKO.docx

(24 KB) Pobierz
PROGRAMY AKO.docx

W czterech kolejnych bajtach pamieci znajduja sie

liczby:

adres zawartosc

65BH 2AH

65AH 00H

659H 37H

658H F2H

Przyjmujac, że podane bajty stanowia liczbe binarna

32-bitowa podac wartosc tej liczby w zapisie

szesnastkowym przy założeniu, że stosowana jest

konwencja mniejsze wyżej (ang. big endian).

F237002AH

 

W rejestrze EBX znajduje sie liczba całkowita w

kodzie U2. Zakładamy, że liczba zawarta jest w

przedziale < – (231 – 1), 231 – 1>. Napisac fragment,

który przekoduje te liczbe na kod znak-moduł.

 

 

              extern _ExitProcess@4 : PROC

              public _main

              .data

              .code

              _main:

              mov eax, 10

              cmp eax, 0

              jge dalej ; jezeli eax > 0 to przejdz dalej

              neg eax ; eax = 0 - eax

              rcl eax, 1 ; przesuniecie bitow w lewo

              stc ; ustawienie flagi CF=1

              rcr eax, 1 ; ustawienie najstarszego bitu na 1 (wartosc w CF)

              dalej:

              push 0

call _ExitProcess@4

END

 

W rejestrach EDX:EBX:EAX znajduje sie 96-

bitowy ciag bitów. Napisac fragment programu, w

którym ciag ten zostanie przesuniety cyklicznie w

lewo o 1 pozycje.

 

bt edx, 31 ; wpisanie wartosci najstarszego bitu rejestru edx do CF

rcl eax, 1 ; przesuniecie bitow w lewo,

; wartosc z CF wpisana na najmlodszy bit, najstarszy bit wpisany do CF

rcl ebx, 1 ; -||-

rcl edx, 1 ; -||-

 

Napisac fragment programu w asemblerze, który

zamieni młodsza (bity 15 – 0) i starsza (bity 31 – 16)

czesc rejestru EDX.

 

rol edx, 48

 

W czterech kolejnych bajtach pamieci poczawszy

od adresu podanego w rejestrze w EBX znajduje sie

32-bitowa liczba całkowita bez znaku zakodowana w

formacie mniejsze wyej (big endian). Nie uywajac

rozkazu BSWAP załadowac te liczbe do rejestru EAX

w formacie mniejsze niej (little endian).

 

.data

bufor db 50H, 6FH, 45H, 82H

;bufor dd 82456F50H

.code

_main:

mov ebx, OFFSET bufor

mov ecx, 0

ptl:

shl eax, 8

mov al, [ebx + ecx]

inc ecx

cmp ecx, 4

jnz ptl

 

Napisac fragment programu w asemblerze, który

obliczy liczbe bitów o wartosci 1 zawartych w

rejestrze EAX. Wynik obliczenia wpisac do rejestru

CL.

 

_main:

              mov eax, 1110101000100001B ; 7 bitow o wartosci 1

              xor bl, bl

              mov ecx, 32

              ptl:

              rol eax, 1

              jnc dalej

              inc bl

              dalej:

              loop ptl

              xchg bl, cl

 

Napisac fragment programu w asemblerze, który

obliczy sume cyfr dziesietnych liczby zawartej w

rejestrze EAX. Wynik obliczenia wpisac do rejestru

CL. Przykład: jesli w rejestrze EAX znajduje sie liczba

1111111 (dziesietnie 127), to po wykonaniu

fragmentu rejestr CL powinien zawierac 00001000.

 

                            mov eax, 125h

                            mov ebx, 10

                            xor cl, cl

              ptl:

                            xor edx, edx ; zerowanie starszej części dzielnej

                            div ebx ; dzielenie wartości w edx:eax przez wartość w ebx (10)

                            ; wynik w eax, reszta w edx

                            add cl, dl ; dodanie reszty z dzielenia (kolejnej cyfry dziesiętnej) do cl

                            cmp eax, 0 ; zakoncz jezeli wynik dzielenia = 0

                            jnz ptl

                           

W tablicy znaki znajduje sie pewien tekst

zakodowany w formacie UTF–8. Tekst zakonczony

jest bajtem o wartosci 0. Napisac fragment programu

w asemblerze, który wyznaczy liczbe bajtów, które

zajmowac bedzie ww. tekst po zamianie na 16-bitowy

format UTF-16. Obliczona liczbe bajtów wpisac do

rejestru ECX. Przyjac, e tekst w zawiera znaki

zakodowane na jednym, dwóch lub trzech bajtach.

 

 

extern _ExitProcess@4 : PROC

public _main

.data

; dla poniższej tablicy bufor

; 36 bajtow w utf-8 -> 60 bajtów w utf-16 (nie liczymy z 0, które jest na końcu

tablicy)

bufor db 50H, 6FH, 0C5H, 82H, 0C4H, 85H, 63H, 7AH

db 65H, 6EH, 69H, 65H, 20H, 7AH, 6FH, 73H

db 74H, 61H, 0C5H, 82H, 6FH, 20H, 6EH, 61H

db 77H, 69H, 0C4H, 85H, 7AH, 61H, 6EH, 65H, 2EH

db 0E2H, 91H, 0A4H, 00H

.code

_main:

mov esi, OFFSET bufor

xor ecx, ecx

ptl:

mov al, [esi]

rcl al, 1

jc znak_wielobajtowy

; dla znaku jednobajtowego:

inc esi

jmp dalej

znak_wielobajtowy:

rcl al, 2

jc znak_trzybajtowy

; dla znaku dwubajtowego:

add esi, 2

jmp dalej

znak_trzybajtowy:

add esi, 3

dalej:

add ecx, 2

cmp [esi], byte PTR 0

jnz ptl

; wynik w ecx (ilosc bajtow jaka musi byc zarezerwowana dla tablicy znakow w Unicode)

push 0

call _ExitProcess@4

END

 

Napisac podprogram w asemblerze przystosowany do

wywoływania z poziomu jezyka C, którego prototyp ma

postac:

int roznica (int * odjemna,

int ** odjemnik);

Podprogram ten powinien obliczyc rónice dwóch liczb

całkowitych ze znakiem w kodzie U2.

 

_roznica PROC

              push ax

              mov edx, 000000FFh

              shl dl, 1

                            mov edx, 000000FFh

              sal dl, 1

              mov eax, [esp + 4]

              mov eax, [eax]

              mov ecx, [esp + 8]

              mov ecx, [ecx]

              sub eax, [ecx]

              ret

 

_roznica ENDP

 

Funkcja biblioteczna jezyka C o prototypie

void * malloc(unsigned int k);

przydziela k-bajtowy obszar pamieci i zwraca adres

przydzielonego obszaru. Jesli wymagany obszar nie

moe byc przydzielony, to funkcja zwraca wartosc 0.

Napisac podprogram w asemblerze, przystosowany do

wywoływania z poziomu jezyka C — prototyp tego

podprogramu ma postac:

int * kopia_tablicy(int tabl[],

unsigned int n);

 

_kopia_tablicy PROC

              push ebp

              mov ebp, esp

              push esi

              push edi

             

              mov esi, [ebp + 8]

              mov ecx, [ebp + 12]

              mov eax, 4

              mul ecx

 

              push eax

              call _malloc

              add esp, 4

              cmp eax, 0

              je koniec

              mov edi, eax

 

              mov ecx, [ebp + 12]

ptl:

              mov [edi + 4*ecx - 4], dword ptr 0

              mov eax, [esi + 4*ecx - 4]

              bt eax, 0

              jc dalej

              mov [edi + 4*ecx - 4], eax

 

dalej:

              loop ptl

 

koniec:

              mov eax, edi

              pop edi

              pop esi

              pop ebp

              ret

_kopia_tablicy ENDP

 

Podprogram, przystosowany do wywoływania z

poziomu jezyka C, o prototypie:

char * komunikat (char * tekst);

rezerwuje obszar pamieci (za pomoca funkcji

malloc) i wpisuje do niego tekst wskazany przez

parametr tekst, bezposrednio za którym zostaje

dopisany łancuch znaków "Bład.". Podprogram

zwraca adres przydzielonego obszaru. Napisac kod

asemblerowy tego podprogramu.

Wskazówka: łancuch znaków konczy sie bajtem o

wartosci 0.

 

_komunikat PROC

              push ebp

              mov ebp, esp

              push esi

              push edi

              push ebx

 

              mov ebx, [ebp + 8] ; tekst

             

              ; wyznaczamy dlugosc zadanego tekstu

              mov ecx, -1

ptl:

              inc ecx

              cmp [ebx + ecx], byte ptr 0

              jne ptl

 

              add ecx, dlugosc ; dodajemy dlugosc tekstu do dopisania

              push ecx

              call _malloc

              pop ecx

 

              mov edi, eax

              sub ecx, dlugosc

              sub esi, esi ; indeks petli

ptl2:

              mov al, [ebx + esi]

              mov [edi + esi], al

              inc esi

              cmp esi, ecx

              jne ptl2

 

 

              lea ebx, [edi + esi]

              sub ecx, ecx ; indeks petli

ptl3:

              mov al, tekst[ecx]

              mov [ebx + ecx], al

              inc ecx

              cmp ecx, dlugosc

              jne ptl3

 

              mov eax, edi

              pop ebx

              pop edi

              pop esi

              pop ebp

              ret

_komunikat ENDP

 

Poniej podano fragment programu w jezyku C.

int pomiary[7], * wsk;

- - - - - - - - - - - - - - -

wsk = szukaj_elem_min(pomiary, 7);

printf("\nElement minimalny = %d\n",

* wsk);

Napisac podprogram w asemblerze przystosowany do

wywoływania z poziomu jezyka C, którego prototyp

ma postac:

int * szukaj_elem_min (

int tablica[ ], int n);

Podprogram ten powinien wyznaczyc najmniejszy

element tablicy i zwrócic adres (wskaznik) tego

elementu. Liczbe elementów tablicy okresla drugi

parametr funkcji.

 

_szukaj_elem_min PROC

              push ebx

              mov ebx, [esp + 12]

              mov eax, [esp + 8]

              sub ecx, ecx

ptl:

              mov edx, [eax + 4*ecx]

              cmp edx, [eax]

              jge dalej

              lea eax, [eax + 4*ecx]

dalej:

              inc ecx

              cmp ecx, ebx

              jne ptl

 

              pop ebx

              ret

_szukaj_elem_min ENDP

 

W pamieci komputera, poczawszy od adresu

podanego w rejestrze ESI znajduje sie 32-bitowa

liczba zmiennoprzecinkowa w formacie float. Napisac

fragment programu, który przekształci te liczbe na 64-

bitowy format double i ...

Zgłoś jeśli naruszono regulamin