assembler

background image

Dlaczego Asembler ???

background image

Składnie Asemblerowe

 Składnia Intel-a

Wykorzystywana w większości kompilatorów pod
systemy operacyjne DOS i Windows.


 Składnia AT&T

Składnia opracowana przez AT&T przy okazji
tworzenia pierwszego procesora 32-bitowego
BELLMAC-32A (rok 1980 !!!). Zaczerpnięta z
asemblerów m68k. Głównie wykorzystywana przez
kompilatory Linux’owe.

background image

Składnia Intel-a

(na przykładnie NASM)

Składnia AT&T

(na przykładzie GAS)

section .databeer
db "text„
db 0x0a
db "text2„
db 0x0a
db 0
main:
mov ecx, 100
_loop:
dec ecx
push ecx
push ecx
inc ecx
push ecx
push ecx
push beer
call printf
add esp,16
pop ecx
or ecx, ecx
jne _loop
xor eax,eax
ret

.section .rodata.beer:
.ascii “text".
asciz "text2 „
.text
.global main

main:
mov $100, %ecx
loop:
dec %ecx
push %ecx
push %ecx
inc %ecx
push %ecx
push %ecx
pushl $.beer
call printf
add $16,%esp
pop %ecx
or %ecx, %ecx
jne loop
xorl %eax,%eax
ret

background image

Składnia Intel

 TASM (Turbo assembler)

 MASM (Macro assembler)

 NASM (Netwide assembler)

 FASM (Flat assembler)

 HLA (High level assembly language)

 TALC (Typed assembly language)

 AS86

background image

Składnia AT&T

 GAS (GNU assembler)

 GASP

 YASM

background image

Kompilacja

 TASM
Kompilacja: tasm p1

 powstaje p1.obj

Linkowanie: tlink p1.obj

 powstaje p1.exe

 MASM
Kompilacja: masm p1

 powstaje p1.obj

Linkowanie: link p1.obj

 powstaje p1.exe

 GAS

Np..: gcc -s -o p1 p1.s

background image

Deklaracja segmentu

segmencik SEGMENT ;

 Deklaracja początku segmentu

; W tym miejscu OFFSET = 0

; Tutaj piszemy zawartość segmentu

; maksymalny OFFSET = FFFF h  stąd maksymalny rozmiar segmentu to 64k

; w trybie DOS programy zwykle składają się z 3 segmentów:

; DANYCH
; STOSU
; PROGRAMU

; mają wówczas rozszerzenie EXE

;mogą również składać się z jednego segmentu wówczas mają rozszerzenie

COM

segmencik ENDS ;  Deklaracja końca segmentu

background image

Segment danych

dane SEGMENT

; sposób deklaracji:
;

nazwa_zmiennej typ wartość (wartości)

; rodzaje ‘zmiennych’ :
;

db  bajt

;

dw  słowo

;

dd  podwójne słowo

zmienna1 db 0

;deklaracja 1 bajtu i zainicjalizowanie jego

wartoscią 1

zmienna2 db ?

;deklaracja bajtu bez inicjalizowania wartości

zmienna3 db ?,?,3

;deklaracja 3 komórek pamięci przy czym

wartość

;pierwszej i drugiej jest niezainicjaliwoana a trzeciej

;

zainicjalizowana wartością 3 adresy to kolejno:
zmienna3, zmienna3+1, zmienna3+2

zmienna4 db ‘A’

;deklaracja 1 bajtu zainicjalizowanego wartością 41

hex

; (znak ascii A)

background image

zmienna4 db ‘A’

;deklaracja 1 bajtu

zainicjalizowanego wartością

; 41 hex (znak ascii

A)

zmienna5 db ‘A’,’B’,’C’ ; 3 komórki o wartościach ascii A,B i C, ale

również

; można to zadeklarować tak:

zmienna6 db ‘ABC’

; ale to się nie nadaje do wyświetlania na

ekranie !!!

zmienna7 db ‘ABC$’

; Teraz to się nadaje do wyświetlania jako

ciąg

; znaków - $ informuje funkcje wyświetlające

że jest

; to konieć stringa. Jak by to było napisane

tak:

zmienna8 db ‘ABC’

; jak by było tak to następna zmienna:

zmienna9 db ‘DEF$’

; wyświetliła by się również czyli się wys:

ABCDEF

zmienna 10 db 10,13,’$’

; zmiana linii

zmienna 11 dw 0

; zmienna 16-bit

zmienna 12 dd 0

; zmienna 32-bit

