jeszcze

Transkrypt

jeszcze
INSTRUKCJE
Instrukcje przeniesienia: mov, lea, les , push, pop,
pushf, popf
Instrukcje konwersji: cbw, cwd, xlat
Arytmetyczne instrukcje: add, inc sub, dec, cmp,
neg, mul, imul, div, idiv
Logiczne instrukcje: and, or, xor, not, shl, shr, rcl, rcr
Instrukcje wejścia - wyjścia: in, out
Instrukcje łańcuchowe: movs, stos, lods
Instrukcje kontroli toku programu: jmp, call,
ret,conditional jumps
Operacje na bitach: clc, stc, cmc.
Instrukcje przeniesienia
Funkcja: kopiowanie dannych od jednego
miejsca do drugiego
Instrukcje:
Mov
Xchg
lds, les, lfs, lgs, lss
lea,
push, pusha, pushad, pushf, pushfd, pop,
popa, popad, popf, popfd
lahf, sahf
XCHG operand1, operand2
Działanie – zamienia wartości
dwóch operandów
Specyfikacje:
xchg reg, mem
xchg reg, reg
xchg ax, reg16
xchg eax, reg32 ;dla 80386 i
wyższej
LxS dest, source
Działanie: ładuje 32b operand (AL,np.) równocześnie
w reg.segmentowym i reg.przesun.
Specyfikacje:
lds reg16, mem32
les reg16, mem32
lfs reg16, mem32; dla 80386 i wyższej
lgs reg16, mem32; dla 80386 i wyższej
lss reg16, mem32; dla 80386 i wyższej
LEA (Load Effective
Address)
 Forma: lea dest, source
 Działanie: ładuje AE do rejestru docelowego
 Specyfikacja:
lea reg16, mem
 lea reg32, mem

 Przykłady:



lea ax, [bx] (=mov ax, bx) lea bx, 3[bx](=add bx,3)
lea ax, 3[bx](=mov ax, (bx+3) - nie dozwolone)
lea bx, 4[bp+si]
LAHF i SAHF
 lahf (load ah from flags) – ładuje do
AH zawart. rejestru znacznikowego
 sahf (store ah into flags) - ładuje do
rejestru znacznikowego zawart. AH
INSTRUKCJE KONWERSJI
CBW – convert byte to word (AL->AX)
CWD – convert word to double word (AX->DX:AX)
CWDE – convert word to double word (AX->EAX)
CDQ – convert 32b to 64b (eax->EDX:EAX)
XLAT – przetwarza zawart. AL wg. tablica w pam.
INSTRUKCJE ARYTMETYCZNE
 Dodawanie: ADD, ADC, INC, XADD, AAA DAA
 Odejmowanie: SUB, SBB, DEC, AAS, DAS
 NEG
 Mnożenie: MUL, IMUL, AAM
 Dzielenie: DIV, IDIV, AAD
 CMP
Dodawanie
 ADD (ADC):add dest, src dest := dest + src
adc dest, src dest := dest + src + CF






add reg, reg
add reg, mem
add mem, reg
add reg, immediate data
add mem, immediate data
add eax/ax/al, immediate data
 INC: inc mem inc reg8/16
Przykłady
 ; J:= K + M
mov ax, K
add ax, M
mov J, ax
 ; J := K + M + N + P
mov ax, K
add ax, M
add ax, N
add ax, P
mov J, ax
Odejmowanie
 SUB (SBB):SUB dest, src dest := dest - src
sbb dest, src dest := dest - src - C
sub reg, reg
 sub reg, mem
 sub mem, reg
 sub reg, immediate data
 sub mem, immediate data
 sub eax/ax/al, immediate data
 DEC: dec mem inc reg8/16

 ; J := K - J
mov ax, K
sub ax, J
mov J, ax
Przykłady
;
;? mov ax, J
sub ax, K
 ; J := J - (K + M) (lub J := J - K - M)
mov ax, K ; AX := K + M
add ax, M
sub J, ax ; J := J - (K + M)
;ALBO:
mov ax, J
sub ax, K
sub ax, M
mov J, ax
NEG
 NEG dest dest := 0 – dest
 Specyfikacja:
neg reg/mem
 Przykady:
