Przechowywanie liczb w
pamięci komputera (1)
liczby występujące w programach często
przekraczają 255 i muszą być zapisywane na
dwóch, czterech lub na większej liczbie bajtów
w systemach komputerowych przyjęto dwa
podstawowe schematy rozmieszczenia
poszczególnych bajtów liczby w pamięci:
mniejsze niżej (ang. little endian)
mniejsze wyżej (ang. big endian)
Przechowywanie liczb … (2)
Przechowywanie liczb … (3)
format
format
little endian
little endian
stosowany jest m.in. w
stosowany jest m.in. w
procesorach rodziny x86/64 (AMD/Intel), VAX,
procesorach rodziny x86/64 (AMD/Intel), VAX,
Alpha
Alpha
format
format
big endian
big endian
stosowany jest m.in. w
stosowany jest m.in. w
procesorach Motorola 680x0, SunSPARC i
procesorach Motorola 680x0, SunSPARC i
większości procesorów klasy RISC
większości procesorów klasy RISC
procesor PowerPC udostępnia oba tryby pracy — w
procesor PowerPC udostępnia oba tryby pracy — w
rejestrze MSR (Machine Status Register)
rejestrze MSR (Machine Status Register)
wprowadzono dwa bity, z których pierwszy określa
wprowadzono dwa bity, z których pierwszy określa
stosowaną kolejność bajtów dla procesora
stosowaną kolejność bajtów dla procesora
działającego w trybie systemu operacyjnego (ang.
działającego w trybie systemu operacyjnego (ang.
kernel mode), drugi bit określa aktualną kolejność
kernel mode), drugi bit określa aktualną kolejność
Przesyłanie liczb z pamięci
do rejestru (i odwrotnie)
Rozpoznawanie formatu
mniejsze niżej/wyżej (1)
identyfikację schematu reprezentacji liczb
identyfikację schematu reprezentacji liczb
stosowanego w danym komputerze można
stosowanego w danym komputerze można
przeprowadzić za pomocą niżej podanego
przeprowadzić za pomocą niżej podanego
fragmentu programu w języku C
fragmentu programu w języku C
w podanym przykładzie założono, że wartości
typu int są 32-bitowe
Rozpoznawanie formatu
mniejsze niżej/wyżej (2)
unsigned int liczba = 0x12345678;
unsigned int liczba = 0x12345678;
unsigned char
unsigned char
wsk = (unsigned char
wsk = (unsigned char
) &
) &
liczba;
liczba;
if (wsk[0] == 0x12)
if (wsk[0] == 0x12)
printf ("\nFormat mniejsze wyżej (big endian)");
printf ("\nFormat mniejsze wyżej (big endian)");
else
else
printf ("\nFormat mniejsze niżej (little
printf ("\nFormat mniejsze niżej (little
endian)");
endian)");
Implementacja struktur
decyzyjnych (1)
Prawie wszystkie algorytmy realizowane w
Prawie wszystkie algorytmy realizowane w
komputerach zawierają struktury decyzyjne, które
komputerach zawierają struktury decyzyjne, które
określają sposób dalszego wykonywania
określają sposób dalszego wykonywania
programu w zależności od wartości uzyskanych
programu w zależności od wartości uzyskanych
wyników pośrednich — struktury te mają postać
wyników pośrednich — struktury te mają postać
rozwidleń i pętli
rozwidleń i pętli
W językach wysokiego poziomu struktury te
W językach wysokiego poziomu struktury te
realizowane są za pomocą instrukcji if … then …
realizowane są za pomocą instrukcji if … then …
else, a pętle za pomocą instrukcji while, for,
else, a pętle za pomocą instrukcji while, for,
repeat … until
repeat … until
Implementacja struktur
decyzyjnych (2)
W tego rodzaju strukturach podstawowe
W tego rodzaju strukturach podstawowe
znaczenie mają operacje porównania — trzeba
znaczenie mają operacje porównania — trzeba
zbadać która z dwóch wartości jest większa albo
zbadać która z dwóch wartości jest większa albo
czy wartości są równe
czy wartości są równe
Implementacja struktur
decyzyjnych (3)
Implementacja struktur
decyzyjnych (4)
W architekturze IA—32 do porównania używa się
W architekturze IA—32 do porównania używa się
dwóch kolejnych rozkazów: pierwszy z nich wykonuje
dwóch kolejnych rozkazów: pierwszy z nich wykonuje
odejmowanie obu porównywanych wartości, drugi
odejmowanie obu porównywanych wartości, drugi
jest rozkazem skoku, który testuje własności wyniku
jest rozkazem skoku, który testuje własności wyniku
odejmowania i ewentualnie przekazuje sterowanie
odejmowania i ewentualnie przekazuje sterowanie
(„skacze”) do innego fragmentu programu
(„skacze”) do innego fragmentu programu
zatem w zależności od wyniku porównania rozkazy
zatem w zależności od wyniku porównania rozkazy
programu mogą być wykonywane dalej w porządku
programu mogą być wykonywane dalej w porządku
naturalnym, albo procesor może ominąć pewną liczbę
naturalnym, albo procesor może ominąć pewną liczbę
rozkazów i przejść (przeskoczyć) do wykonywania
rozkazów i przejść (przeskoczyć) do wykonywania
rozkazów znajdujących się w odległym miejscu
rozkazów znajdujących się w odległym miejscu
pamięci
pamięci
Porównywanie zawartości
Porównywanie zawartości
rejestrów i komórek pamięci
rejestrów i komórek pamięci
(1)
(1)
W architekturze IA–32 operacje porównania
W architekturze IA–32 operacje porównania
realizowane są poprzez odejmowanie
realizowane są poprzez odejmowanie
porównywanych wartości i testowanie zawartości
porównywanych wartości i testowanie zawartości
znaczników: CF, ZF, OF, SF
znaczników: CF, ZF, OF, SF
w operacjach
w operacjach
porównywania liczb bez znaku
porównywania liczb bez znaku
istotne znaczenie mają bity CF i ZF:
istotne znaczenie mają bity CF i ZF:
Porównywanie zawartości
Porównywanie zawartości
rejestrów i komórek pamięci
rejestrów i komórek pamięci
(2)
(2)
CF znacznik przeniesienia, ustawiany w
stan
1
w
przypadku
wystąpienia
przeniesienia (przy dodawaniu) lub pożyczki
(przy odejmowaniu)
ZF znacznik zera, ustawiany w stan 1, jeśli
wynik operacji arytmetycznej lub logicznej
jest równy 0 — w przeciwnym razie znacznik
ustawiany jest w stan 0
Porównywanie zawartości
Porównywanie zawartości
rejestrów i komórek pamięci
rejestrów i komórek pamięci
(3)
(3)
Procesor wykonał odejmowanie dwóch liczb bez znaku
Procesor wykonał odejmowanie dwóch liczb bez znaku
znajdujących się w rejestrach EBX i ECX (rozkaz
znajdujących się w rejestrach EBX i ECX (rozkaz
sub ebx,
sub ebx,
ecx
ecx
) – jakie wartości zostaną wpisane do znaczników CF i
) – jakie wartości zostaną wpisane do znaczników CF i
ZF?
ZF?
1.
(EBX) > (ECX)
ZF = 0
CF = 0
2.
(EBX) = (ECX)
ZF = 1
CF = 0
3.
(EBX) < (ECX)
ZF = 0
CF = 1
Na podstawie stanu znaczników ZF i CF można określić która
Na podstawie stanu znaczników ZF i CF można określić która
z porównywanych liczb jest większa, albo czy liczby są równe
z porównywanych liczb jest większa, albo czy liczby są równe
xxxx
xxxx
Rozkazy SUB i CMP
Rozkazy SUB i CMP
Zamiast rozkazu
Zamiast rozkazu
SUB
SUB
używa się zazwyczaj
używa się zazwyczaj
rozkazu
rozkazu
CMP
CMP
, który również wykonuje
, który również wykonuje
odejmowanie, ustawia znaczniki, ale nigdzie nie
odejmowanie, ustawia znaczniki, ale nigdzie nie
wpisuje wyniku odejmowania — ułatwia to
wpisuje wyniku odejmowania — ułatwia to
kodowanie programu, ponieważ po wykonaniu
kodowanie programu, ponieważ po wykonaniu
rozkazu CMP oba operandy pozostają
rozkazu CMP oba operandy pozostają
niezmienione (rozkaz SUB wpisuje do pierwszego
niezmienione (rozkaz SUB wpisuje do pierwszego
operandu wynik odejmowania)
operandu wynik odejmowania)
Porównywanie liczb ze
Porównywanie liczb ze
znakiem i bez znaku (1)
znakiem i bez znaku (1)
Do testowania stanu znaczników używa się omawianych
Do testowania stanu znaczników używa się omawianych
wcześniej rozkazów sterujących (skoków) warunkowych
wcześniej rozkazów sterujących (skoków) warunkowych
(np. ja, jnz, ...) — do porównywania liczb ze znakiem i bez
(np. ja, jnz, ...) — do porównywania liczb ze znakiem i bez
znaku stosuje się odrębne grupy rozkazów sterujących
znaku stosuje się odrębne grupy rozkazów sterujących
Porównywanie liczb ze
Porównywanie liczb ze
znakiem i bez znaku (2)
znakiem i bez znaku (2)
Poniższa tablica zawiera zestawienie warunków logicznych
Poniższa tablica zawiera zestawienie warunków logicznych
testowanych przez rozkazy używane w operacjach
testowanych przez rozkazy używane w operacjach
porównywania liczb bez znaku; w przypadku liczb ze
porównywania liczb bez znaku; w przypadku liczb ze
znakiem wyrażenia mają inną postać
znakiem wyrażenia mają inną postać
Przykład: wyszukiwanie liczby
Przykład: wyszukiwanie liczby
naj-większej w tablicy liczb
naj-większej w tablicy liczb
(bez znaku)
(bez znaku)
; adres pierwszego elementu tablicy został
; adres pierwszego elementu tablicy został
; wcześniej wpisany do rejestru EBX
; wcześniej wpisany do rejestru EBX
; liczba elementów tablicy została wcześniej
; liczba elementów tablicy została wcześniej
; wpisana do rejestru ECX
; wpisana do rejestru ECX
dec ecx
dec ecx
; ECX
; ECX
ECX–1
ECX–1
mov
mov
eax,
eax,
[ebx]
[ebx]
ptla:
ptla:
add
add
ebx, 4
ebx, 4
; EBX
; EBX
EBX+4
EBX+4
cmp
cmp
eax, [ebx]
eax, [ebx]
jae
jae
skocz
skocz
; skocz gdy > lub =
; skocz gdy > lub =
mov
mov
eax, [ebx]
eax, [ebx]
skocz:
skocz:
sub
sub
ecx, 1
ecx, 1
ECX
ECX
ECX–1
ECX–1
jnz
jnz
ptla
ptla
; skocz, gdy ECX
; skocz, gdy ECX
0
0
Rozkazy wyznaczania
Rozkazy wyznaczania
wartości logicznych (1)
wartości logicznych (1)
Podane wcześniej typy rozkazów sterujących
Podane wcześniej typy rozkazów sterujących
warunkowych pozwalają na zmianę porządku
warunkowych pozwalają na zmianę porządku
wykonywania rozkazów programu w zależności od
wykonywania rozkazów programu w zależności od
wyniku porównania
wyniku porównania
Czasami jednak przed wykonaniem skoku trzeba
Czasami jednak przed wykonaniem skoku trzeba
wykonać dodatkowe operacje — w takich
wykonać dodatkowe operacje — w takich
przypadkach, za pomocą wybranego rozkazu z
przypadkach, za pomocą wybranego rozkazu z
grupy
grupy
SET
SET
... można zapisać wynik porównania w
... można zapisać wynik porównania w
rejestrze 8-bitowym lub zmiennej
rejestrze 8-bitowym lub zmiennej
Rozkazy wyznaczania
Rozkazy wyznaczania
wartości logicznych (2)
wartości logicznych (2)
Sekwencje rozkazów podane w lewej i w prawej
Sekwencje rozkazów podane w lewej i w prawej
kolumnie są funkcjonalnie równoważne
kolumnie są funkcjonalnie równoważne
cmp
ecx, edx
mov
al, 1
jae
zgadza_się
dec
al
zgadza_sie:
cmp
ecx, edx
setae
al
Kodowanie programów na
Kodowanie programów na
poziomie rozkazów procesora (1)
poziomie rozkazów procesora (1)
wykonanie programu przez procesor wymaga
uprzedniego załadowania do pamięci danych i
rozkazów, zakodowanych w formie ciągów
zerojedynkowych, zrozumiałych przez procesor
współczesne kompilatory języków programowania
generują takie ciągi w sposób automatyczny na
podstawie kodu źródłowego programu
niekiedy jednak celowe jest precyzyjne
zakodowanie programu lub fragmentu programu
za pomocą pojedynczych rozkazów procesora
Kodowanie programów na
Kodowanie programów na
poziomie rozkazów procesora (2)
poziomie rozkazów procesora (2)
dokumentacja techniczna procesora zawiera zazwyczaj
tablice ciągów zerojedynkowych przypisanych
poszczególnym operacjom (rozkazom procesora)
kodowanie na poziomie zer i jedynek, aczkolwiek możliwe,
byłoby bardzo żmudne i podatne na pomyłki
z tego powodu opracowano programy, nazywane
asemblerami, które na podstawie skrótu literowego (tzw.
mnemonika) opisującego czynności rozkazu dokonują
zamiany tego skrótu na odpowiedni ciąg zer i jedynek
asemblery udostępniają wiele innych udogodnień, jak np.
możliwość zapisu liczb w systemach o podstawie 2, 8, 10,
16 czy też automatyczną zamianę tekstów znakowych na
ciągi bajtów zawierające kody ASCII poszczególnych liter
Wiersze źródłowe w asemblerze
Wiersze źródłowe w asemblerze
(1)
(1)
w programie asemblerowym niektóre obszary
pamięci opatrywane są nazwami:
jeśli
nazwa
odnosi
się
do
obszaru
zawierającego instrukcję (rozkaz) programu,
to nazwa taka stanowi etykietę,
jeśli obszar zawiera zmienną (daną), to
nazwa obszaru stanowi nazwę zmiennej;
nazwę w sensie asemblera tworzy ciąg liter, cyfr i
znaków ? (znak zapytania), @ (symbol at), _ (znak
podkreślenia), $ (znak dolara); nazwa nie może
zaczynać się od cyfry
Wiersze źródłowe w asemblerze
Wiersze źródłowe w asemblerze
(2)
(2)
etykietę, wraz ze znakiem : (dwukropka),
umieszcza się przed rozkazem, np.
powtorz: mov
dl, [ecx]
taka konstrukcja oznacza, że obszar kilku bajtów
pamięci, w których przechowywany jest kod
podanego rozkazu
mov dl, [ecx]
ma swoją
unikatową nazwę, czyli etykietę
opcjonalnie może jeszcze wystąpić komentarz
poprzedzony znakiem średnika ;
program w asemblerze pozbawiony komentarzy
może być nieczytelny nawet dla autora
Deklaracje zmiennych w
Deklaracje zmiennych w
asemblerze (1)
asemblerze (1)
zmienne w programie deklaruje się za pomocą
dyrektyw:
DB – definiowanie bajtu (8 bitów),
DW – definiowanie słowa (16 bitów),
DD – definiowanie słowa podwójnej długości
(32 bity),
DQ definiowanie słowa poczwórnej długości
(64 bity)
przykład:
Deklaracje zmiennych w
Deklaracje zmiennych w
asemblerze (2)
asemblerze (2)
po lewej stronie dyrektywy podaje się nazwę
po lewej stronie dyrektywy podaje się nazwę
zmiennej, a po prawej wartość początkową, np.
zmiennej, a po prawej wartość początkową, np.
elem_sygn
DD –765407
w jednym wierszu można podać kilka wartości
w jednym wierszu można podać kilka wartości
alfa
DW
4567H, 5678H, 6789H
powyższy wiersz można interpretować jako
powyższy wiersz można interpretować jako
deklarację tablicy zawierającej trzy liczby 16-
deklarację tablicy zawierającej trzy liczby 16-
bitowe
bitowe
jeśli tablica zawiera identyczne elementy, to
jeśli tablica zawiera identyczne elementy, to
stosuje się operator powtarzania
stosuje się operator powtarzania
dup
dup
, np.
, np.
wyniki
DB 512 dup (–1)
Deklaracje zmiennych w
Deklaracje zmiennych w
asemblerze (3)
asemblerze (3)
jeśli podane wartości są liczbami całkowitymi, to
jeśli podane wartości są liczbami całkowitymi, to
asembler tworzy ich reprezentacje binarne
asembler tworzy ich reprezentacje binarne
przyjmując, że najmniej znaczący bit ma wagę 2
przyjmując, że najmniej znaczący bit ma wagę 2
0
0
liczby dziesiętne poprzedzone znakiem + i liczby
liczby dziesiętne poprzedzone znakiem + i liczby
bez znaku traktowane są jednakowo: zamiana na
bez znaku traktowane są jednakowo: zamiana na
kod binarny wykonywana jest przy założeniu, że
kod binarny wykonywana jest przy założeniu, że
wszystkie bity w bajcie, w słowie, itd. są bitami
wszystkie bity w bajcie, w słowie, itd. są bitami
znaczącymi (nie występuje bit znaku)
znaczącymi (nie występuje bit znaku)
Deklaracje zmiennych w
Deklaracje zmiennych w
asemblerze (4)
asemblerze (4)
dla liczb ujemnych stosuje się kod U2, przy czym
dla liczb ujemnych stosuje się kod U2, przy czym
przyjmuje się, że bit znaku zajmuje skrajną lewą
przyjmuje się, że bit znaku zajmuje skrajną lewą
pozycji bajtu, słowa, itd.; w szczególności oznacza
pozycji bajtu, słowa, itd.; w szczególności oznacza
to, że wiersze
to, że wiersze
DB
DB
–128
–128
DB
DB
+128
+128
generują takie same kody binarne 10000000
generują takie same kody binarne 10000000
Deklaracje zmiennych w
Deklaracje zmiennych w
asemblerze (5)
asemblerze (5)
znak zapytania (?) oznacza, że wartość
znak zapytania (?) oznacza, że wartość
początkowa zmiennej jest nieokreślona, np.
początkowa zmiennej jest nieokreślona, np.
linia7a
linia7a
DQ
DQ
?
?
DQ
DQ
19331
19331
nazwę zmiennej przed dyrektywą można pominąć
nazwę zmiennej przed dyrektywą można pominąć
w polu operandu dyrektywy DB mogą
w polu operandu dyrektywy DB mogą
występować także łańcuchy znaków, np.
występować także łańcuchy znaków, np.
uczelnia
uczelnia
DB
DB
'Politechnika Gdańska', 0DH, 0AH
'Politechnika Gdańska', 0DH, 0AH
Deklaracje zmiennych w
Deklaracje zmiennych w
asemblerze (6)
asemblerze (6)
liczby z kropką oddzielającą część ułamkową
liczby z kropką oddzielającą część ułamkową
mogą występować jako operandy dyrektyw DD,
mogą występować jako operandy dyrektyw DD,
DQ, DT – liczby takie są przekształcane na postać
DQ, DT – liczby takie są przekształcane na postać
zmiennoprzecinkową binarną, np.:
zmiennoprzecinkową binarną, np.:
c_Eulera
c_Eulera
DT
DT
0.577215
0.577215
; stała Eulera
; stała Eulera
— — — — — — — — — — — — —
— — — — — — — — — — — — —
fld
fld
c_Eulera
c_Eulera
; załadowanie stałej Eulera
; załadowanie stałej Eulera
; na stos koprocesora
; na stos koprocesora
Deklaracje stałych w
Deklaracje stałych w
asemblerze
asemblerze
deklaracje stałych umożliwiają przypisanie nazw
deklaracje stałych umożliwiają przypisanie nazw
symbolicznych do określonych wartości, np.
symbolicznych do określonych wartości, np.
num1
num1
EQU
EQU
18H
18H
; wartość max
; wartość max
Kodowanie rozkazów (1)
Kodowanie rozkazów (1)
Typowe rozkazy procesora mają jeden lub dwa
argumenty, np. rozkaz przesłania
mov edi, pomiar
powoduje wpisanie do rejestru
EDI
zawartości
zmiennej
pomiar
operandy rozkazów mają postać wyrażeń różnych
typów: są to często rejestry, liczby, ciągi znaków,
wyrażenia opisujące położenie lokacji pamięci i
modyfikacje adresowe
w asemblerze przyjęto, że nazwa zmiennej
w asemblerze przyjęto, że nazwa zmiennej
występująca w polu operandu rozkazu (podobnie
występująca w polu operandu rozkazu (podobnie
jak nazwa rejestru) oznacza, że działanie ma być
jak nazwa rejestru) oznacza, że działanie ma być
wykonane na zawartości tej zmiennej
wykonane na zawartości tej zmiennej
Kodowanie rozkazów (2)
Kodowanie rozkazów (2)
W trakcie asemblacji nazwie każdej zmiennej
W trakcie asemblacji nazwie każdej zmiennej
przypisywana jest wartość równa odległości
przypisywana jest wartość równa odległości
pierwszego bajtu tej zmiennej (liczonej w bajtach)
pierwszego bajtu tej zmiennej (liczonej w bajtach)
od początku obszaru danych
od początku obszaru danych
jeszcze raz podkreślamy: omawiana wartość nie
jeszcze raz podkreślamy: omawiana wartość nie
jest wartością zmiennej, ale jest przypisywana
jest wartością zmiennej, ale jest przypisywana
nazwie zmiennej i określa położenie zmiennej w
nazwie zmiennej i określa położenie zmiennej w
pamięci
pamięci
Rozmiary operandów (1)
Rozmiary operandów (1)
jeśli instrukcja wymaga podania dwóch
jeśli instrukcja wymaga podania dwóch
operandów, to prawie zawsze muszą być one
operandów, to prawie zawsze muszą być one
jednakowej długości, np.:
jednakowej długości, np.:
sub ecx, edi
sub ecx, edi
; obliczenie ECX
; obliczenie ECX
ECX – EDI
ECX – EDI
add
add
eax, dx
eax, dx
; błąd !!! — dodawanie
; błąd !!! — dodawanie
; zawartości rejestru 16-bitowego
; zawartości rejestru 16-bitowego
; do 32-bitowego
; do 32-bitowego
Rozmiary operandów (2)
Rozmiary operandów (2)
wyjątkowo, jeśli jeden z operandów znajduje się w
wyjątkowo, jeśli jeden z operandów znajduje się w
pamięci, to możliwa jest doraźna zmiana rozmiaru
pamięci, to możliwa jest doraźna zmiana rozmiaru
(typu) zmiennej za pomocą operatora PTR, np.
(typu) zmiennej za pomocą operatora PTR, np.
blok_sys
blok_sys
dd
dd
?
?
; zmienna 32-
; zmienna 32-
bitowa
bitowa
— — — — — — — — —
— — — — — — — — —
mov
mov
cx,
cx,
word PTR blok_sys
word PTR blok_sys
mov
mov
dx,
dx,
word PTR blok_sys+2
word PTR blok_sys+2
w podanym przykładzie do rejestru CX zostanie wpisana
w podanym przykładzie do rejestru CX zostanie wpisana
młodsza część 32-bitowej zmiennej blok_sys, a rejestru DX
młodsza część 32-bitowej zmiennej blok_sys, a rejestru DX
starsza część tej zmiennej
starsza część tej zmiennej
w przypadku pominięcia operatora PTR sygnalizowany
w przypadku pominięcia operatora PTR sygnalizowany
byłby błąd asemblacji wynikający z niejednakowej długości
byłby błąd asemblacji wynikający z niejednakowej długości
obu operandów
obu operandów
Operator PTR (1)
Operator PTR (1)
operator PTR używany jest w wyrażeniach
operator PTR używany jest w wyrażeniach
adresowych do ścisłego określania atrybutów
adresowych do ścisłego określania atrybutów
symbolu występującego w wyrażeniu adresowym
symbolu występującego w wyrażeniu adresowym
po prawej stronie operatora występuje wyrażenie
po prawej stronie operatora występuje wyrażenie
adresowe, a po lewej atrybut spośród
adresowe, a po lewej atrybut spośród
następujących: byte (8 bitów), word (16 bitów),
następujących: byte (8 bitów), word (16 bitów),
dword (32 bity), fword (48 bitów), qword (64 bity),
dword (32 bity), fword (48 bitów), qword (64 bity),
tword (80 bitów)
tword (80 bitów)
operator PTR nie dokonuje konwersji typów —
operator PTR nie dokonuje konwersji typów —
działa on tylko w trakcie asemblacji programu i
działa on tylko w trakcie asemblacji programu i
nie może zastępować rozkazów wykonywanych w
nie może zastępować rozkazów wykonywanych w
trakcie realizacji programu;
trakcie realizacji programu;
Operator PTR (2)
Operator PTR (2)
z podanych powodów poniższy rozkaz
z podanych powodów poniższy rozkaz
mov ebx, dword PTR dh
mov ebx, dword PTR dh
; błąd !
; błąd !
jest błędny
jest błędny
Konwersję taką można zrealizować za pomocą
Konwersję taką można zrealizować za pomocą
dalej opisanych rozkazów MOVSX lub MOVZX
dalej opisanych rozkazów MOVSX lub MOVZX
Operator PTR (3)
Operator PTR (3)
operator PTR stosuje się także w przypadkach,
operator PTR stosuje się także w przypadkach,
gdy wyrażenie adresowe nie pozwala na
gdy wyrażenie adresowe nie pozwala na
jednoznaczne przetłumaczenie rozkazu, np.
jednoznaczne przetłumaczenie rozkazu, np.
poniższy rozkaz stanowi tzw. odwołanie
poniższy rozkaz stanowi tzw. odwołanie
anonimowe (nie zawiera nazwy zmiennej)
anonimowe (nie zawiera nazwy zmiennej)
mov
mov
[ebx], 65
[ebx], 65
operandy rozkazu nie precyzują czy liczba 65 ma zostać
operandy rozkazu nie precyzują czy liczba 65 ma zostać
zapisana w pamięci jako liczba 8-bitowa, 16-bitowa czy 32-
zapisana w pamięci jako liczba 8-bitowa, 16-bitowa czy 32-
bitowa — zamiast podanego wyżej rozkazu programista
bitowa — zamiast podanego wyżej rozkazu programista
musi wyraźnie określić rozmiar liczby podając jeden z
musi wyraźnie określić rozmiar liczby podając jeden z
trzech poniższych rozkazów
trzech poniższych rozkazów
mov
mov
byte
byte
PTR
PTR
[ebx], 65
[ebx], 65
mov
mov
word
word
PTR
PTR
[ebx], 65
[ebx], 65
mov
mov
dword
dword
PTR
PTR
[ebx], 65
[ebx], 65
Rozkazy MOVZX i MOVSX (1)
Rozkazy MOVZX i MOVSX (1)
reguła dotycząca jednakowej długości operandów
reguła dotycząca jednakowej długości operandów
nie obowiązuje w odniesieniu do rozkazów MOVSX
nie obowiązuje w odniesieniu do rozkazów MOVSX
i MOVZX
i MOVZX
rozkazy te powodują przepisanie zawartości 8- lub
rozkazy te powodują przepisanie zawartości 8- lub
16-bitowego rejestru (lub zawartości lokacji
16-bitowego rejestru (lub zawartości lokacji
pamięci) do rejestru 16- lub 32-bitowego
pamięci) do rejestru 16- lub 32-bitowego
w przypadku rozkazu MOVZX brakujące bity w
w przypadku rozkazu MOVZX brakujące bity w
rejestrze docelowym uzupełniane są zerami, zaś
rejestrze docelowym uzupełniane są zerami, zaś
w przypadku MOVSX bity te są wypełniane przez
w przypadku MOVSX bity te są wypełniane przez
wielokrotnie powielony bit znaku kopiowanego
wielokrotnie powielony bit znaku kopiowanego
rejestru
rejestru
Rozkazy MOVZX i MOVSX (2)
Rozkazy MOVZX i MOVSX (2)
przykłady
przykłady
liczba_proc
liczba_proc
db
db
145
145
; zmienna 8-bitowa
; zmienna 8-bitowa
— — — — — — — — —
— — — — — — — — —
movzx
movzx
edx,
edx,
liczba_proc
liczba_proc
movsx
movsx
edx,
edx,
bh
bh
rozkaz MOVSX stosuje się do kopiowania liczb ze
rozkaz MOVSX stosuje się do kopiowania liczb ze
znakiem — po zwiększeniu ilości bitów liczby, jej
znakiem — po zwiększeniu ilości bitów liczby, jej
wartość pozostaje niezmieniona.
wartość pozostaje niezmieniona.