; na początek wystarczy

dane ENDS

background image

Segment stosu

stosik SEGMENT stack

;stack od razu informuje kompilator że to jest segment stosu

db 256 dup(?) ;rozmiar stosu

stosik ENDS ;Aha nazwa nie może być stos bo jest taka instrukcja

background image

Segment programu

program SEGMENT
ASSUME CS:program, DS:dane, SS:stosik

; przyporządkowanie nazw poszczególnych
; segmentów do rejestrów

start:

; przesunięcie adresowe w tym segmencie

MOV ax, SEG dane

; mov to instrukcja przesłania do AX zwartości

adresu segmentu

; danych

MOV ds., ax

; który następnie ładowany jest do DS-a. Wydaje się

oczywiste

MOV ah,4Ch

; Tu musimy zatrzymać się dłużej

INT 21h

program ENDS
END start

; Koniec programu

background image

Tryby adresowania

background image

Adresacja rejestrowa

000000010001011

1

                        

000000000010001

1

 000000000010001

000000000010001

1

 MOV AX, BX

BX

AX  

Adresowanie natychmiastowe

MOV  AX, 20  ( MOV  AX, 14h)

0000000000010000

 

 

00000000010100

AX  

background image

Adresowanie bezpośrednie

000000010001011

1

                        

000000000010001

1

 000000000010001

000000000010001

1

AX

Tablica  

 MOV AX, Tablica

Adresowanie pośrednie poprzez rejestr bazowy

MOV BX, offset Tablica (LEA BX, Tablica)
MOV AX, [BX]

MOV BX, offset Tablica (LEA BX, Tablica)
MOV DI, 1
MOV AX, [BX+DI]

background image

Instrukcje warunkowe

background image

Instrukcja CMP

cmp bx,ax

; OPERACJA ODEJMOWANA BEZ WYNIKU – ustawia jedynie
; słowo stanu

Rejestr znaczników (flag register)

Dopuszczalna postać instrukcji:

cmp rejestr,rejestr;
cmp rejestr,pamięć;
cmp pamięć,rejestr;
cmp rejestr,dana natychmiastowa
cmp pamięć,dana natychmiastowa

P – flaga parzystości
A – flaga przeniesienia pomocniczego
Z – flaga „zera”, przyjmuje 1 kiedy wynik
operacji jest 0
S – znak
O – znacznik przeniesienia warunkowego
C- carry – przepełnienie bez znaku

background image

Instrukcje skoków warunkowych

opis słówny

liczby bez znaku

liczby ze znakiem

gdy X1 większy

ja (jnbe)

jg (jnle)

gdy X1 mniejszy

jb (jnae, jc)

jl (jnge)

gdy równe

je (jz)

je (jz)

gdy nierówne

jne (jnz)

jne (jnz)

gdy większy lub równy

jae (jnb, jnc)

jge (jnl)

gdy mniejszy lub równy

jbe (jna)

jle (jng)

Instrukcja skoku bezwarunkowego

JMP Etykieta

background image

Pętle LOOP

mov cx,10 ; cx jest licznikiem petli

petla:

.
.
.

loop petla ; cx = cx -1, jesli cx nie jest 0, nastepuje skok do petla

LOOPE

ETYKIETA

LOOPZ

ETYKIETA

LOOPNE ETYKIETA
LOOPNZ ETYKIETA

background image

Podstawowe Operacje
arytmetyczne

background image

Mnożenie

mul cl ; AX := AL*CL
mul bx ; DX:AX := AX*BX

Dzielenie

div cl ; AL := (AX div CL), AH := (AX mod CL)
div bx ; AX := (DX:AX div BX), DX := (DX:AX mod
BX)

background image

Dodawanie

Bez przeniesienia:

add al, bl ; AL=AL+BL
add dx, bx ; DX=BX+DX

z przeniesieniem:

adc al, bl ; AL=AL+BL+C
adc dx, bx ; DX=BX+DX+C

Zastosowanie przy długich dodawaniach:

add al, bl ; AL=AL+BL
adc ah, bh ; AH=AH+BH+C ;  add ax,

bx

background image

Odejmowanie

Bez pożyczki:

sub al, bl ; AL=AL-BL
sub dx, bx ; DX=BX-DX

z pożyczką:

sbb al, bl ; AL=AL-BL-C
sbb dx, bx ; DX=BX-DX-C

Zastosowanie przy długich odejmowaniach:

sub al, bl ; AL=AL-BL
sbb ah, bh ; AH=AH-BH-C ;  sub ax,

