background image

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)

background image

Przechowywanie liczb … (2)

background image

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ść

background image

Przesyłanie liczb z pamięci 

do rejestru (i odwrotnie)

background image

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

background image

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)");

background image

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

background image

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

background image

Implementacja struktur 

decyzyjnych (3)

background image

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

background image

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:

background image

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 

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

background image

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

background image

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)

background image

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

 

 

background image

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ć

background image

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

background image

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

background image

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 

 

background image

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

background image

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

background image

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

background image

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

background image

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: 

background image

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)

background image

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)

background image

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

background image

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

background image

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  

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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;

background image

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

background image

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

background image

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

background image

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.


Document Outline