Architektura komputerów - Składnia programów

1. Składnia programu nierelokowalnego:

.model small          // określenie modelu pamięci (small lub any)
.stack 512              // określenie rozmiaru stosu dla programu
.data                      // blok programu, w którym deklaruje się zmienne
txt1 db     'Hello World',10,13,'$'      
.code                      // blok programu, w którym wpisuje się kod
        mov ax, @data
        mov ds, ax
        mov dx, offset txt1
        mov ah,9h
        int 21h
        mov ah,4ch
        int 21h
end                        // zakończenie programu w sensie struktury

2. Składnia programu relokowanego (czyli takiego, w którym nie trzeba podawać ilości miejsca potrzebnego na program, dane i stos, ponieważ jest to obliczane w trakcie procesu assemblacji oraz konsolidacji).

Program typu exe:

sts segment stack 'stack'     // segment stosu
        db 512 dup(0)            // zarezerwowanie pamięci na stos
sts ends
dane segment        // segment danych
         txt1 db '    Hello World',10,13,'$' // deklaracja zmiennej
dane ends
prog segment       // segment kodu
             assume cs:prog,ds:dane,ss:sts
start:                  // blok programu
             mov ax,seg dane
             mov ds,ax

             mov dx,offset txt1
             mov ah,9
             int 21h

             mov ah,4ch
             int 21h
prog ends
end start

Program typu com:

kod segment
        assume cs:kod,ds:kod
        org 100h
start:      // start programu
         mov ax,cs
         mov ds,ax

         mov dx,offset txt1
         mov ah,9
         int 21h
         mov ah,4ch
         int 21h

         txt1 db     'Hello World',10,13,'$' // deklaracje zmiennych
kod ends
end start


3. Składania programu Windows:

W pliku źródłowym powinny się znaleźć takie elementy jak:
  • format  - określenie formatu pliku wyjściowego (Portable Executable (PE)), czyli taka struktura danych, która zawiera informacje potrzebne systemwi do zarządzania kodem wykonywalnym.
  • include - dyrektywa umożliwiająca dołączenie zewnętrznych zbiorów (np. include 'win32a.inc')
  • sekcje programu (np. section '.text' code readable executable (definicja sekcji kodu programu) lub section '.data' data readable writeable (definicja sekcji danych programu) lub section '.idata' import data readable writeable (definijca sekcji importów) lub section '.rsrc' resource data readable (definicja sekcji zasobów programu))
np.
format PE Console 4.0
entry start
include 'win32a.inc'
section '.text' code readable executable
start:
     push txt1
     call [puts]
     add esp,4
     call [_getch]
     push 0
     call [ExitProcess]
section '.data' data readable writeable
     txt1 db 'Hello World ',0
section '.idata' import data readable writeable
     library msvcrt,'MSVCRT.DLL',\
     kernel32,'KERNEL32.DLL'
     import msvcrt,\
     _getch,'_getch',\
     puts,'puts'
     import kernel32,\
     ExitProcess,'ExitProcess'

4. Słowami kluczowymi w Assemblerze są:
  • rejestry procesora (np. AX, BX)
  • mnemoniki instrukcji  (np. ADD)
  • dyrektywy assemblera (np. DB)
5. Zapis liczb w Assemblerze:
  • w postaci dziesiętnej po liczbie dodajemy literkę d (np. 15d)
  • w postaci binarnej po liczbie dodajemy literkę d (np. 101010b)
  • w postaci ósemkowej po liczbie dodajemy literkę o (np. 657o)
  • w postaci szesnastkowej po liczbie dodajemy literkę h (np. 1Gh)
Liczby ujemne zapisywane są w kodzie U2.

6. Pojedyncze znaki alfanumeryczne zapisuje się w apostrofach (np. 'A'). W pamięci systemu zapisywane są jednak kody ASCII (LISTA!). Zatem 'A' zapisywane jest w systemie jako 65.

7. W zależności od liczby bajtów przeznaczonych na poszczególne dane, w języku asemblera
przewidziano dyrektywy:
  • DB - definicja zmiennej o długości jednego bajtu,
  • DW - definicja zmiennej o długości jednego słowa (2 bajty),
  • DD - definicja zmiennej o długości podwójnego słowa (4 bajty),
  • DQ - definicja zmiennej o długości poczwórnego słowa (8  bajtów)
  • DT - definicja zmiennej o długości 10 bajtów.
8. Definicja zmiennej zawierającej tekst w Windows:

tekst DB ‘To jest tekst’,0

Kod 0 na końcu związany jest z wykorzystywaniem funkcji wyświetlającej łańcuch znaków (funkcja printf z biblioteki msvcrt.dll), która rozpoznaje koniec ciągu znaków, gdy napotka znak NULL.

Można także użyć kodów 10,13 które są kodami ASCII i również oznaczają przejście do następnej linii.

9. Program typu "Hello World":

format PE Console 4.0
entry start
include 'win32ax.inc'

section '.text' code readable executable
start:

cinvoke printf, txt
invoke getch
invoke ExitProcess


section '.data' data readable writeable
txt db 'Hello World !!!',10,13,0

section '.idata' import data readable writeable
     library msvcrt,'MSVCRT.DLL', kernel32,'kernel32.dll'

     import msvcrt,\
     printf,'printf',\
     getch,'_getch'

     import  kernel32,\
     ExitProcess,'ExitProcess'