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).
bufor db 50H, 6FH, 45H, 82H
;bufor dd 82456F50H
mov ebx, OFFSET bufor
mov ecx, 0
ptl:
shl eax, 8
mov al, [ebx + ecx]
inc ecx
cmp ecx, 4
jnz ptl
obliczy liczbe bitów o wartosci 1 zawartych w
rejestrze EAX. Wynik obliczenia wpisac do rejestru
CL.
mov eax, 1110101000100001B ; 7 bitow o wartosci 1
xor bl, bl
mov ecx, 32
rol eax, 1
jnc dalej
inc bl
loop ptl
xchg bl, cl
obliczy sume cyfr dziesietnych liczby zawartej w
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
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
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.
; 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
mov esi, OFFSET bufor
xor ecx, ecx
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
znak_trzybajtowy:
add esi, 3
add ecx, 2
cmp [esi], byte PTR 0
; wynik w ecx (ilosc bajtow jaka musi byc zarezerwowana dla tablicy znakow w Unicode)
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
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
je koniec
mov edi, eax
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
koniec:
mov eax, edi
pop edi
pop esi
pop ebp
_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 ebx
mov ebx, [ebp + 8] ; tekst
; wyznaczamy dlugosc zadanego tekstu
mov ecx, -1
cmp [ebx + ecx], byte ptr 0
jne ptl
add ecx, dlugosc ; dodajemy dlugosc tekstu do dopisania
push ecx
pop ecx
sub ecx, dlugosc
sub esi, esi ; indeks petli
ptl2:
mov al, [ebx + esi]
mov [edi + esi], al
cmp esi, ecx
jne ptl2
lea ebx, [edi + esi]
sub ecx, ecx ; indeks petli
ptl3:
mov al, tekst[ecx]
mov [ebx + ecx], al
cmp ecx, dlugosc
jne ptl3
pop ebx
_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);
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
mov ebx, [esp + 12]
mov eax, [esp + 8]
sub ecx, ecx
mov edx, [eax + 4*ecx]
cmp edx, [eax]
jge dalej
lea eax, [eax + 4*ecx]
cmp ecx, ebx
_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 ...
Puszek722