; J := - J
neg J
; J := -K
mov ax, K
neg ax
mov J, ax
Mnożenie (MUL, IMUL)
mul src16/8
imul src16/8
imul dest, src1, imm_src
imul dest, imm_src
imul dest, src
acc32/16:= acc16/8 * src16/8
dest := src1 * imm_src
dest := dest * imm_src
dest := dest * src
 Speczfikacje:




mul reg/mem
imul reg/mem
imul reg, reg/mem, immediate
imul reg, immediate/reg/mem
Przykłady
;***********
mov ax, J
add ax, K
sub ax, M
mul L
(J+K-M)*L
*************
;********** ((J*7 + K) * 6 + M) * 2 ***********
imul bx, 7
add bx, K
imul bx, 6
add bx, M
add bx, bx ;BX := BX * 2
Dzielenie (DIV, IDIV)
div src; AX(AL):=DX:AX(AX)/src
idiv src; AX(AL):=DX:AX(AX)/src
 Specyfikacje:
 div reg/mem
 idiv reg/mem
16(8)
16(8)
!reszta: DX(AH)
!reszta: DX(AH)
; ********** J := (K *M )/P *********
mov ax, K
imul M ; 32 bit resultat - w DX:AX!!!
idiv P
mov J, ax
?
?
?
?
Porównanie
 CMP dest, src
(dest - src)
 Speczfiakcja:
cmp reg, reg
cmp reg, mem
cmp mem, reg
cmp reg, immediate data
cmp mem, immediate data
cmp eax/ax/al, immediate data
Ustawianie znaczników
Z (wynik zerowy):
Oprnd1 = Oprnd2
C (przeniesienie):
Oprnd1 < Oprnd2 (C=1)
Oprnd1 >= Oprnd2 (C=0)
INSTRUKCJE LOGICZNE
 AND, OR, XOR
instr dest, source
 NOT
 SHL/SAL, SHR, SAR, SHLD, and
SHRD
 RCL, RCR, ROL, ROR
 TEST
Specyfikacja dla AND, OR, XOR
and
and
and
and
and
and
reg, reg
mem, reg
reg, mem
reg, immediate data
mem, immediate data
eax/ax/al, immediate data
AND
Działanie:
0 and 0 = 0
0 and 1 = 0
1 and 0 = 0
1 and 1 = 1
 Zastosowanie – logiczne mnożenie,
zerowanie bitów, sprawdzenie bitów:
and al, 5
and Liczba,0f0h
and dx, maska
OR
 Działanie:
0 or 0 = 0
0 or 1 = 1
1 or 0 = 1
1 or 1 = 1
 Zastosowanie – logicznasuma, ustawianie
bitów, sprawdzenie bitów:
or dl, 7
or Liczba,01101000b
or dx, 80h
XOR (exclusive OR)
 Działanie:
0 xor
0 xor
1 xor
1 xor
0=0
1=1
0=1
1=0
 Zastosowanie – zerowanie, sprawdzenie
bitów:
xor al, al
xor Liczba,0f0h
xor dx, maska
NOT
 Działanie:
not 0 = 1
not 1 = 0
 Specyfikacja:
not reg
not mem
Test
Działa tak samo, jak AND, tylko
nie wpisuje wynik operacji do
pierwszego operanda
SHR/L, SAR/L, SHRD/L
SHL dest, count
shr dest, count
PRZYKŁADY
ZASTOSOWANIE
sal dest, count
sar dest, count
Specyfikacja
shl
shl
shl
shl
shl
shl
reg, 1
mem, 1
reg, imm
mem, imm
reg, cl
mem, cl
RCL/R, ROR/L
 ROL dest, count
RCL dest, count
ROR dest, count
RCR dest, count
SPECYFIKACJA:
rcl reg, 1
rcl mem, 1
rcl reg, imm (2)
rcl mem, imm (2)
rcl reg, cl
rcl mem, cl
SHLD / SHRD
shld operand1, operand2, immediate
shld operand1, operand2, cl
shrd operand1, operand2, immediate
shrd operand1, operand2, cl
Zadania
 Podaj zawartość DX po:
mov dh, 01101110b
or dh, 0f3h
mov cl, 15
ror cl,3
xor dh, cl
mov dl, cl
Skoki
Skoki bezwarunkowe
JMP target
JMP etykieta/wskaźnik adresu/ reg16
Przykład:
.model small
.data
napis1 db 'pierwszy $'
napis2 db 'drugi $'
.code
start:
mov ax,seg napis1
mov ds,ax
mov ah,9
dx,napis1
int 21h
jmp przeskocz
mov ah,9
mov dx,offset napis2
int 21h
przeskocz:
mov ah,4ch
int 21h
end start
end
Skoki warunkowe i instrukcje
porównawcze
.model small ;
ZGADNIJ CO TEN PROGRAM ROBI!
.data
liczba db 16d
komunikat1 db 'Podana liczba spełnia założenia ',13,10,'$'
komunikat2 db 'Podana liczba nie spełnia założenia ',13,10,'$'
.code
start:
mov ax,seg liczba
mov ds,ax
mov al,liczba
;sprawdzenie ????
test al,1
jnz nie_spelnia
; porównanie z liczba 6
cmp al, 6
jb nie_spelnia
cmp al, 15
jae nie_spelnia; teraz liczba spełnia podane warunki ??? JAKIE???
; wypisanie komunikatu
mov ah,9
mov dx,offset komunikat1
INT 21h
jmp koniec
nie_spelnia:
mov ah,9
mov dx,offset komunikat2
int 21h
koniec:
mov ah,4ch
int 21h
end start
end
;PROGRAM WYLICZA SUMĘ OT A DO B
.model small
.stack 24h
.486 ;udostępnienie instrukcji procesora 486
. data
liczba
dd 0 ; liczba do wypisania
dzielnik
dd 10
licznik
dw 0
napis
db '???????????????? : $'
.code
start:
mov ax,seg liczba ; = MOV AX, @DATA
mov ds,ax
xor ebx,ebx ; w ebx będzie przechowyw. SUMĘ
mov edx,4 ; A - ’Początek sumowania’
petla1:
cmp dx,122 ; B - ’Koniec sumowania’
ja wyjscie
;wyjście jeżeli dx>122
add ebx,edx
inc dx
; JAK MYŚLIŚ PO CO TO?
inc dx
; I TO 2 RAZY!.....
jmp petla1
wyjscie:
mov liczba,ebx
;przekopiowanie sumy do liczba
call wypisz_liczbe ; proc. wypisująca liczbę
;** wyjscie z programu **
mov ah,4ch
int 21h
wypisz_liczbe proc
pushad
;*** odlozenie na stos cyfr liczby ***
mov eax,liczba
; przenieść liczbę do eax
petla:
mov edx,0
div dzielnik ;dzieli edx:eax przez 32-u bitowy
; dzielnik .. reszta w edx wynik w eax
push dx ;reszta na stos (reszta z przedziału 0..9)
inc licznik ; zliczanie cyfr liczby
cmp ax,0 ;czy zakończyć dzielenie (wynik=0 to
tak)
jne petla
;*** wypisanie liczby ***
mov ah,9
mov dx,offset napis
int 21h
mov cx,licznik
; ile cyfr do wypisania
wypisz:
pop dx
add dx, 48
mov ah, 2
int 21h
loop wypisz
popad
ret
wypisz_liczbe ENDP
end start
Pętle w asemblerze
Pętla typu FOR...
Pętla typu while
LOOP(E/CX, etykieta)
..........
et1:
mov (e)cx, liczba
etykieta1:
push (e)cx
................
pop (e)cx
loop etykieta1
Pętla typu repeat...until
Skok:
................
cmp al,wynik
jne Skok
...............
.....
skok:
......
cmp ax, 1
je skok
jmp et1
OPERACJE ZE
ZNACZNIKACH
 AH i Rejestr Znacznikowy (instrukcje):
 LAHF (Load AH from Flags)
 SAHF (Store AH into Flags)
 Ustawianie i zerowanie znaczników
 CLD– wyzerowanie znacznika kierunku;
 STD– ustawianie znacznika kierunku;
 STC – ustawianie znacznika przeniesienia;
 CLC –wyzerowanie znacznika przeniesienia;
 CMC – migotanie znacznika przeniesienia
 STI – ustawienie znacznika przerwania(zezwolenie na
przerwanie)
 CLI –zatrzymanie przerwania;

Podobne dokumenty