bx

background image

Inkrementacja i dekrementacja

Inkrementacja:

inc al ; AL=AL + 1
inc dx ; DX=DX + 1

Dekrementacja:

dec al ; AL=AL - 1
dec dx ; DX=DX - 1

background image

Przesunięcia

background image

Przesunięcia SHR i SHL

Wywołanie:

SHR AX, 1 ; przesunięcie rejestru
AX o ; jeden w prawo

SHL AX, 1 ; przesunięcie rejestru
AX o ; jeden w lewo

0 0 0 0 0 0 0 0

CY

0

0 0 0 0 0 0 0 0

CY

0

background image

Przesunięcia RCL i RCL

Wywołanie:

RCR AX, 1 ; przesunięcie rejestru
AX o ; jeden w prawo

RCL AX, 1 ; przesunięcie rejestru
AX o ; jeden w lewo

0 0 0 0 0 0 0 0

CY

0 0 0 0 0 0 0 0

CY

background image

Przesunięcia ROL i ROL

Wywołanie:

ROR AX, 1 ; przesunięcie rejestru
AX o ; jeden w prawo

ROL AX, 1 ; przesunięcie rejestru
AX o ; jeden w lewo

0 0 0 0 0 0 0 0

CY

0 0 0 0 0 0 0 0

CY

background image

Operacje logiczne

background image

Negacja Logiczna

Wywołanie:

NOT al

; 8 bit

NOT ax

; 16 bit

NOT 0 = 1
NOT 1 = 0

Iloczyn Logiczny

Wywołanie:

AND al, 0000 0001 b

; 8 bit

AND ax, 00FFh

; 16 bit

AND 0,0 =
0
AND 0,1 =
0
AND 1,0 =
0
AND 1,1 =
1

background image

Suma Logiczna

Wywołanie:

OR al, 0000 0001 b

; 8

bit
OR ax, 00FFh

; 16 bit

OR 0,0 = 0
OR 0,1 = 1
OR 1,0 = 1
OR 1,1 = 1

Operacja eXclusiveOR (XOR)

Wywołanie:

XOR al, 0000 0001 b

; 8 bit

XOR ax, ax

; 16 bit

XOR 0,0 =
0
XOR 0,1 =
1
XOR 1,0 =
1
XOR 1,1 =
0

background image

Koprocesor arytmetyczny

background image

Operacje ładowania i wyciągania danych

FLD/FILD [mem] - załaduj liczbę
rzeczywistą/całkowitą z

pamięci. Dla liczby

rzeczywistej 32, 64 lub 80

bitów. Dla

całkowitej - 16, 32 lub 64 bity
FST [mem] - do pamięci idzie liczba ze st(0).
FSTP [mem] - "store & pop" - zapisz st(0) w
pamięci i zdejmij je ze stosu. Znaczy to tyle, że
st(1) o ile istnieje, staje się st(0) itd. każdy
rejestr cofa się

o 1.

FIST [mem] - ewentualnie obciętą do całkowitej
liczbę z

st(0) zapisz do pamięci.

FISTP [mem] - FIST ze zdjęciem ze stosu.
FXCH st(i) - zamień st(0) z st(i).

background image

Operacje pobierania stałych

FLDZ - załaduj zero. st(0) = 0.0

FLD1 - załaduj 1. st(0) = 1.0
FLDPI - załaduj pi
FLDL2T - załaduj log2(10)
FLDL2E - załaduj log2(e)
FLDLG2 - załaduj log(2)=log10(2)
FLDLN2 - załaduj ln(2)

background image

Operacje arytmetyczne

FADD [mem]       st = st + [mem]
FADD st(0), st(i)       st = st + st(i)
FADD st(i),st(0)       st(i) = st(i) + st(0)
FADDP st(i), st(0)       st(i) = st(i) + st(0) & pop
FADDP  FADDP st(1),st(0)

FIADD [mem]       st = st + [mem]

Dodawanie

background image

Odejmowanie

FSUB [mem]       st = st - [mem]
FSUB st(0), st(i)       st = st - st(i)
FSUB st(i), st       st(i) = st(i) - st
FSUBP st(i), st      

st(i) = st(i) - st(0) & pop

FSUBP 

FSUBP st(1), st(0)

FISUB [mem]       st = st - [mem]
FSUBR [mem]       st = [mem] - st(0)

Inne operacje odejmowania: FSUBRP st(i)_st ,
FSUBRP, FISUBRP [mem]

