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'