Transcript Riistvarapõhine programmeerimine
Slide 1
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 2
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 3
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 4
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 5
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 6
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 7
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 8
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 9
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 10
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 11
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 12
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 13
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 14
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 15
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 16
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 17
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 18
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 19
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 20
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 21
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 22
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 23
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 24
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 25
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 26
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 27
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 28
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 29
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 30
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 31
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 32
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 33
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 34
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 35
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 36
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 37
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 38
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 39
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 40
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 41
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 42
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 43
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 44
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 45
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 46
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 47
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 48
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 49
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 50
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 51
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 52
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 53
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 54
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 55
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 56
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 57
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 58
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 2
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 3
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 4
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 5
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 6
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 7
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 8
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 9
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 10
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 11
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 12
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 13
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 14
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 15
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 16
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 17
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 18
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 19
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 20
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 21
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 22
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 23
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 24
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 25
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 26
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 27
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 28
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 29
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 30
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 31
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 32
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 33
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 34
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 35
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 36
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 37
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 38
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 39
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 40
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 41
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 42
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 43
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 44
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 45
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 46
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 47
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 48
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 49
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 50
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 51
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 52
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 53
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 54
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 55
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 56
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 57
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58
Slide 58
Riistvarapõhine
programmeerimine
Loeng 6
Andmeteisalduskäsud
Biti- ja stringikäsud
Sisend/väljundkäsud
Siirdekäsud
Andmeedastuskäsud
Andmete laadimine
Aadresside laadimine
Bit-käsud
Stringikäsud
22/07/2004
ID218 Riistvaralähedane
programmeerimine
2
Andmete laadimine I
Mov
Xchg
Push
Pop
22/07/2004
A, B
A, B
A
A
ID218 Riistvaralähedane
programmeerimine
3
Mov I
Mov
A, B
mov
mov
mov
mov
mov
mov
mov
reg, reg
mem, reg
reg, mem
reg, immidiate data
mem, immidiate data
segreg, reg
segreg, mem
22/07/2004
ID218 Riistvaralähedane
programmeerimine
4
Mov II
22/07/2004
ID218 Riistvaralähedane
programmeerimine
5
Mov III
D
bit encoding
D=0
reg
-> mem
D=1
mem
-> reg
22/07/2004
ID218 Riistvaralähedane
programmeerimine
6
Mov IV
W bit encoding
W=0
A, B
-> 8 bit
W=1
A, B
-> 16 bit
22/07/2004
ID218 Riistvaralähedane
programmeerimine
7
Mov V
REG bit encoding
Reg
W=0
W=1
000
AL
AX
001
BL
BX
010
CL
CX
011
DL
DX
100
AH
SP
101
BH
BP
110
CH
SI
111
DH
DI
22/07/2004
ID218 Riistvaralähedane
programmeerimine
8
Mov VI
Mod bit encoding
Mod Meaning
00
The r/m field denotes a register indirect memory addressing mode or a
base/indexed addressing mode (see the encodings for r/m) unless the r/m
field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote
displacement-only (direct) addressing.
01
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is an eight bit signed displacement following the mod/reg/rm
byte.
10
The r/m field denotes an indexed or base/indexed/displacement addressing
mode. There is a 16 bit signed displacement (in 16 bit mode) following the
mod/reg/rm byte .
11
The r/m field denotes a register and uses the same encoding as the reg field
22/07/2004
ID218 Riistvaralähedane
programmeerimine
9
Mov VII
R/M Field Encoding
R/M
Addressing mode (Assuming MOD=00, 01, or 10)
000
[BX+SI] or DISP[BX][SI] (depends on MOD)
001
[BX+DI] or DISP[BX+DI] (depends on MOD)
010
[BP+SI] or DISP[BP+SI] (depends on MOD)
011
[BP+DI] or DISP[BP+DI] (depends on MOD)
100
[SI] or DISP[SI] (depends on MOD)
101
[DI] or DISP[DI] (depends on MOD)
110
Displacement-only or DISP[BP] (depends on MOD)
111
[BX] or DISP[BX] (depends on MOD)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
10
Mov VIII
Mov
Mov
Mov
Mov
Mov
Mov
Mov
Mov
reg8, reg8
reg16, reg16
reg16, mem
mem,
reg16
reg16, imm.data
mem16, imm.data
segreg,reg16
segreg,mem
22/07/2004
2
2
2
2
4
4
2
2
baiti
baiti
baiti
baiti
baiti
baiti
baiti
baiti
ID218 Riistvaralähedane
programmeerimine
2
2
8+mem
9+mem
4
10+mem
2
8+mem
11
Mov IX
Operandi suurus – byte/word:
mov [bx], 0
; 0 ->
[bx]
mov
mov
byte ptr [bx], 0
word ptr [bx], 0
Segment registers:
mov
ax, 40h
mov
es, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
12
Andmete laadimine II
xchg
A, B
xchg
xchg
xchg
reg, mem
reg, reg
ax, reg
2 baiti
2 baiti
1 bait
Lippud: ei mõjuta
22/07/2004
ID218 Riistvaralähedane
programmeerimine
13
Andmete laadimine III
push
A
push reg16
push segreg
A
->
pinusse
push memory
pushf
Algoritm:
SP := SP - 2
[SS:SP] := 16 bit operand (store result at
location SS:SP.)
22/07/2004
ID218 Riistvaralähedane
programmeerimine
14
Andmete laadimine IV
pop
A
pop reg16
pop segreg
A
<-
pinust
pop memory
popf
Algoritm:
16-bit operand := [SS:SP]
SP := SP + 2
22/07/2004
ID218 Riistvaralähedane
programmeerimine
15
Adressite laadimine I
lds
reg16, mem32
Agoritm:
reg16
ds
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
16
Adressite laadimine II
les reg16, mem32
Algoritm:
reg16
es
22/07/2004
:= [mem32]
:= [mem32 + 2]
ID218 Riistvaralähedane
programmeerimine
17
Adressite laadimine III
lea
reg16, mem
Lea ax, 1234h
Mov ax, 1234h
22/07/2004
1234h
1234h
ID218 Riistvaralähedane
programmeerimine
->
->
ax
ax
18
Adressite laadimine IV
lea
reg16, mem
lea
bx
ax, [bx]
; mov
ax,
lea
3
bx, 3[bx]
; add
bx,
lea
3
ax, 3[bx]
; add
bx,
; mov
22/07/2004
ID218 Riistvaralähedane
programmeerimine
ax, bx
19
Adressite laadimine V
lea
reg16, mem
lea bx, 128[bp+di]
mov al,[bx]
mov al,[bx]
mov al,128[bp+di]
mov al,128[bp+di]
22/07/2004
ID218 Riistvaralähedane
programmeerimine
20
Bit-käsud
test A, B
test
bt
A, index
bit test
btc
A, index
test and
complement
btr
A, index
test and
reset
bts
A, index
test and set
bsf
A, B
bit scan
ID218 Riistvaralähedane
22/07/2004
programmeerimine
21
forward
Test
test
Lipud:
Cf
->
Of ->
Zf
->
Sf
->
Pf
->
Af
->
22/07/2004
A, B
A&B
->
FR
0
0
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
vastavalt tulemusele
ID218 Riistvaralähedane
programmeerimine
22
BT, BTS, BTR, BTC
Bt
ax, 6
Bx = 33
Bt A, bx
22/07/2004
; bit6
-> Cf
; bit 1 of A+4
-> Cf
; effective address + index/8
ID218 Riistvaralähedane
programmeerimine
23
BSF, BSR I
bsf
bsr
A, B
A, B
; 0 -> 15
; 15 -> 0
Kui leitud “1”:
Zf = 0, B = Bit index
Kui ei leitud_
Zf = 1, B - määramata
22/07/2004
ID218 Riistvaralähedane
programmeerimine
24
BSF, BSR II
Kuidas leida “0”:
1.
2.
3.
Kopeerida operand
Inverteerida operand
not
Otsida “1”
bsr
22/07/2004
ID218 Riistvaralähedane
programmeerimine
mov
bsf,
25
Set – käsud I
set** reg8
set** mem8
Set**
A
kui ** = true, A = 1
kui ** = false, A = 0
22/07/2004
ID218 Riistvaralähedane
programmeerimine
26
Set – käsud II
SET** Instructions That Test Flags
22/07/2004
ID218 Riistvaralähedane
programmeerimine
27
Set – käsud III
SET** Instructions for Unsigned Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
28
Set – käsud IV
SET** Instructions for Signed Comparisons
22/07/2004
ID218 Riistvaralähedane
programmeerimine
29
Set – käsud V
Bool
Bool
A, B
mov
cmp
setle
22/07/2004
:=
A
<= B
byte variable
signed integer
ax, A
ax, B
Bool
ID218 Riistvaralähedane
programmeerimine
30
Set – käsud VI
Bool := ((A <= B) and (D = E)) or (F <> G)
mov
ax, A
cmp
ax, B
setle
bl
; A
<=
B
mov
ax, D
cmp
ax, E
sete
bh
; D
=
E
and
bl, bh
; (A <= B) and (D = E)
mov
ax, F
cmp
ax, G
setne
bh
; F
<>
G
or
bl, bh
; *
or
*
mov
Bool, bh
22/07/2004
ID218 Riistvaralähedane
programmeerimine
31
String-käsud I
movs
lods
stos
scas
cmps
ins
outs
22/07/2004
(move string)
(load string element into the accumulator)
(store accumulator into string element)
(Scan string and check for match against
the value in the accumulator)
(compare two strings)
(input a string from an I/O port)
(output a string to an I/O port
ID218 Riistvaralähedane
programmeerimine
32
String-käsud II
rep
repz
repe
repnz
repne
22/07/2004
(repeat a string operation)
(repeat while zero)
(repeat while equal)
(repeat while not zero)
(repeat while not equal)
ID218 Riistvaralähedane
programmeerimine
33
String-käsud II
movs{size - b,w}:
es:[di] :=
ds:[si]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
34
String-käsud III
cmps{size - b,w}:
cmp
ds:[si], es:[di]
if direction_flag = 0 then
si := si + size;
di := di + size;
else
si := si - size;
di := di - size;
endif;
ID218 Riistvaralähedane
22/07/2004
programmeerimine
35
String-käsud IV
lods{size - b,w}:
ax/al :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
36
String-käsud V
stos{size - b,w}: es:[di] :=
ax/al
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
37
String-käsud VI
scas{size - b,w}: cmp ax/al,
es:[di]
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
38
String-käsud VII
ins{size b,w}: es:[di] :=
port(dx)
if direction_flag = 0 then
di := di + size;
else
di := di - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
39
String-käsud VIII
outs{size - b,w}: port(dx) :=
ds:[si]
if direction_flag = 0 then
si := si + size;
else
si := si - size;
endif;
22/07/2004
ID218 Riistvaralähedane
programmeerimine
40
Sisend/väljundkäsud I
in
input
in
out
out
ax/al, port
ax/al, dx
port, ax/al
dx, ax/al
0
<
port
Ei mõjuta lipud
22/07/2004
;
<
; output
255
ID218 Riistvaralähedane
programmeerimine
41
Sisend/väljundkäsud II
Read keyboard from port 60h
in
al, 60h
; Read
Sent ‘data’
mov
mov
out
22/07/2004
to printer port 378h
dx, 378h
; port to dx
al, data
; data to al
dx, al
; send
ID218 Riistvaralähedane
programmeerimine
42
Siirdekäsud
Tingimatu siire
Tingimussiire
Protseduurid
22/07/2004
ID218 Riistvaralähedane
programmeerimine
43
Tingimatu siire I
jmp
A
jmp
disp8
;direct
intrasegment, 8 bit
displacement.
jmp
disp16
;direct intrasegment,
16 bit
displacement.
jmp
mem16
;indirect intrasegment,
16 bit
memory operand.
jmp
reg16
;register indirect
intrasegment.
22/07/2004
ID218 Riistvaralähedane
programmeerimine
44
Tingimatu siire II
mov
Loop: in
xor
out
jmp
Loop:
22/07/2004
dx, 378h
al, dx
al, 1
dx, al
Loop
;Parallel printer port
address.
;Read character from input
port.
;Invert the L.O. bit.
;Output data back to port.
;Repeat forever.
Statement label
ID218 Riistvaralähedane
programmeerimine
45
Tingimatu siire III
WordVar
22/07/2004
word
.
.
.
jmp
TargetAddress
mov
ip, WordVar
WordVar
ID218 Riistvaralähedane
programmeerimine
46
Tingimatu siire IV
jmp
ax
mov
ip, ax
22/07/2004
ID218 Riistvaralähedane
programmeerimine
47
Tingimussiire I
JmpTbl
22/07/2004
word
.
.
.
mov
cmp
sete
jmp
iffalse, iftrue
ax, X
ax, Y
bl
JmpTbl[bl*2]
ID218 Riistvaralähedane
programmeerimine
48
Tingimussiire II
J**
j**
22/07/2004
A
disp8
ID218 Riistvaralähedane
programmeerimine
49
Tingimussiire III
22/07/2004
ID218 Riistvaralähedane
programmeerimine
50
Tingimussiire IV
22/07/2004
ID218 Riistvaralähedane
programmeerimine
51
Tingimussiire V
22/07/2004
ID218 Riistvaralähedane
programmeerimine
52
Tingimussiire VI
jc
Target
jnc
SkipJmp
jmp
Target
SkipJmp:
128 baiti !!!
22/07/2004
ID218 Riistvaralähedane
programmeerimine
53
Kokkuvõte I
Andmeedastuskäsud:
mov
xchg
lea
lds
les
22/07/2004
ID218 Riistvaralähedane
programmeerimine
54
Kokkuvõte II
Bit – käsud:
test
bt*
set**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
55
Kokkuvõte III
String-käsud:
mov*
sto*
loa*
cmp*
22/07/2004
ID218 Riistvaralähedane
programmeerimine
56
Kokkuvõte IV
Siirdekäsud:
jmp
j**
22/07/2004
ID218 Riistvaralähedane
programmeerimine
57
Kokkuvõte V
Sisend / väljundkäsud
in
out
22/07/2004
ID218 Riistvaralähedane
programmeerimine
58