background image

Mnożenie

FMUL [mem]       st = st * [mem]
FMUL st(0), st(i)      st = st * st(i)
FMUL st(i), st(0)      st(i) = st(i) * st(0)
FMULP st(i), st(0)   

st(i) = st(i) * st(0) & pop

FMULP

 FMULP st(1),st(0)

FIMUL [mem]       st = st * [mem]

background image

Dzielenie

FDIV [mem]       st = st / [mem]
FDIV st, st(i)       st = st / st(i)
FDIV st(i), st       st(i) = st(i) / st
FDIVP st(i), st      

st(i) = st(i) / st & pop

FDIVP 

FDIVP st(1), st

FIDIV [mem]       st = st / [mem]
FDIVR [mem]       st = [mem] / st

Inne operacje dzielenia: FDIVRP st(i)_st , FDIVRP,
FIDIVRP [mem]

background image

Inne operacje arytmetyczne

FABS

 st = abs(st)

FCHS        st = -st
FSQRT

 st = SQRT(st)

FPREM        st = st mod st(1)
FRNDINT      st = (int) st

FSIN, FCOS, FPTAN, FPATAN

 podstawowe instrukcje

trygonometryczne

background image

Operacje porównań

FCOM st(n)

- porównaj st(0) z st(n) (lub zmienną

w

pamięci) bez zdejmowania st(0) ze

stosu FPU
FCOMP st(n)

-porównaj st(0) z st(n) (lub zmienną

w

pamięci) i zdejmij st(0)

FCOMPP

- porównaj st(0) z st(1) i zdejmij oba

ze

stosu

FICOM [mem]

- porównaj st(0) ze zmienną

całkowitą 16-

lub 32-bitową w pamięci

FICOMP [mem]

- porównaj st(0) ze zmienną

całkowitą 16-

lub 32-bitową w pamięci,

zdejmij st(0)
FCOMI st(0), st(n)

- porównaj st(0) z st(n) i ustaw

flagi

procesora

FCOMIP st(0), st(n)

- porównaj st(0) z st(n) i ustaw

flagi

procesora, zdejmij st(0)

background image

Operacje sterujące

FINIT/FNINIT - inicjalizacja FPU. Litera "N" oznacza, aby nie brać
pod

uwagę ew. niezałatwionych wyjątków.

FLDCW, FSTCW/FNSTCW - Load/Store control word - zapisuje 16
kontrolnych bitów do pamięci, gdzie można je zmieniać np. aby
zmienić sposób zaokrąglania liczb.
FSTSW/FNSTSW - zapisz do pamięci / rejestru AX słowo statusu
(FPU)
FCLEX/FNCLEX - wyczyść wyjątki
FLDENV, FSTENV/FNSTENV – wczytaj / zapisz środowisko (rejestry

stanu, kontroly i kilka innych, bez rejestrów danych).

Wymaga 14 albo 28 bajtów pamięci, w zależności od trybu
pracy procesora

(rzeczywisty/DOS lub chroniony -

Windows/Linux).
FRSTOR, FSAVE/FNSAVE - jw., tylko że z rejestrami danych.
Wymaga 94 lub 108 bajtów w pamięci, zależnie od trybu
procesora.
FINCSTP, FDECSTP - zwiększ/zmniejsz wskaźnik stosu - przesuń
st(0) na

st(7), st(1) na st(0) itd. oraz w drugą stronę,

odpowiednio.
FFREE - zwolnij podany rejestr danych
FNOP - no operation. Nic nie robi, ale zabiera czas.
WAIT/FWAIT - czekaj, aż FPU skończy pracę. Używane do
synchronizacji

z CPU.


Document Outline


Wyszukiwarka

Podobne podstrony:
Assembler ENG
Assembly Language for Kids Commodore 64 Addendum
P000718 A Eng Vertical shaft assembly
M001882 B Eng Lower assembly
Molecular Self Assembly
arm assembly
bushwarbler assembly
Ch18 Assemble Complex Models
P000724 A Eng Lower assembly
assembler model, Programowanie
ARTICLE BRAKES PEDAL ASSEMBLY SERVICE
Atmel AVR Assembler id 71678 Nieznany (2)
Assembler Intel Code Table
P000720 D Eng Upper assembly
Basics of Assembler
10 x shed outline assembly and plan
Asembler wykład 16-10-2000, Zaczynamy (pracę) z programem Turbo Assembler, Rozdział 1
KM W assembly ENG stud mod
assembly

więcej podobnych podstron