Łączna liczba wyświetleń

wtorek, 23 lutego 2016

5. Kurs Asembler x86: Zmienne, informacje o typach danych i elementach kodu.

Autor Nauka Programowania  |  w x86  23:07




Uruchom wcześniej przygotowany projekt. Kod programu opisywanego w tej części to:

.386
.model flat, stdcall
.stack 4096

include kernel32.inc
includelib kernel32.lib

.data
dwSuma DWORD 0

.code
main PROC
    mov eax, 5
    add eax, 11
    mov dwSuma, eax

    invoke ExitProcess, eax
main ENDP
END main



Zmienna jest to element programu służący do przechowywania danych. Korzystając z asemblera MASM zmienne o określonej wartości deklaruje się w sekcji .data W tym przypadku zadeklarowana jest zmienna o nazwie dwSuma typu DWORD, która przechowuje wartość 0.



Kliknij w miejscu przedstawionej kropki na linijce z invoke ExitProcess, eax. Spowoduje to dodanie breakpointa przed wykonanej tej instrukcji. Uruchom debugowanie programu klawiszem F5. Wykonanie programu zatrzyma się w miejscu breakpointa i program nie będzie się dalej wykonywał dopóki nie zostanie naciśnięty klawisz służący do przejścia do następnej instrukcji.




Na dole, w zakładce Autos będzie pokazana wartość zmiennej dwSuma. Jeżeli nie masz zakładki Autos możesz ją dodać w trakcie debugowania z Debug > Windows > Autos


Po naciśnięciu F10 wykona się instrukcja invoke ExitProcess, eax po czym program zosatnie zamknięty.

Stałe liczbowe


Stałe liczbowe tworzone są przez ciąg liczb i oraz przez znak, który może przed nimi występować. Na końcu stałej liczbowej może występować informacja o wykorzystanym systemie liczbowym.

[{+ | -}] cyfry [system liczbowy]

Opis systemu liczbowego

h
Szenastkowy
q/o
Ósemkowy
d
Dziesiętny
b
Binarny
r
Liczba rzeczywista
t
Dziesiętna (to samo co d)
y
Binarna (to samo co y)



Przykład użycia
System liczbowy
10
Dziesiętny
10d
Dziesiętny
D9Dh
Szesnastkowy
11101b
Binarny
55q
Ósemkowy
66o
Ósemkowy



Wyrażenia na liczbach całkowitych


MASM pozwala na wykonanie podstawowych operacji matematycznych w trakcie tłumaczenia kodu. Te operacje to:

Operator
Nazwa
Przykład
()
Nawiasy
(-5)
+, -
Liczba dodatnia, ujemna
+5, -5
*, /
Mnożenie, dzielenie
4*5, 12/4
MOD
Reszta z dzielenia
-1 MOD 5
+, -
Dodawanie, odejmowanie
2 + 2, -3 – (-5)



Liczby rzeczywiste


Czyli potocznie zwane liczby zmiennoprzecinkowe. Reprezentowane są przy pomocy liczb dziesiętnych lub szesnastkowych. Format takiej liczby to:

[{+ | - }] liczba.[liczba] [E [{+ | -}] liczba

Przykłady
5.
-4.2
-123.4E+08
33.E9



Znak


Znak to graficzna reprezentacja wartości bajtu. Znaki przechowywane są jako bajty zakodowane w kodzie ASCII. Znaki zapisywane są między pojedynczymi lub podwójnymi cudzysłowami ‘a’ lub „A”

Ciąg znaków


Ciąg znaków to ich sekwencja zapisana między pojedynczymi lub podwójnymi cudzysłowami.

„ABC”

‘DEF’

Można w ciągu znaków korzystać z cudzysłowów natomiast muszą być one różne od tych otaczających cały ciąg. Np:

„Ala ‘ma’ kota”

‘Ala „ma” kota”

Ciąg znaków w pamięci reprezentowany jest jako następujące po sobie bajty.

Zarezerwowane słowa


W assembly występują słowa, które mają określone znaczenie i nie można ich użyć w inny sposób, np. nie można nazwać zmiennej MOV albo INVOKE. Takimi zarezerwowanymi nazwami są.

  • Mnemoniki instrukcji
  • Nazwy rejestrów
  • Dyrektywy asemblera
  • Atrybuty rozmiaru zmiennych. Np. DWORD, WORD, BYTE
  • Operatory
  • Predefiniowane symbole, np @data

Identyfikatory


Programista nazywając stworzony przez siebie element programu, np. Zmienna lub funkcję nadają jej nazwę, która identyfikuje ten element wewnątrz programu. Taki identyfikator musi spełniać kilka warunków, są nimi:

  • Musi zawierać od 1 do 247 znaków
  • Nazwy nie rozróżniają wielkości znaków
  • Pierwszy znak identyfikatoru musi być literą, podkreślenie, @, ? lub $
  • Identyfikator nie może być taki jak jedno z zarezerwowanych słów

Instrukcja


Instrukcja to element programu, który jest wykonywany po jego uruchomieniu. Instrukcje tłumaczone są przez asembler na odpowiadające im kody języka maszynowego. Instrukcja składa się z kilku elementów

  • Etykieta (opcjonalna)
  • Mnemonik instrukcji (wymagany)
  • Operandy (zależy od instrukcji)
  • Komentarz (opcjonalny)

Tak wygląda schemat:

[etykieta:] mnemonik [operandy] [;komentarz]

Etykieta


Etykieta służy do oznaczania miejsca w kodzie. Każdej etykiecie przypisywany jest miejsca, w którym się znajduje.

Mnemonik


Krótka nazwa identyfikująca instrukcję.

Operand


Operandy są to wartości, które przyjmowane są przez instrukcje.

    add eax, 11

W tym przypadku operandami instrukcji addeax oraz 11



Komentarze


Komentarze są bardzo ważne w programowaniu, służą do opisywania działania kodu, podania autora, daty utworzenia kodu oraz innych informacji na temat programu.

Wyróżnia się dwa rodzaje komentarzy:

  • Komentarz w jednej linii. Oznaczany jest on znakiem ; po którym następuje tresć komentarza.
  • Komentarz wieloliniowy. Oznaczany on jest w następujący sposób:

COMMENT !                 Jedna linia komentarza                 Druga linia komentarza
!

Lub

COMMENT &                 Jedna linia komentarza                 Druga linia komentarza
&

Typy podstawowe


Asembler rozróżnia kilka typów podstawowych, które różnią się rozmiarem – mogą przechowywać różną ilość danych.

Typ
Opis
BYTE
8-bitowa liczba naturalna
SBYTE
8-bitowa liczba całkowita
WORD
16-bitowa liczba naturalna
SWORD
16-bitowa liczba całkowita
DWORD
32-bitowa liczba naturalna
SDWORD
32-bitowa liczba całkowita
FWORD
48-bitowa liczba naturalna (far pointer)
QWORD
64-bitowa liczba naturalna
TBYTE
80-bitowa (10 bajtów) liczba naturalna
REAL4
32-bitowa liczba rzeczywista
REAL8
64-bitowa liczba rzeczywista
REAL10
80-bitowa liczba rzeczywista





BYTE i SBYTE


Dane typu BYTE i SBYTE zajmują w pamięci jeden bajt. SBYTE może być dodatni lub ujemny.

Przykłady zdefiniowania takich zmiennych

zmienna1 BYTE 'A'
zmienna2 BYTE 0
zmienna3 BYTE 255
zmienna4 SBYTE -128
zmienna5 SBYTE +30



Wielokrotna inicjalziacja


Grupę bajtów można opisać przy pomocy jednej nazwy. W takim przypadku identyfikator będzie odwoływał się do adresu pierwszej zmiennej natomiast reszta będzie dostępna przez offset. Rozmiar offsetu wynosi tyle ile wielkość zmiennych. W tym przypadku jeden bajt.

lista BYTE 'A', 'B', 'C', 'D'



Offset
Wartość
0000
‘A’
0001
‘B’
0002
‘C’
0003
‘D’



Zdefiniowane ciągi znaków


Jak już wcześniej wspomniałem, ciąg znaków otoczony jest cudzysłowami. W tym przypadku na końcu ciągu występuje jeszcze bit zerowy, który oznacza, że jest to koniec danego ciągu znaków.

tekst1 BYTE "Witaj swiecie!",0
tekst2 BYTE 'Zegnaj swiecie!',0



Nic nie stoi na przeszkodzie, żeby zrobić ciąg znaków, który zajmuje więcej niz jedną linijkę.

lorem BYTE "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
      BYTE "Maecenas gravida porttitor rutrum. Nam metus felis, "
      BYTE "interdum at euismod vitae, volutpat sit amet erat."
      BYTE "Curabitur sed magna dolor. Vivamus risus turpis, egestas"
      BYTE " a placerat luctus, laoreet et augue. Vestibulum ultricies "
      BYTE "magna in efficitur ullamcorper. Donec dapibus mattis interdum."
      BYTE " Phasellus luctus pellentesque suscipit. ", 0Dh, 0Ah, 0



Bajty 0Dh, 0Ah odpowiadają CR/LF czyli przejściu do następnej linii

Operator DUP


Operator DUP inicjalizuje miejsce dla wielu elementów. Przykład utworzenia tablicy 10-elementowej typu WORD zainicjalizowanej do wartości 0.

tablica WORD 10 DUP(0)



Deklarowanie niezainicjalizowanych danych


Dyrektywa .DATA? służy do deklarowania niezainicjalizowanych danych. Podczas definiowania dużej ilości niezainicjalizowanych danych ta dyrektywa sprawia, że program będzie miał mniejszy rozmiar

.data
tablica1 DWORD 10 DUP(0) ;40 bajtów
.data ?
tablica2 DWORD 5000 DUP(?) ;20 000 bajtów, niezainicjalizowane

.data
tablica1 DWORD 10 DUP(0) ; 40 bajtow
tablica2 DWORD 5000 DUP(?) ; 20 000 bajtów, niezainicjalizowane
W tym przypadku program zajmowałby na dysku 20 tyś bajtów więcej






2 komentarze:

  1. Bycie programistą to nie taka prosta sprawa, najpierw trzeba ukończyć studia http://www.wseiz.pl/pl/studia/wydzial-zarzadzania/informatyka , jednak co trzeba przyznać, to że jest to bardzo perspektywiczny kierunek

    OdpowiedzUsuń

Proudly Powered by Blogger.