Riistvarapõhine programmeerimine

Download Report

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