Assembly programoz´as szerkesztette: Iv´anyi P´eter September 22, 2009
2
Tartalomjegyz´ek 1 Bevezet´es
9
1.1
Assembly els˝ore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
1.2
Mi´ert tanuljunk assembly nyelvet? . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
1.3
Mikor ne haszn´aljunk assembly nyelvet? . . . . . . . . . . . . . . . . . . . . . . . . .
11
1.3.1
A magas szint˝u programoz´asi nyelvek el˝onye . . . . . . . . . . . . . . . . . .
11
1.3.2
Az assembly h´atr´anyai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
1.4
Miel˝ott elkezden´enk assembly-ben programozni ... . . . . . . . . . . . . . . . . . . .
12
1.5
Szintakszis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
1.6
Assemblerek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
1.6.1
MASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
1.6.2
GAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
1.6.3
TASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
1.6.4
NASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
1.7
1.6.5 Melyik assembler? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ¨ Osszefoglal´ as . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
1.8
Ellen˝orz˝o k´erd´esek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
2 A sz´am´ıt´og´ep fel´ep´ıt´ese 2.1
13
15
A processzor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
2.1.1
V´egrehajt´asi ciklus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
2.1.2
A rendszer o´ ra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
C´ımz´esi architekt´ura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.2.1
H´arom c´ımes architekt´ura . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.2.2
K´et c´ımes architekt´ura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.2.3
Egy c´ımes architekt´ura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.2.4
Z´er´o c´ım architekt´ura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.2.5
Load/Store architekt´ura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.3
Regiszterek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
2.4
V´egrehajt´asi sorrend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
2.4.1
Branching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
Mem´oria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
2.5.1
Mem´oria m˝uveletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
2.5.2
Olvas´asi ciklus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
2.2
2.5
3
2.5.3
Olvas´asi ciklus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
2.5.4
Mem´oria t´ıpusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
2.5.5
Byte sorozatok t´arol´asa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
2.5.6
Adat “alignment” problema . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
2.6
Input/Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24 25
2.7
2.6.1 I/O eszk¨oz¨ok el´er´ese . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ¨ Osszefoglal´ as . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
2.8
Ellen˝orz˝o k´erd´esek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
3 A processzor ´ anos regiszterek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 Altal´
27 28
3.2
Szegment´alt c´ımz´es el˝osz¨or . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
3.3
C´ımz´esi m´odok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
3.3.1
Direkt c´ımz´esi m´od . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
3.3.2
Indirekt c´ımz´esi m´od . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
3.4
St´atusz regiszter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
3.5
Ellen˝orz˝o k´erd´esek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
4 NASM assembler
35
4.1
Egy forr´as file szerkezete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
4.2
Pszeudo utas´ıt´asok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
4.2.1
36
4.3
DB e´ s t´arsai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.2
RESB e´ s t´arsai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
4.2.3
Konstansok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
4.2.4
TIMES pszeudo utas´ıt´as . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
SEG kulcssz´o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
4.3.1
38
Tov´abbi hasznos´ıt´asi ter¨uletek . . . . . . . . . . . . . . . . . . . . . . . . . .
4.4
WRT kulcssz´o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
4.5
Parancssori opci´ok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
4.6
Hiba¨uzenetek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
5 DEBUG program
39
5.1
Jel¨ol´esek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
5.2
A DEBUG ind´ıt´asa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
5.3
A DEBUG parancsai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
5.4
P´eld´ak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
5.4.1
1. P´elda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
5.4.2
2. P´elda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
5.4.3
3. P´elda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
6 Els˝o programok
45
6.1
Els˝o program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
6.2
Egy karakter kinyomtat´asa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
6.3
Egy sz¨oveg kinyomtat´asa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
4
6.4
Egy karakter beolvas´asa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7 Assembly nyelv utas´ıt´asai 7.1
7.2
7.3
7.4
49 51
Adatmozgat´o utas´ıt´asok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
7.1.1
MOV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
7.1.2
XCHG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
7.1.3
XLAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
7.1.4
LDS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
7.1.5
LES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
7.1.6
LEA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
7.1.7
PUSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
7.1.8
PUSHF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
7.1.9
PUSHA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
7.1.10 POP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
7.1.11 POPF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
7.1.12 POPA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
7.1.13 LAHF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
7.1.14 SAHF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
Matematikai utas´ıt´asok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
7.2.1
INC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
7.2.2
DEC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
7.2.3
ADD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
7.2.4
ADC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
7.2.5
SUB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
7.2.6
SBB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
7.2.7
MUL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
7.2.8
IMUL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
7.2.9
DIV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
7.2.10 IDIV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
7.2.11 NEG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
7.2.12 CBW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
63
7.2.13 CWD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
63
Bitforgat´o e´ s bitl´eptet˝o utas´ıt´asok . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
64
7.3.1
RCL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
64
7.3.2
RCR
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
64
7.3.3
ROL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
7.3.4
ROR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
7.3.5
SAL, SHL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
7.3.6
SAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
7.3.7
SHR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
Logikai utas´ıt´asok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
7.4.1
AND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
7.4.2
OR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
5
7.5
7.6
7.7
7.8
7.9
7.4.3
XOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
7.4.4
NOT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
7.4.5
TEST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
7.4.6
CMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
Vez´erl´es´atad´o utas´ıt´asok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
7.5.1
JMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
7.5.2
Felt´eteles utas´ıt´asok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
7.5.3
JCXZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
7.5.4
LOOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
7.5.5
LOOPNZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
7.5.6
LOOPZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
7.5.7
CALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
7.5.8
RET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
7.5.9
INT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
String kezel˝o utas´ıt´asok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
7.6.1
MOVSB, MOVSW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
7.6.2
CMPSB, CMPSW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
7.6.3
LODSB, LODSW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
7.6.4
STOSB, STOSW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
7.6.5
SCASB, SCASW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
7.6.6
REP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
7.6.7
REPZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
7.6.8
REPNZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
Processzor vez´erl˝o utas´ıt´asok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
7.7.1
CLC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
7.7.2
STC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
7.7.3
CMC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
7.7.4
CLD
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
7.7.5
STD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
7.7.6
CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
7.7.7
STI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
Egy´eb utas´ıt´asok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
7.8.1
NOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
7.8.2
IN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
7.8.3
OUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
Ellen˝orz˝o k´erd´esek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
74
8 Assembly programokr´ol
77
8.1
Programoz´asi m´odszer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
8.2
Megszak´ıt´asok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
8.3
COM programok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
8.3.1
Program Segment Prefix . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
78
EXE programok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
78
8.4
6
8.5 8.6
XOR haszn´alata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Assembly integer aritmetika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.6.1 BCD aritmetika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9 P´elda programok 9.1 Egy byte bin´aris kinyomtat´asa . . . . . . . . . . . . . . . . . . 9.2 Egy hexadecim´alis sz´am kinyomtat´asa . . . . . . . . . . . . . . 9.3 Egy byte hexadecim´alis kinyomtat´asa . . . . . . . . . . . . . . 9.4 Egy decim´alis sz´amjegy ellen˝orz¨ott beolvas´asa e´ s kinyomtat´asa . 9.5 Egy karakter beolvas´asa e´ s m´odos´ıt´asa . . . . . . . . . . . . . . ¨ karakter bolvas´asa e´ s kinyomtat´asa ford´ıtott sorrendben . . . 9.6 Ot 9.7 K´et egyjegy˝u sz´am o¨ sszead´asa . . . . . . . . . . . . . . . . . . 9.8 Egy karakter n-szeri kinyomtat´asa . . . . . . . . . . . . . . . . 9.9 T´eglalap kinyomtat´asa . . . . . . . . . . . . . . . . . . . . . . 9.10 Sakkt´abla nyomtat´asa . . . . . . . . . . . . . . . . . . . . . . . 9.11 ASCII t´abla kinyomtat´asa . . . . . . . . . . . . . . . . . . . . . 9.12 Sz´am ki´ır´asa decim´alis form´aban . . . . . . . . . . . . . . . . . 9.13 Olvas´as a mem´ori´ab´ol . . . . . . . . . . . . . . . . . . . . . . . 9.14 K¨ozvetlen vide´o mem´ori´aba ´ır´as . . . . . . . . . . . . . . . . . 9.15 Sz¨oveg beolvas´asa . . . . . . . . . . . . . . . . . . . . . . . . 9.16 Beolvasott sz¨ovegben karakterek sz´aml´al´asa . . . . . . . . . . . 9.17 Beolvasott sz¨oveg nagy bet˝usre konvert´al´asa . . . . . . . . . . . 9.18 Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Speci´alis programok 10.1 Hardware vez´erl´es . . . . . . . 10.2 Zen´el˝o program . . . . . . . . 10.3 Mem´oria rezidens programok . 10.4 V´ırusok . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . .
. . . .
78 78 78
. . . . . . . . . . . . . . . . . .
79 79 81 83 85 86 88 89 92 93 96 99 100 102 103 104 105 106 107
. . . .
109 109 109 109 109
11 Megjegyz´esek 111 11.1 Szok´asos hib´ak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 A ASCII t´abl´azat
113
B Felhaszn´alt irodalom 115 P´elda programok list´aja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 T´argymutat´o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
7
8
1. Fejezet
Bevezet´es Ez a jegyzet ink´abb egy o¨ ssze´all´ıt´as, szerkesztett jegyzet, mint egy o¨ n´all´o k¨onyv. A jegyzet anyag´at t¨obb helyr˝ol szedtem o¨ ssze, de azokat igyekeztem egy egys´eges eg´essz´e o¨ sszegy´urni. A felhaszn´alt irodalom list´aja a jegyzet v´eg´en tal´alhat´o. Az o¨ ssze´all´ıt´as c´elja az assembly nyelv megismertet´ese a hallgat´okkal. Ugyanakkor az assembly nyelv nagyon er˝osen k¨ot˝odik a processzor architekt´ur´ahoz. A processzor architekt´ur´ak k´et nagy csoportba sorolhat´ok: CISC (Complex Instruction Set Computers)1, RISC (Reduced Instruction Set Computers)2. A domin´ans processzor architekt´ura a piacon a Pentium processzor, ami a CISC csal´adhoz tartozik, de ugyanakkor a jelenlegi trendek szerint egyre ink´abb a RISC architekt´ura ker¨ul el˝ot´erbe. A RISC processzorok k¨oz´e tartoznak a MIPS, SPARC, PowerPC e´ s ARM processzorok. A 64-bites Itanium is RISC alap´u processzor. Mit jelent az, hogy komplex utas´ıt´as? K´et sz´am o¨ sszead´asa egyszer˝u m˝uveletnek sz´am´ıt. Ugyanakkor, ha egy t¨omb¨ot a´ tm´asolunk e´ s k¨ozben a t¨omb mutat´okat folyamatosan friss´ıtj¨uk, az m´ar komplex utas´ıt´asnak sz´am´ıt.3 A RISC rendszerek csak egyszer˝u utas´ıt´asokat haszn´alnak, e´ s bizonyos felt´eteleket is szabnak. P´eld´aul az utas´ıt´asok argumentumainak a regiszterekben kell lenni¨uk e´ s nem a mem´ori´aban.
1.1 Assembly els˝ore Az assembly nyelven ´ırt programokat processz´alni kell egy m´asik program, assembler, a´ ltal ami g´epi k´odot gener´al. A g´epi k´odot fogja futtatni a processzor. N´ezz¨unk n´eh´any assembly utas´ıt´ast: inc mov add
result meret, 45 mask1, 256
Az els˝o sorban megadott utas´ıt´as megn¨oveli a ‘result’ v´altoz´o e´ rt´ek´et. A m´asodik sorban megadott utas´ıt´as a 45-¨os e´ rt´eket t¨oltia ‘m´erett’ v´altoz´oba, m´ıg a harmadik utas´ıt´as 256-ot add a ‘mask1’ v´altoz´ohoz. A fenti k´odr´eszlet C programoz´asi nyelven a k¨ovetkez˝ok´eppen n´ez ki: result++; meret = 45; mask1 = mask1+ 256; A p´eld´a alapj´an a k¨ovetkez˝oket lehet meg´allap´ıtani az assembly nyelvr˝ol: • Az assembly nyelv utas´ıt´asai kriptikusak. 1 Szabad
ford´ıt´asban: Komplex utas´ıt´ask´eszlet˝u sz´am´ıt´og´ep ford´ıt´asban: Egyszer˝us´ıtett utas´ıt´ask´eszlet˝u sz´am´ıt´og´ep 3 Itt kell megjegyezni, hogy l´ etezik ilyen utas´ıt´as a CISC processzorokon, ez a MOVSB utas´ıt´as.
2 Szabad
9
Pentium processzor Assembly M˝uvelet G´epi k´od (hex) ¨ nop Ures m˝uvelet 90 inc result N¨ovel´es FF060A00 mov result, 45 M´asol´as C7060C002D00 and mask, 128 Maszkol´as 80260E0080 MIPS processzor Assembly M˝uvelet ¨ Ures m˝uvelet nop mov $t2, $t15 M´asol´as ´ and $t2, $t1, 15 Logikai ES ¨ addu $t3, $t1, $t2 Osszead´as
G´epi k´od (hex) 00000000 000A2021 312A000F 012A5821
1.1. t´abla: Assembly parancsok e´ s a megfelel˝o g´epi k´od
• Az assembly nyelv m˝uveleteit mnemonikok ´ırj´ak le, p´eld´aul add vagy mov. • Az assembly nyelv utas´ıt´asai nagyon alacsony szint˝uek. P´eld´aul a k¨ovetkez˝ot m´ar nem ´ırhatjuk le4 : mov
meret, adat
A 1.1. t´abl´azat n´eh´any assembly utas´ıt´ast e´ s a neki megfelel˝o g´epi k´odot mutatja. A t´abl´azatn´al az els˝o e´ szrev´etel, hogy a RISC processzorokon az utas´ıt´asok hossza fix. (Ezzel is cs¨okkentve a komplexit´ast.) A m´asik fontos e´ szrev´etel, hogy a g´ep k´od meg´ert´ese nagyon neh´ez az emberek sz´am´ara, hiszen t¨obb ezer sz´am kombinci´ot kellene megjegyezni. Ugyanakkor k¨ozvetlen, egy az egyes megfeleltet´es van az assembly utas´ıt´as e´ s a g´epi k´od k¨oz¨ott ez´ert ha az utas´ıt´ast ´ırjuk le az pontosan megfelel a sz´and´ek szerinti g´epi k´odnak e´ s ´ıgy csak ‘mazochist´ak’ programozn´anak g´epi k´odban. Mindenki ink´abb az emberek sz´am´ara jobban e´ rtelmezhet˝o assembly parancsokat haszn´alja. Persze a digit´alis forradalom elej´en n´eh´any programot m´eg g´epi k´odban ´ırtak.
1.2 Mi´ert tanuljunk assembly nyelvet? Az assembly programoz´as nem annyira n´epszer˝u mint n´eh´any e´ ve volt. Ugyanakkor m´eg mindig t¨obb oka van annak, hogy megtanuljunk assembly-ben programozni: • Tanul´as: Fontos tudni hogyan m˝uk¨odnek a processzorok e´ s ford´ıt´ok az utas´ıt´as szinten. Ezen ismeretek seg´ıts´eg´evel meg lehet a´ llap´ıtani mely programoz´asi m´odok a leghat´ekonyabbak, illetve, hogy a magasabb szint˝u programoz´asi szerkezetek hogyan m˝uk¨odnek. • Debuggol´as: T¨obb szempontb´ol is hasznos lehet ha a ford´ıt´ok a´ ltal gener´alt k´odot meg tudjuk e´ rteni illetve meg tudjuk a´ llap´ıtani, hogy mennyire j´o, optimaliz´alt k´odot gener´al egy ford´ıt´o. • Ford´ıt´ok: Az assembly k´od meg´ert´ese elengedhetetlen ahhoz, hogy ford´ıt´ot, debugger-t vagy egy´eb fejleszt˝o eszk¨oz¨oket fejlessz¨unk. • Be´agyazott rendszerek: A be´agyazott rendszereknek nincs annyi er˝oforr´asa mint egy hagyom´anyos PC-nek e´ s az assembly nyelvre sz¨uks´eg lehet, hogy ilyen rendszerekre gyors e´ s hat´ekony k´odot ´ırjunk. 4A
magyar´azat a 3. fejezetben tal´alhat´o.
10
• Hardware eszk¨oz¨ok: A magas szint˝u programoz´asi nyelvek korl´atozott (absztrakt) hozz´af´er´est engednek a hardware elemekhez, ´ıgy a hardware eszk¨oz¨ok haszn´alat´at e´ s el´er´es´et biztos´ıt´o eszk¨ozvez´erl˝ot ´ırni magas szint˝u nyelven neh´ez vagy lehetetlen. Ilyen esetben is j´ol j¨ohet az assembly nyelv ismerete. • Olyan utas´ıt´asokat is haszn´alhatunk assembly-ben aminek a magasabb szint˝u nyelvekben nincs megfelel˝oje. • M´eretre val´o optimaliz´al´as: A m´eretre val´o optimaliz´al´as azt jelenti, hogy Program A kevesebb helyet foglal mint Program B de ugyanazt a feladatot l´atja el. A mem´oria ma m´ar olyan olcs´o, hogy tulajdonk´eppen nem e´ ri meg assembly-ben k´odot ´ırni a program m´eret´enek cs¨okkent´ese miatt. Ugyanakkor a cache m´eg midig kis m´eret˝u e´ s dr´aga, ´ıgy az erre optimaliz´alt k´od eset´en m´eg mindig fontos az assembly nyelv haszn´alata. • Sebess´egre val´o optimaliz´al´as: A sebess´egre optimaliz´alt program a lehet˝o legr¨ovidebb id˝o alatt v´egzi el a feladatot. Hab´ar a modern ford´ıt´ok viszonylag j´ol optimaliz´alj´ak a gener´alt k´odot, bizonyos esetekben a k´ezzel optimaliz´alt assembly program r´eszlet dr´amaian fel tudja gyors´ıtani a programot. Az utols´o k´et szempontb´ol az ut´obbi a fontosabb. Egyr´eszt a hely megtakar´ıt´as csak a program k´odra vonatkozik e´ s az adatra nem, m´asr´eszt a mem´oria m´eret´enek n¨oveked´ese miatt. Assemblyben az´ert lehet hat´ekony k´odot ´ırni, mivel a nyelv saj´atoss´aga, hogy a gener´alt k´od csak azt tartalmazza amit bele´ırtunk, vagyis ami a feladat megold´as´ahoz kell. Semmi m´as, extra inform´aci´ot nem ford´ıt bele az assembler. A sebess´egre optimaliz´alt alkalmaz´asok k´et kateg´ori´aba sorolhat´ok: – id˝o hat´ekony alkalmaz´asok: ezekn´el a programokn´al a gyorsabb fut´as jelent el˝onyt, de nincs k¨ul¨on¨osebb probl´ema ha a sebess´eg lassabb; – id˝o kritikus alkalmaz´asok: ebben az esetben a feladatot adott id˝o alatt kell elv´egezni. ´ aban ezek a val´os idej˝u alkalmaz´asok (real-time systems), p´eld´aul: rep¨ul˝og´ep navig´aci´os Altal´ eszk¨oz, robot kontroll rendszerek, kommunik´aci´os szoftverek.
1.3 Mikor ne haszn´aljunk assembly nyelvet? Olyan sok h´atr´anya van az assembly nyelven val´o programoz´asnak, hogy miel˝ott elkezden´enk programozni assembly-ben m´as alternat´ıv´akat is vegy¨unk figyelembe.
1.3.1 A magas szintu˝ programoz´asi nyelvek el˝onye A magas szint˝u programoz´asi nyelvek viszonylag k´enyelmes absztrakci´ot tesznek lehet˝ov´e, hogy az adott probl´em´at megoldjuk. A magas szint˝u programoz´asi nyelvek el˝onyei: • A program fejleszt´es gyorsabb: A magas szint˝u programoz´asi nyelvekben sokf´ele programoz´asi ´ aban r¨ovidebbek is a programok. konstrukci´o a´ ll rendelkez´esre. Altal´ • A programokat k¨onnyebb karbantartani: A magas szint˝u programoz´asi nyelven ´ırt programokat egyszer˝ubb meg´erteni e´ s ez´ert k¨onnyebb m´asok a´ ltal ´ırt programot a´ ttekinteni e´ s meg´erteni. • A programok hordozhat´oak: A program nem tartalmaz processzor specifikus r´eszleteket e´ s ez´ert b´armilyen rendszeren haszn´alhat´oak.5 5 Itt
f˝oleg a forr´ask´odr´ol besz´el¨unk, nem a futtathat´o, m´ar leford´ıtott g´epi k´od´u programr´ol.
11
1.3.2 Az assembly h´atr´anyai Az assembly-ben val´o programoz´as ellen sz´ol´o legfontosabb e´ rvek: 1. Fejleszt´esi id˝o: Az assembly-ben val´o programoz´as szinte mindig t¨obb id˝ot ig´enyel mint a magasabb szint˝u programoz´asi nyelv haszn´alata. 2. Megb´ızhat´os´ag e´ s biztons´ag: Assembly nyelven k¨onny˝u hib´at v´eteni. Az assembler csak szintaktikai ellen˝orz´eseket v´egez. 3. Debuggol´as e´ s ellen˝orz´es: Az assembly nyelven ´ırt programokban nehezebb hib´at keresni, illetve nehezebb ellen˝orizni a k´odot, hogy az el˝o´ırt feladatot oldja meg. 4. Karbantart´as: Az assembly nyelven ´ırt programokat nehezebb m´odos´ıtani e´ s karbantartani. A nyelv megengedi a “spagetti” k´od ´ır´asi technik´at e´ s egy´eb tr¨ukk¨ok is megengedettek a nyelvben, melyeket m´as nyelven nem lehet megval´os´ıtani. 5. Hordozhat´os´ag: Az assembly k´od a hardware platformhoz kapcsol´odik, csak az adott processzoron, architekt´ur´an lehet lefuttatni. 6. Modern ford´ıt´ok: A modern ford´ıt´ok sokat fejl˝odtek az elm´ult e´ vekben e´ s m´ar nagyon j´o k´odot tudnak gener´alni e´ s gyakran nehezebb jobb assembly k´odot gener´alni.
1.4 Miel˝ott elkezden´enk assembly-ben programozni ... Van n´eh´any szempont amit figyelembe kell venni miel˝ott egy komplex alkalmaz´ast elkezden´enk assemblyben programozni: • Ha az a c´elunk, hogy egy program sebess´eg´et optimaliz´aljuk, akkor el˝osz¨or azonos´ıtsuk, hogy a program mely r´esze fut a legt¨obbet a processzoron. Ellen˝orizz¨uk, hogy mivel t¨olti a legt¨obb id˝ot a program, p´eld´aul a mem´oria el´er´essel, CPU utas´ıt´asok v´egrehajt´as´aval, file-ok el´er´es´evel vagy valami m´assal. • D¨onts¨uk el, hogy a fejlesztett program u´ jrahasznos´ıthat´o vagy csak egy egyedi alkalmaz´as. Ha a k´odot u´ jra fel akarjuk haszn´alni, akkor e´ rdemes t¨obb id˝ot t¨olteni az optimaliz´al´assal. • El kell d¨onteni, melyik assemblert haszn´aljuk, mivel a k¨ul¨onb¨oz˝o assemblerek m´as-m´as szintakszist haszn´alhatnak. • A jelent˝os m´ert´ekben optimaliz´alt k´odot neh´ez lehet olvasni, ´ıgy a karbantart´as miatt e´ rdemes kisebb egys´egekbe szervezni a programot melyeknek j´ol defini´alt interface-e van e´ s megfelel˝oen van dokument´alva.
1.5 Szintakszis K´etf´ele jelent˝osebb szintakszis alakult ki az e´ vek sor´an, amiket az assembly programok ı´r´as´an´al haszn´alhatunk: • AT&T szintakszis • Intel szintakszis
1.6 Assemblerek T¨obb assembler is l´etezik az Intel processzorokra, melyek az x86-os utas´ıt´as k´eszletet haszn´alj´ak, vagyis a mnemonikokb´ol Intel g´epi k´odot hoznak l´etre. Az al´abbiakban csak n´eh´anyat mutatunk be.
12
1.6.1 MASM Ez a Microsoft Assembler, mely a mai napig r´esze a Microsoft fejleszt˝o k¨ornyezet´enek, a Visual Studionak. A program neve: ml.exe. A MASM sok´aig a “de-facto” ipari szabv´any volt e´ s t¨obb magasabb szint˝u programoz´asi konstrukci´ot is tudott kezelni. A form´atuma nem teljesen ‘tiszta’, vannak inkonzisztens r´eszek benne. Microsoft tov´abbra is fejleszti, de igaz´ab´ol minim´alis m´odon.
1.6.2 GAS GAS r¨ovidit´es megfelel˝oje a GNU Assembler, mely a GNU binutils csomag r´esze is. A GNU ford´ıt´ok olyan form´atumot gener´alnak, melyet ez az assembler k´epes leford´ıtani. GAS az u´ gynevezett AT&T szintakszist haszn´alja, b´ar ma m´ar az Intel szintakszisnak megfelel˝o k´odot is el tud fogadni. Ez az assembler haszn´alhat´o Linux, Mac OS X e´ s Windows alatt is.
1.6.3 TASM Az egyik legn´epszer˝ubb fejleszt˝oi eszk¨oz¨oket a Borland c´eg k´esz´ıtette. Az a´ ltaluk k´esz´ıtett programfejleszt˝o csal´adba tartozik a Turbo Assembler is. Sajnos ma m´ar nem fejlesztik, az u´ jabb utas´ıt´asok nem ker¨ulnek bele, de m´eg mindig el´erhet˝o az Interneten. Az assembler a´ ltal haszn´alt szintakszis nagyon hasonl´o a MASM assembler szintakszis´ahoz.
1.6.4 NASM NASM megfelel a Netwide Assembler n´evnek e´ s egy szabad forr´askod´u assembler, mely t¨obbf´ele objektum form´atumot k´epes gener´alni e´ s ´ıgy t¨obb oper´aci´os rendszert t´amogat (Linux, Windows, Mac OS X, FreeBSD, stb). A szintakszisa tiszt´abb mint a MASM assembler-´e, de kevesebb magas szint˝u programoz´asi konstrukci´ot k´epes kezelni.
1.6.5 Melyik assembler? Ez a jegyzet a NASM assemblert haszn´alja k´et f˝o ok miatt: • Az egyszer˝u szintakszis nagyon logikus e´ s konzisztens. • Windows e´ s Linux rendszeren is haszn´alhat´o, melyek manaps´ag a legjobban elterjedt oper´aci´os rendszerek.
¨ 1.7 Osszefoglal´ as Az assembly nyelv tanul´asa mind gyakorlati e´ s pedag´ogia c´elokat szolg´alhat. M´eg ha nem is sz´and´ekozunk assembly-ben programozni, akkor is e´ rdemes megtanulni, mivel egy nagyon j´o alapot ad ahhoz hogy meg´erts¨uk, hogyan m˝uk¨odnek a sz´am´ıt´og´epek. Amikor magas szint˝u programoz´asi nyelvet haszn´alunk, akkor a rendszert egy “fekete dobozk´ent” kezelj¨uk. Ezzel szemben assembly programoz´as eset´en a rendszert r´eszleteit is ismerni kell, p´eld´aul a regisztereket.
1.8 Ellen˝orz˝o k´erd´esek 1. Soroljon fel k¨ul¨onb¨oz˝o processzorokat! 2. Mit jelent a CISC kifejez´es e´ s mi jellemz˝o az ilyen processzorokra?
13
3. Soroljon fel indokokat mi´ert e´ rdemes assembly nyelvet tanulni? 4. Soroljon fel indokokat mikor kell assembly nyelvet tanulni? 5. Soroljon fel indokokat mikor ne haszn´aljunk assembly nyelvet? 6. Mi az assembly nyelv e´ s a g´epi k´od kapcsolata? 7. Magas szint˝u programoz´asi nyelvben mi´ert nem tudjuk teljes m´ert´ekben kontroll´alni a hardwaret? 8. Mi´ert h´ıvjuk az assembly programoz´asi nyelvet alacsony szint˝u nyelvnek e´ s a C programoz´asi nyelvet magas szint˝unek? 9. Soroljon fel n´eh´any k¨ul¨onbs´eget a CISC e´ s RISC processzorok k¨oz¨ott? 10. Hasonl´ıtsa o¨ ssze a k´et f´ele assembly szintakszist! 11. Soroljon fel assemblereket! 12. Mi´ert lehet sz¨uks´eg az assembly haszn´alat´ara id˝o kritikus alkalmaz´asok eset´en? 13. Soroljon fel id˝o kritikus alkalmaz´asokat!
14
2. Fejezet
A sz´am´ıt´og´ep fel´ep´ıt´ese A sz´am´ıt´og´epnek alapvet˝oen h´arom f˝o komponense van: a k¨ozponti egys´eg vagy processzor (CPU), a mem´oria, e´ s az Input/Output eszk¨oz¨ok. L´asd a 2.1. a´ bra. A r´eszek k¨oz¨otti kapcsolatot a rendszer busz biztos´ıtja. A mem´oria t´arolja a programokat e´ s az adatokat is egyszerre. Az Input/Output eszk¨oz¨ok lehetnek a billenty˝uzet, a k´eperny˝o e´ s ´ıgy tov´abb. A 2.2. a´ bra egy r´eszletesebb n´ezet´et adja a sz´am´ıt´og´epnek, ahol j´ol l´athat´o hogy a rendszer busz h´arom r´eszb˝ol a´ ll: c´ım busz, adat busz e´ s kontroll busz. A c´ım busz sz´eless´ege hat´arozza meg az el´erhet˝o mem´oria kapacit´ast, illetve az adat busz adja meg, hogy milyen m´eret˝u adatok mozoghatnak a CPU, a mem´oria e´ s az I/O eszk¨oz¨ok k¨oz¨ott. P´eld´aul a 8086-os processzornak 20 bites a c´ım busza e´ s 16 bites az adat busza. Ezek alapj´an a processzor 220 byte-ot tud megc´ımezni, vagyis 1 MByte-ot e´ s minden alkalommal 16 bit mozog az egys´egek k¨oz¨ott. A Pentium processzoroknak 32 c´ım vonaluk van a c´ım buszban e´ s 64 adat vonala. ´Igy a Pentium 4 GByte mem´ori´at tud megc´ımezni. A 2.2. a´ br´an az is fontos, hogy a buszok milyen ir´anyba k´epesek adatot k¨uldeni. L´athat´o, hogy a CPU a kontroll buszon kereszt¨ul ad utas´ıt´asokat a mem´ori´anak e´ s az I/O alrendszernek, adatot viszont az adat buszon kereszt¨ul fogad. A kontroll buszon kiadhat´o jelek: mem´oria olvas´as, mem´oria ´ır´as, I/O olvas´as, I/O ´ır´as, megszak´ıt´as e´ s ´ıgy tov´abb.
2.1 A processzor ´ A processzor kontroll´alja a legt¨obb tev´ekenys´eget a rendszerben. Ugy e´ rdemes r´a gondolni, hogy a k¨ovetkez˝o ciklust hajtja v´egre: 1. Egy utas´ıt´as bet¨olt´ese a mem´ori´ab´ol (fetch), 2. Az utas´ıt´as dek´odol´asa, azonos´ıt´asa (decode),
CPU
Memória Kapcsolat
Input/Output
2.1. a´ bra: Absztrakt e´ rtelmez´ese a sz´am´ıt´og´epnek
15
CPU
Memória
Cím busz Adat busz
I/O alrendszer
Kontroll busz
2.2. a´ bra: Egy sz´am´ıt´og´ep egyszer˝us´ıtett diagramja
3. Az utas´ıt´as v´egrehajt´asa (execute). Ez a v´egrehajt´asi ciklus, vagy fetch-decode-execute ciklus.
2.1.1 V´egrehajt´asi ciklus • Fetch – A processzor a bet¨oltend˝o utas´ıt´as c´ım´et felrakja a c´ım buszra. – A processzor a kontroll buszon kereszt¨ul mem´oria olvas´asra ad utas´ıt´ast a mem´oria egys´egnek. A processzor addig v´ar am´ıg az utas´ıt´as meg nem jelenik az adat buszon. – A mem´oria egys´egnek id˝o kell m´ıg hozz´af´er a sz¨uks´eges r´eszhez. Ez a hozz´af´er´esi id˝o. – A mem´oria a beolvasott utas´ıt´ast az adat buszra helyezi. – A processzor beolvassa az adat buszr´ol az utas´ıt´ast • Decode – Azonos´ıtani kell a beolvasott utas´ıt´ast. Ezt seg´ıtend˝o az utas´ıt´asok bizonyos k´odol´asi mint´at k¨ovetnek, melyet majd a 7. fejezetben t´argyalunk. • Execute – A v´egrehajt´ashoz k´et egys´egre van sz¨uks´eg: egy kontrol e´ s egy aritmetikai (ALU) egys´egre. A kontroll egys´eg seg´ıt az id˝oz´ıt´esben, m´ıg az ALU egys´eg a matematikai sz´am´ıt´asokat v´egzi el. Megjegyezz¨uk, hogy az adatok e´ s az utas´ıt´asok nem mindig k¨ozvetlen¨ul a mem´ori´ab´ol j¨onnek, hanem az u´ gynevezett cache-b˝ol. A cache mem´ori´ahoz val´o hozz´af´er´es gyorsabb. A Pentium processzoron 16 KB-os cache van a chipen, melynek fele adat e´ s fele utas´ıt´as cache. Szerencs´ere a cache haszn´alata hardware-ben van megoldva e´ s teljesen transzparens a programoz´o sz´am´ara.
16
2.1.2 A rendszer o´ ra A rendszer o´ ra a system clock. A rendszer o´ ra teszi lehet˝ov´e, hogy a m˝uveleteket o¨ sszeszinkroniz´aljuk. Az o´ rajel 1-eseket e´ s 0-kat ad ki sorozatban, szekvenci´aban. Az o´ ra frekvencia e´ rt´ek´et a m´asodpercenk´enti ciklusok sz´ama adja meg e´ s a m´ert´ekegys´ege Hertz (Hz). A MHz e´ s GHz 106 e´ s 109 ciklust jelent m´asodpercenk´ent. 1 o´ ra frekvencia = (2.1) o´ ra ciklus hossza A rendszer o´ ra adja meg a sz´am´ıt´og´ep sebess´eg´et. Minden processzor m˝uvelet v´egrehajt´asa t¨obb o´ rajel ciklust ig´enyel. P´eld´aul egy 1 GHz-es Pentium processzoron egy adat tov´abb´ıt´asa a mem´ori´ab´ol a processzorra h´arom o´ rajel ciklust ig´enyel. Egy o´ ra ciklus hossza: 1 = 1ns 1 × 109
(2.2)
e´ s ´ıgy az adattov´abb´ıt´ashoz 3 ns-ra van sz¨uks´eg. A sz´am´ıt´og´epek sebess´eg´et n¨ovelhetj¨uk u´ gy, hogy nagyobb o´ rajel frekvenci´at haszn´alunk. P´eld´aul egy 2 GHz-es processzoron az adat tov´abb´ıt´as m´ar csak 1.5 ns-ig fog tartani.
´ 2.2 C´ımz´esi architektura ´ Erdekes m´odon az egyik legfontosabb tulajdons´aga egy architekt´ur´anak hogy h´any c´ımet haszn´alunk az utas´ıt´asokban. A legt¨obb m˝uvelethez egy vagy k´et argumentumra van sz¨uks´eg. Ezek alapj´an szokt´ak a m˝uveleteket binary e´ s unary m˝uveleteknek nevezni, ahol a a “bi-” kett˝ot, az “un-” egyet jelent. “Unary” m˝uvelet p´eld´aul a tagad´as (NOT) m˝uvelet, m´ıg “binary” m˝uvelet az o¨ sszead´as e´ s a kivon´as. Ezek a m˝uveletek egy eredm´enyt adnak. Term´eszetesen vannak kiv´etelek, p´eld´aul az oszt´as. Az oszt´asn´al k´et argumentumra van sz¨uks´eg, az osztand´ora e´ s az oszt´ora, viszont k´et eredm´eny is keletkezik: az eredm´eny e´ s a marad´ek. Mivel a “binary” m˝uveletek a leggyakoribbak e´ s ebben az esetben k´et input argumentumra e´ s egy eredm´eny, output argumentumra van sz¨uks´eg ez´ert ez´ert a´ ltal´aban h´arom c´ımre van sz¨uks´eg egy utas´ıt´asn´al. Ebben a r´eszben azt n´ezz¨uk meg, hogyan lehet h´arom, kett˝o, egy e´ s z´erus c´ımet haszn´alni az utas´ıt´asokkal.
´ 2.2.1 H´arom c´ımes architektura A h´arom c´ımet haszn´al´o utas´ıt´ask´eszlettel rendelkez˝o processzorokn´al a k´et input argumentumot e´ s az egyetlen output argumentumot tudjuk megadni. A legt¨obb modern processzor ilyen utas´ıt´ask´eszletet haszn´al. N´ezz¨unk egy p´eld´at: A = B + C * D - E + F + A mely pszeudo assembly-ben a k¨ovetkez˝ok´eppen n´ez ki: mult add sub add add
T,C,D T,T,B T,T,E T,T,F A,A,T
; ; ; ; ;
T T T T A
= = = = =
C B B B B
* + + + +
D C C C C
* * * *
D D - E D - E + F D - E + F + A
A p´eld´aban az l´athat´o, hogy matematikai m˝uveletre egy utas´ıt´ast kell megadni. Ami szint´en szembet˝un˝o, hogy az els˝o utas´ıt´ast kiv´eve az els˝o k´et argumentum azonos. Mivel az esetek jelent˝os r´esz´eben ´ıgy van, ez´ert a sok duplik´aci´o elker¨ul´ese v´egett “k´et-c´ımes” utas´ıt´ask´eszleteket is szoktak implement´alni processzorokban.
17
´ 2.2.2 K´et c´ımes architektura Ebben az esetben az utas´ıt´asoknak csak c´ım argumentuma van e´ s az egyik c´ım inputk´ent e´ s outputk´ent is szolg´al. Az Intel processzorok, p´eld´aul a Pentium is ilyen utas´ıt´asokat haszn´al. N´ezz¨uk az el˝oz˝o p´eld´at u´ jra: A = B + C * D - E + F + A mely pszeudo assembly-ben a k¨ovetkez˝ok´eppen n´ez ki: load mult add sub add add
T,C T,D T,B T,E T,F A,T
; ; ; ; ; ;
T T T T T A
= = = = = =
C C B B B B
* + + + +
D C C C C
* * * *
D D - E D - E + F D - E + F + A
Mivel csak k´et argumentum a´ ll rendelkez´esre ez´ert az els˝o utas´ıt´assal bet¨oltj¨uk az adatot T-be. Ebben az esetben az a felt˝un˝o, hogy az els˝o 6 utas´ıt´asban a T argumentum k¨oz¨os. Ha ez lesz az alap eset, akkor m´ar csak egy c´ım, argumentum kell az utas´ıt´asokhoz.
´ 2.2.3 Egy c´ımes architektura Ha a mem´oria dr´aga vagy lass´u akkor egy speci´alis regisztert haszn´al a processzor. Ez a regiszter szolg´altatja az input e´ s az output argumentumot egy utas´ıt´asnak. Ezt a regisztert akkumul´ator regiszternek is szokt´ak nevezni, mivel benne gy˝ulik o¨ ssze, akkumul´al´odik, az eredm´eny. A legt¨obb arhitekt´ura eset´en csak egy akkumul´ator regiszter van. Ezt a regisztert nem kell megadni az utas´ıt´asnak csak a m´asik argumentumot.
´ 2.2.4 Z´er´o c´ım architektura Arra is van lehet˝os´eg, hogy mindk´et argumentum speci´alis helyen t´arol´odik e´ s ´ıgy nem kell megadni o˝ ket az utas´ıt´asokn´al. Ezek a processzorok egy vermet haszn´alnak. Az argumentumok a verem tetej´en vannak amiket az utas´ıt´as levesz onnan, majd az eredm´enyt is a verem tetej´ere teszi vissza.
´ 2.2.5 Load/Store architektura Ebben az esetben a m˝uveleteket a processzor bels˝o regiszterein v´egezhetj¨uk el e´ s k¨ul¨on utas´ıt´assal kell beolvasni az adatokat a mem´ori´ab´ol a regiszterekbe, illetve a regiszterekb˝ol ki´ırni a mem´ori´aba. A fenti p´elda a k¨ovetkez˝ok´eppen m´odosul: A = B + C * D - E + F + A mely pszeudo assembly-ben a k¨ovetkez˝ok´eppen n´ez ki: load load load load load load mult add
R1,B R2,C R3,D R4,E R5,F R6,A R2,R2,R3 R2,R2,R1
; R2 = C * D ; R2 = B + C * D
18
sub add add store
R2,R2,R4 R2,R2,R5 R2,R2,R6 A,R2
; R2 = B + C * D - E ; R2 = B + C * D - E + F ; R2 = B + C * D - E + F + A
A fenti p´eld´aban hat regisztert is haszn´alunk. B´ar nincs ennyire sz¨uks´eg, de ez a´ ltal´aban jellemz˝o ezekre az architekt´ur´akra, hogy sok regiszter¨uk van. A RISC processzoroknak t¨obb regiszter¨uk van mint a CISC processzoroknak. A MIPS processzornak 32 regisztere van, az Intel Itanium processzornak 128 regisztere e´ s az Intel Pentium processzornak csak 10 regisztere van.
2.3 Regiszterek Minden processzorban vannak regiszterek, melyeket k´et f˝o csoportba sorolhatunk: • a´ ltal´anos c´el´u regiszterek, • speci´alis c´el´u regiszterek. A speci´alis c´el´u regisztereket tov´abbi k´et csoportba oszthatjuk: felhaszn´al´o a´ ltal el´erhet˝o regiszterek e´ s csak a rendszer a´ ltal el´erhet˝o regiszterek. A Pentium regisztereit a 3. fejezetben t´argyaljuk.
2.4 V´egrehajt´asi sorrend A program v´egrehajt´asa a´ ltal´aban szekvenci´alisan t¨ort´enik, az utas´ıt´asokat egym´as ut´an hajtjuk v´egre. Az egyik regiszter, a “Program Counter” (PC) vagy “Instructon Pointer” (IP) regiszter, fontos szerept j´atszik a v´egrehajt´asi sorrend kezel´es´eben. A processzor mindig azt az utas´ıt´ast t¨olti be (fetch) amire a PC regiszter mutat. A bet¨olt´es ut´an a PC regiszter e´ rt´ek´et megn¨ovelj¨uk, hogy a k¨ovetkez˝o utas´ıt´asra mutasson. Ez a megn¨ovel´es lehet fix m´eret˝u, p´eld´aul a RISC processzorokn´al, vagy v´altoz´o m´eret˝u a CISC processzorokn´al, ahogy ez l´athat´o a 1.1. A CISC processzorok eset´en minden utas´ıt´asn´al k¨ul¨on meg kell a´ llap´ıtani, hogy mennyivel n¨ovelj¨uk meg a PC regiszter e´ rt´ek´et. A magasabb szint˝u programoz´asi nyelvekben ugyanakkor vannak felt´eteles v´egrehajt´asi e´ s ciklikus programoz´asi konstrukci´ok, melyek a v´egrehajt´asi sorrendet v´altoztatj´ak meg valamilyen fut´as k¨ozbeni felt´etelt˝ol f¨ugg˝oen. Ezek megval´os´ıt´asa a processzorokban “speci´alis” m´odon t¨ort´enik.
2.4.1 Branching A “branching” sz´o ford´ıt´asa tal´an az el´agaz´as lehet. Arr´ol van sz´o, hogy az eredeti szekvenci´at megszak´ıtva, m´ashol folytat´odik a program v´egrehajt´asa. K´et v´altozata van: a felt´etel n´elk¨uli e´ s felt´eteles ugr´o utas´ıt´as. Ezeknek az utas´ıt´asoknak egy argumentuma van, mely explicit m´odon megadja az u´ j utas´ıt´as c´ım´et. Ez azt jelenti, hogy amikor m´ashol kell folytatni a v´egrehajt´ast, akkor a PC regiszterbe az u´ j c´ımet t¨oltj¨uk be e´ s ´ıgy a k¨ovetkez˝o “fetch”-n´el m´ar ezt a c´ımet fogja haszn´alni a processzor. A v´egrehajt´asi sorrend a felt´etel n´elk¨uli ugr´o utas´ıt´as eset´en a 2.3. a´ br´an l´athat´o. Felt´eteles ugr´as A felt´eteles ugr´as eset´en az u´ j c´ım csak akkor t¨olt˝odik be a PC regiszterbe, ha valamilyen felt´etel teljes¨ul. K´etf´ele m´odon szokt´ak ezt megadni a k¨ul¨onb¨oz˝o processzorokban: Set-Then-Jump : Az ilyen architekt´ur´aj´u processzorokban a vizsg´alat e´ s az ugr´as sz´et van v´alasztva. A k´et, k¨ul¨on´all´o r´esz k¨oz¨otti kapcsolatot egy regiszter biztos´ıtja. A vizsg´alat be´all´ıtja a regiszter e´ rt´ek´et, majd az ugr´o utas´ıt´as ezt a regisztert vizsg´alja meg hogy bek¨ovetkezzen-e az ugr´as vagy sem. A Pentium processzorok ezt a technik´at haszn´alj´ak.
19
utasítás a jump cím utasítás b
utasítás utasítás
c d
2.3. a´ bra: Ugr´o utas´ıt´as
Test-And-Jump : A legt¨obb processzor o¨ sszekombin´alja a k´et r´eszt, p´eld´aul a MIPS processzorok. P´eld´aul: beq
Rsrc1, Rsrc2, c´ elc´ ım
o¨ sszehasonl´ıtja az Rsrc1 e´ s Rsrc2 regiszterek tartalm´at e´ s ha egyenl˝oek, akkor a c´ elc´ ım-n´el folytat´odik a v´egrehajt´as.
2.5 Mem´oria A sz´am´ıt´og´ep mem´ori´aj´at u´ gy e´ rdemes elk´epzelni mint sok elektronikus “kapcsol´o” o¨ sszess´ege. Ezek a “kapcsol´ok” k´et a´ llapotban lehetnek: nyitott vagy z´art a´ llapotban. Ugyanakkor ezeket az a´ llapotokat e´ rdemesebb 1 e´ s 0 a´ llapottal jellemezni. ´Igy minden “kapcsol´ot” reprezent´alni lehet egy bin´aris sz´ammal vagy bittel. A mem´oria milli´o sz´am tartalmaz biteket. A jobb kezelhet˝os´eg miatt a mem´oria a biteket csoportokba szervezik. 8 bit csoportja egy byte. ´Igy a mem´oria mint egy byte sorozat k´epzelhet˝o el. Minden byte-ra egy index sz´ammal lehet hivatkozni. Az els˝o index e´ rt´eke 0. Az utols´o index e´ rt´eke 2n − 1, ahol az n az adatbusz sz´eless´ege (h´any bites). A mem´oria sematikus k´epe a 2.4. a´ br´an l´athat´o.
˝ 2.5.1 Mem´oria muveletek K´et alapvet˝o m˝uvelet van: adat olvas´as a mem´ori´ab´ol e´ s adat ´ır´as a mem´ori´aba. Mindk´et esetben sz¨uks´eg van egy mem´oria c´ımre ahonnan olvashatunk, vagy ahova ´ırhatunk. Ezenk´ıv˝ul az ´ır´asi m˝uvelet m´eg egy adatot is ig´enyel.
2.5.2 Olvas´asi ciklus 1. A processor elhelyezi az olvasand´o adat c´ım´et a c´ım buszon. 2. A kontroll buszon a processzor kiadja a mem´oria olvas´asi jelet. 3. A processzor v´arakozik am´ıg az olvas´as megt¨ort´enik e´ s az adat megjelenik az adat buszon. 4. A processzor beolvassa az adatot az adat buszr´ol.
20
232-1
FFFF FFFF FFFF FFFE
1
0000 0001
0
0000 0000
2.4. a´ bra: A mem´oria sematikus k´epe
5. A kontroll buszon jelzi a processzor, hogy v´eget e´ rt az olvas´as. Egy Pentium processzor olvas´asi ciklusa h´arom o´ rajel ciklusnak felel meg. Az els˝o o´ rajel ciklus alatt az 1. e´ s 2. l´ep´es hajt´odik v´egre. A m´asodik o´ rajel ciklus alatt a processzor v´arakozik. A harmadik o´ rajel ciklus alatt az utols´o k´et l´ep´es fut le. Ha a mem´ori´anak m´egsem siker¨ul az olvas´as, akkor ezt jelzi a processzornak ami egy u´ jabb o´ rajel ciklusig v´ar.
2.5.3 Olvas´asi ciklus 1. A processzor elhelyezi az ´ırand´o adat c´ım´et a c´ım buszon. 2. A processzor elhelyezi az adatot az adat buszra. 3. A kontroll buszon a processzor kiadja a mem´oria ´ır´asi jelet. 4. A processzor v´arakozik am´ıg az ´ır´as megt¨ort´enik. 5. A kontroll buszon jelezz¨uk az ´ır´as v´eg´et. A Pentium processzor ´ır´asi c´ıklusa is h´arom o´ rajel ciklust ig´enyel. Az 1. e´ s 3. l´ep´es az els˝o o´ rajel alatt k¨ovetkezik be. A 2. l´ep´es csak a m´asodik o´ rajel ciklus alatt t¨ort´enik. A m´asodik o´ rajel ciklus v´eg´en jelzi az ´ır´as v´eg´et.
2.5.4 Mem´oria t´ıpusok A mem´ori´akat k¨ul¨onb¨oz˝o kateg´ori´akba lehet csoportos´ıtani. Az egyik legfontosabb tulajdons´aga a mem´ori´aknak, hogy csak olvashat´ok vagy ´ırhat´ok-olvashat´ok. Szint´en fontos tulajdons´ag, hogy a mem´oria minden r´esz´enek el´er´ese azonos id˝oben lehets´eges (random-access) vagy csak szekvenci´alisan. A szekvenci´alis el´er´es magyar´azat´ahoz a legjobb p´elda egy kazetta, amikor is addig kell olvasni a kazett´at, am´ıg el nem e´ rt¨uk a keresett adatot. V´eg¨ul vannak a “volatile” mem´ori´ak, melyekn´el am´ıg fesz¨ults´eg alatt van az egys´eg csak addig o˝ rzi meg a tartalmat. A “nonvolatile” mem´oria akkor is meg˝orzi a tartalm´at ha nincs fesz¨ults´eg alatt az egys´eg. Csak olvashat´o mem´ori´ak A csak olvashat´o mem´ori´ak (Read Only Memory vagy ROM) csak olvas´asi m˝uveletet enged. Ebbe a mem´ori´aba nem tudunk ´ırni. A f˝o el˝ony¨uk, hogy egyben “nonvolatile” mem´ori´ak is. A ROM mem´ori´ak
21
tartalm´at a “gy´arban” e´ getik bele. Ezeket a mem´ori´akat olcs´o gy´artani. A r´egebbi sz´am´ıt´og´epekben a BIOS a´ ltal´aban ROM. Vannak u´ gynevezett programozhat´o ROM-ok is (PROM), illetve t¨or¨olhet˝o (erasbale) PROM-ok (EPROM). ´ Irhat´ o-olvashat´o mem´ori´ak Az ´ırhat´o-olvashat´o mem´ori´akat a´ ltal´aban RAM-nak (random access memory-nak) is szokt´ak nevezni, hab´ar a ROM-ok eset´en is igaz az, hogy minden r´esze azonos id˝oben e´ rhet˝o el. Ezeket a mem´ori´akat k´et csoportba lehet sorolni: statikus e´ s dinamikus. A statikus RAM mem´ori´ak (SRAM) meg˝orzi az adatot a be´ır´as ut´an, minden tov´abbi menipul´aci´o n´elk¨ul, am´ıg a rendszer fesz¨ults´eg alatt van. Ilyen mem´oria a cache vagy a regiszterek. Ezzel szemben a f˝o mem´oria dinamikus (DRAM). A DRAM egy komplex eszk¨oz, mely kondenz´atorok seg´ıts´eg´evel t´arol egy bitet. A felt¨olt¨ott kondenz´ator jel¨oli az 1-es e´ rt´eket. Mivel a kondenz´atorok id˝ovel vesztenek a t¨olt´es¨ukb˝ol ez´ert id˝ok¨oz¨onk´ent friss´ıteni kell. Tipikusan 64 ms a friss´ıt´esi peri´odus. Az olvas´as sor´an azt tesztelj¨uk, hogy a kondenz´ator fel van-e t¨oltve. Ugyanakkor ez a tesztel´es t¨onkre is teszi a t¨olt´est. Ebben az e´ rtelemben a DRAM egy speci´alis mem´oria, mivel az olvas´as is destrukt´ıv, nem csak az ´ır´as. A legt¨obb mem´oria eset´en csak az ´ır´as destrukt´ıv. A destrukt´ıv olvas´as k¨ovetkezm´enye, hogy az olvas´as ut´an egy helyre´all´ıt´asi ciklus sz¨uks´eges. Ennek az a k¨ovetkezm´enye, hogy az olvas´as k´etszer olyan sok´aig tart mint m´as mem´ori´ak eset´en. Modern mem´oria t´ıpusok: • FPM DRAM: Fast page-mode DRAM • EDO DRAM: Extended Data Output DRAM • SDRAM: synchronous DRAM • DDR SDRAM • RDRAM: Rambus DRAM
2.5.5 Byte sorozatok t´arol´asa Term´eszetesen a´ ltal´aban nem csak egy byte-ot kell t´arolni, hanem t¨obb byte-ot is. P´eld´aul egy eg´esz sz´amot a C programoz´asi nyelvben a´ ltal´aban 4 byte-on t´arolunk. Felmer¨ulhet a k´erd´es, hogy hogyan t´aroljuk ezt a 4 byte-ot a mem´ori´aban? A 2.5. a´ bra k´et megold´ast is mutat. Az a´ br´an az MSB jel¨ol´es a “Most Significant Byte”-nek felel meg, m´ıg az LSB a “Least Significant Byte”. Mindk´et megold´as eset´en a 100-as c´ımet adtuk meg, e´ s ehhez k´epest t¨ort´enik a t´arol´as. A “Little-endian” t´arol´asi m´odban a legkisebb helyi´ert´ek˝u byte (LSB) t´arol´odik el˝osz¨or. Ezzel szemben a “Big-endian” t´arol´asi m´odban a legnagyobb helyi´ert´ek˝u byte (MSB) t´arol´odik legel˝osz¨or. N´ezz¨unk egy m´asik p´eld´at a “Little-endian” t´arol´asi m´odra. Az 1234h hexadecim´alis sz´am eset´en el˝osz¨or a 34h, majd a 12h byte-ot t´arolja a rendszer. Az 12345678h sz´am eset´en a t´arol´asi sorrend: 78h, 56h, 34h, 12h. Melyik t´arol´asi m´odszer a jobb? Mindkett˝o ugyanolyan j´o. Csak a processzor tervez˝o d¨ont´ese, hogy melyiket haszn´alja. A Pentium processzorok a “Little-endian” t´arol´asi m´odot haszn´alj´ak. A MIPS e´ s PowerPC processzorokon a “Big-endian” t´arol´asi m´od az alap´ertelmezett, de a´ t lehet konfigur´alni o˝ ket ´ aban a k¨ul¨onb¨oz˝o t´arol´asi m´od nem okoz probl´em´at, ha mindig “Little-endian” t´arol´asi m´odra is. Altal´ csak egyf´ele processzort haszn´alunk. Az igazi probl´em´ak akkor jelennek meg, ha k¨ul¨onb¨oz˝o t´arol´asi m´odszert haszn´al´o processzorok k¨oz¨ott akarunk egy programot hordozni. Ebben az esetben az adatokat konvert´alni kell!
22
MSB LSB 11110100 10011000 10110111 00001111
cím 103 102 101 100
cím
11110100 10011000 10110111 00001111
103 102 101 100
Little-endian
00001111 10110111 10011000 11110100 Big-endian
2.5. a´ bra: “Little-endian” e´ s “Big-endian” t´arol´asi m´od
2.5.6 Adat “alignment” problema Egy program v´egrehajt´asi sebess´eg´et t¨obb t´enyez˝o is befoly´asolja. A t´enyez˝ok k¨oz¨ul n´eh´any a programoz´o befoly´asa alatt van, m´ıg m´asokat nem tudnak befoly´asolni. Ebben a fejezetben az egyik fontos t´enyez˝ot vizsg´aljuk meg. Tegy¨uk fel, hogy egy 32 bites adatot szeretn´enk olvasni a mem´ori´ab´ol. Azt is tegy¨uk fel, hogy az adat busz szint´en 32 bites. Ha az olvasni k´ıv´ant adat c´ıme n´eggyel oszthat´o, akkor a mem´ori´aban pont u´ gy van elhelyezve, hogy egy sorba esik. Ez l´athat´o a 2.6. a´ br´an e´ s ezt szoktuk illesztett, “aligned” adatnak nevezni. Mivel az adatbusz 32 bites, ez´ert egyszerre 4 byte-ot, egy sort lehet beolvasni a mem´ori´ab´ol. Ez azt jelenti, hogy ha a c´ım nem oszthat´o n´eggyel, akkor az adat k´et sorba ker¨ul e´ s k´etszer kell olvasni a mem´ori´ab´ol, majd ezekb˝ol fogja a processzor o¨ ssze´all´ıtani a sz¨uks´eges 32 bites adatot. A k´etszeri olvas´asnak hat´asa van a program fut´as´ara, mivel a nem illesztett adatok miatt lassabban fog futni! n+3 k+2 24-31 n+2 k+1 16-23 n+1
8-15
k
0-7 n+0
CPU
adatbusz 32 bit
k+3
memória adat1 adat2
2.6. a´ bra: Adat illeszt´es - “data alignment”
Az adat illeszt´es probl´em´aja teljesen transzparans m´odon, vagyis nem jelenik meg a felhaszn´al´o sz´am´ara, kiv´eve, hogy a program lassabban fut. A 16 bites adatokat 2 byte-ra kell illeszteni. Ez azt
23
Cím busz Adat
Adat busz
Státusz Parancs
Kontroll busz
I/O eszköz
I/O kontroller
2.7. a´ bra: Input/Output eszk¨oz sematikus a´ br´aja
jelenti, hogy a c´ım legkisebb helyi´ert´ek˝u bite z´erus, vagyis a c´ım p´aros. A 32 bites adatokat 4 byte-ra ´ ´ıgy tov´abb. A Pentium processzorok kell illeszteni vagyis a c´ım k´et legkisebb helyi´ert´ek˝u bite z´erus. Es megengedik az illesztett (“aligned”) e´ s nem illesztett adatt´arol´ast is. Bizonyos processzorok az el˝obb le´ırt hat´ekonys´agi probl´ema miatt nem engedik meg, hogy az adat ne legyen illeszteve.
2.6 Input/Output Az Input/Output eszk¨oz¨ok teszik lehet˝ov´e, hogy a sz´am´ıt´og´epek kommunik´aljanak a “k¨ulvil´aggal”. Input/Output eszk¨oz lehet hogy csak adatszolg´altat´asra alkalmas, input-ra, p´eld´aul az eg´er, vagy csak output-ra k´epes, p´eld´aul a monitor, vagy input-ra e´ s output-ra is k´epes. ´Igy l´enyeg´eben az I/O eszk¨oz¨oknek k´et f˝o c´elja van, a k¨ulvil´aggal kommunik´alni e´ s adatot t´arolni. Mindegyik kommunik´aci´o a rendszer buszon kereszt¨ul t¨ort´enik, b´ar az I/O eszk¨oz¨ok nem k¨ozvetlen¨ul kapcsol´odnak a buszhoz, hanem van egy I/O kontroller az eszk¨oz e´ s a rendszer busz k¨oz¨ott, ahogy ez 2.7. a´ br´an l´athat´o. K´et fontos ok miatt van sz¨uks´eg ezekre az I/O kontrollerekre: 1. A k¨ul¨onb¨oz˝o I/O eszk¨oz¨oket k¨ul¨onb¨oz˝o m´odon kell kezelni. Ez azt jelenti, hogy a k¨ul¨onb¨oz˝o eszk¨oz¨okkel k¨ul¨onb¨oz˝o m´odon kell kommunik´alni, n´eha v´arni kell az adat meg´erkez´es´ere vagy vez´erl˝o jeleket kell adni. Ha a processzornak kellen mind ezt a feladatot ell´atni, akkor t¨obb id˝ot t¨oltene ezzel, mint a felhaszn´al´o kiszolg´al´as´aval, vagyis a programok futtat´as´aval. Az I/O eszk¨oz kontroller elv´egzi a processzor helyett ezeket a feladatokat. 2. A m´asik ok, hogy a rendszer buszon kereszt¨ul k¨uld¨ott elektromos jel igen alacsony, ami azt is jelenti, hogy a rendszer busz nem lehet t´ul hossz´u. Emiatt az I/O eszk¨oz kontrollerek k¨ozel vannak a processzorhoz, p´eld´aul a sz´am´ıt´og´ep h´azban, e´ s majd a kontroller tud k¨ul¨on, er˝osebb jelet k¨uldeni az eszk¨oznek. Az 2.7. a´ bra azt is mutatja, hogy az I/O eszk¨oz kontrollerekben a´ ltal´aban h´arom regiszter is van. P´eld´aul egy nyomtat´o eset´en a “St´atusz regiszter” jelzi, hogy az eszk¨oz k´eszen a´ ll-e, az “Adat regiszterbe” kell tenni a nyomtatand´o karaktert e´ s a “Parancs regiszterben” kell utas´ıt´ast adni az eszk¨oznek, hogy nyomtassa ki a karaktert. A processzor I/O portokon kereszt¨ul e´ ri el ezekete a regisztereket. Az I/O port nem m´as mint az I/O eszk¨oz¨on lev˝o regiszter c´ıme. Az I/O portok lehetnek a mem´ori´ara illesztettek, memory-mapped I/O. Ilyen rendszer p´eld´aul a MIPS processzorban van. A Pentium processzorok egy I/O c´ım tartom´anyt haszn´alnak. Ez a c´ım tartom´any k¨ul¨onb¨ozik a mem´oria c´ım tartom´any´at´ol. Ebben az esetben k¨ul¨on I/O utas´ıt´asokat kell haszn´alni. Ugyanakkor ez az ut´obbi technika a mem´ori´ara illesztett I/O-t is lehet˝o teszi. K´es˝obb l´atni fogjuk, hogy p´eld´aul a k´eperny˝o a mem´ori´ara illeszthet˝o e´ s u´ gy is ´ırhatunk a k´eperny˝ore, hogy egy speci´alis mem´oria ter¨uletre ´ırunk. Ezzel szemben a billenty˝uzettel lehet I/O utas´ıt´asokkal is kommunik´alni.
24
2.6.1 I/O eszk¨oz¨ok el´er´ese Amikor assembly-ben programozunk k¨ozvetlen¨ul vez´erelhetj¨uk az I/O eszk¨oz¨oket. B´ar erre lehet˝os´eg¨unk van, de le´ır´asok e´ s seg´ıts´eg n´elk¨ul gyakran nagyon bonyolult lehet, illetve minden esetben saj´at input e´ s output f¨uggv´enyeket kellene kifejleszten¨unk. Ezenk´ıv¨ul, ha mindenkinek teljesen szabad hozz´af´er´ese van az I/O eszk¨oz¨okh¨oz, akkor rosszindulat´u emberek ezt ki is haszn´alhatj´ak. Ez´ert van az, hogy a´ ltal´aban az oper´aci´os rendszer kontroll´alja az eszk¨oz¨okh¨oz val´o hozz´af´er´est, illetve biztos´ıtja a rutinokat is amiket haszn´alhatunk. A rutinok a´ ltal´aban valamilyen megszak´ıt´ast haszn´alnak. A megszak´ıt´asokat a 8.2. bekezd´esben t´argyaljuk.
¨ 2.7 Osszefoglal´ as Ebben a fejezetben a sz´am´ıt´og´ep alapvet˝o elemeit ismert¨uk meg olyan m´elys´egben amire sz¨uks´eg¨unk lehet az assembly programoz´as sor´an. Ezek az ismeretek lehetnek u´ jak, illetve bizonyos fogalmak el˝ofordulhattak m´as t´argyak keret´eben.
2.8 Ellen˝orz˝o k´erd´esek 1. Milyen r´eszekb˝ol a´ ll egy sematikus sz´am´ıt´og´ep? 2. Mi a fetch-decode-execute ciklus? Melyik l´ep´esben, mi t¨ort´enik? 3. A rendszer busz milyen f˝o r´eszekb˝ol a´ ll? Melyiknek mi a szerepe? 4. Ha a processzornak 64 c´ım vonala van, mekkora lehet maxim´alisan a mem´oria m´erete? Mi az utols´o byte c´ıme? 5. Mi hat´arozza meg, hogy a mem´oria e´ s a processzor k¨oz¨ott adatok m´erete mekkora? 6. Egy 2GH-es processzorban mekkora egy o´ ra jel ciklus? 7. Miben k¨ul¨onb¨ozik a “load/store” architekt´ura a t¨obbi architekt´ur´at´ol? 8. Adjon magyar´azatot arra hogy a RISC processzorokon az utas´ıt´asok egym´as ut´ani v´egrehajt´asa mi´ert lehet gyorsabb mint a CISC processzorokon! 9. Mit jelent a h´arom c´ımes architekt´ura? 10. Miben k¨ul¨onb¨ozik a h´arom e´ s k´et c´ımes architekt´ura? 11. Hogyan lehet olyan architekt´ur´at megval´os´ıtani, amelyikben az utas´ıt´asoknak nem kell argumentumot megadni? 12. Adja meg a k¨ovetkez˝o matematikai m˝uveleteket pszeudo assembly-ben k´et c´ımes architekt´ura eset´en: E = A * B + C - D 13. A RISC vagy a CISC processzorokra jellemz˝o a nagy sz´am´u regiszter? Melyik c´ımz´esi architekt´ura eset´en van sz¨uks´eg erre a nagysz´am´u regiszterre? 14. A Pentium processzor a RISC vagy CISC processzorok csal´adj´aba tartozik? 15. A MIPS processzor a RISC vagy CISC processzorok csal´adj´aba tartozik? 16. Hogyan lehet megval´os´ıtani a felt´eteles ugr´o utas´ıt´ast k¨ul¨onb¨oz˝o architekt´ur´akon? 17. Mi a PC regiszter szerepe a felt´eteles ugr´o utas´ıt´as v´egrehajt´asa sor´an?
25
18. Hogyan n´ez ki a mem´oria sematikus k´epe? Jel¨olje a minimum e´ s maximum indexet 16 bites adatbusz eset´en. 19. Mi jellemzi a ROM mem´ori´akat? 20. Mi a k¨ul¨onbs´eg a statik e´ s dinamikus RAM-ok k¨oz¨ott? 21. Mi a DRAM m˝uk¨od´es´enek alapelve? Mi´ert dinamikus mem´oria? 22. Mi´ert kell friss´ıteni a DRAM mem´ori´at? 23. Mi a k¨ul¨onbs´eg a “volatile” e´ s “nonvolatile” mem´oria k¨oz¨ott? 24. Mit jelent a “little-endian” t´arol´asi m´od? 25. Hogyan t´arol´odik a 44443333h hexadecim´alis sz´am a “big-endian” t´arol´asi m´oddal? 26. Milyen t´arol´asi m´odot haszn´al a Pentium processzor? 27. Mit jelent az adat “alignment”? 28. Mi´ert van hat´assal a nem illesztett adat t´arol´as a programok sebess´eg´ere? 29. Mi´ert van sz¨uks´eg I/O kontrollerre? 30. A processzor milyen m´odokon kommunik´alhat az I/O kontrollerrel?
26
3. Fejezet
A processzor Az Intel c´eg 1969-ben vezette be az els˝o processzor´at, a 4004 processzort. Ezt k¨ovette a 8080 e´ s 8085 processzorok. Ezek a processzorok vezettek az Intel Architekt´ura (IA) kidolgoz´as´ahoz, a 8086os processzorhoz, 1979-ben. A 8086 processzornak 20 bites c´ım busza e´ s 16 bites adatbusza van. A k¨ovetkez˝o gener´aci´o a 80186 processzor volt, melyben u´ jabb utas´ıt´asokat vezettek be, de a c´ım e´ s adat busz m´erete v´altozatlan maradt. Mivel ezt a processzort nem igaz´an haszn´alt´ak, ´ıgy az igazi k¨ovetkez˝o gener´aci´os processzor a 8086 ut´an a 80286 processzor volt. A 80286 processzornak 24 bites c´ım busza van, amivel 16 MByte mem´ori´at lehet megc´ımezni. Ugyanakkor az adatbusz megmaradt 16 bites. A m´asik u´ j´ıt´as a v´edett m´od (protected mode) bevezet´ese volt. Az Intel c´eg els˝o igazi 32 bites processzora a 80386-os processzor volt, melynek 32 bites c´ım e´ s adat busza van. Ezzel a processzorral 4GByte mem´ori´at lehet megc´ımezni, r´aad´asul ak´ar egyben, ami lehet˝ov´e tette a “flat” m´odot. A 80486 processzor 1989-ben jelent meg. A processzorba be´ep¨ult a matematikai ko-processzor, egy 8KB-os L1-es cache is ker¨ult a hardware-be, t´amogatta az L2 cache-t is e´ s lehet˝ov´e v´alt a p´arhuzamos futtat´as. A Pentium processzorok a “leg´ujabbak” az Intel-t˝ol, b´ar itt a Pentium nevet mint a processzorok egy csal´adj´anak a nevek´ent haszn´aljuk. Az els˝o Pentium processzort 1983-ban mutatt´ak be. Az´ota megjelentek a Pentium Pro, Pentium II, Pentium III e´ s Pentium 4 processzorok. A processzorokr´ol ad a´ ttekint´est a 3.1. t´abl´azat. A hagyom´anyos Intel architekt´ur´at´ol jelent˝osen elt´er az Itanium processzor, mely RISC alap´u, elt´er˝oen az Intel m´as processzorait´ol, e´ s m´as u´ j´ıt´asokat is tartalmaz. Ugyanakkor, ma (2009. szeptember) m´ar kijelenthetj¨uk, hogy ez a processzor nem v´altotta be a hozz´a f˝uz¨ott rem´enyeket e´ s nem terjedt el olyan m´ert´ekben a sz´am´ıt´og´epes piacon, hogy jelent˝os szerepl˝oje legyen.
Processzor
´ Ev
8086 80286 80386 80486 Pentium Pentium Pro Pentium II Pentium III Pentium 4
1979 1982 1985 1989 1993 1995 1997 1999 2000
Frekvencia (MHz) 8 12.5 20 25 60 200 266 500 1500
Regiszter m´eret 16 16 32 32 32 32 32 32 32
Adat busz m´eret 16 16 32 32 64 64 64 64 64
3.1. t´abla: Processzorok a´ ttekint´ese
27
Maximum mem´oria 1 MB 16 MB 4 GB 4 GB 4 GB 64 GB 64 GB 64 GB 64 GB
´ 3.1 Altal´ anos regiszterek A 3.2. t´abl´azat tartalmazza a 8086-os processzor a´ ltal´anos c´el´u regisztereinek list´aj´at. A t´abl´azatban az is l´athat´o, hogy a 16 bites regiszterek k¨oz¨ul melyeket lehet 8 bites “darabokban”, regiszterekk´ent haszn´alni. Fontos megjegyezni, hogy 8 bites regiszterek eset´en az egyik regiszter e´ rt´ek´enek megv´altoztat´asa nincs hat´assal a regiszter t¨obbi r´esz´ere. P´eld´aul ha az AL regiszter r´esznek e´ rt´eket adunk att´ol m´eg az AH regiszter r´esz nem fog megv´altozni! Speci´alis regiszter az IP vagy instruction pointer regiszter, mely a k¨ovetkez˝o v´egrehajtand´o utas´ıt´asra mutat. Ezt a regisztert kontroll regiszternek is szoktuk nevezni. V´eg¨ul a szegmens regiszterek list´aj´at a 3.3. t´abl´azat tartalmazza. Ezek a regiszterek t´amogatj´ak a szegment´alt mem´oria kezel´es´et. N´ev Akkumul´ator B´azis Sz´aml´al´o Adat Forr´as index C´el index B´azis pointer Stack pointer
Teljes regiszterek 0-15 bit AX BX CX DX SI DI BP SP
8-15 bit AH BH CH DH
0-7 bit AL BL CL DL
´ anos c´el´u regiszterek 3.2. t´abla: Altal´
N´ev K´od szegmens Data szegmens Extra szegmens Stack szegmens
Regiszterek 0-15 bit CS DS ES SS
3.3. t´abla: Szegmens regiszterek
3.2 Szegment´alt c´ımz´es el˝osz¨or Ebben a fejezetben csak az u´ gynevezett val´os m´od´u mem´oria architekt´ur´at (real-mode memory architecture) t´argyaljuk, mely a 8086-os processzorra jellemz˝o. A processzor 1MB mem´ori´at tud megc´ımezni. A mem´oria megc´ımz´es´ehez 20 bites e´ rt´ekre van sz¨uks´eg. Az els˝o mem´oria hely c´ıme: 00000h, m´ıg az utols´o mem´oria hely c´ıme: FFFFFh. Mivel minden regiszter 16 bites a 8086 processzorban, ez´ert az ´ıgy megc´ımezhet˝o mem´oria m´erete korl´atozott: 216 vagy 65536 byte. Ennek k¨ovetkezt´eben a mem´ori´at szegmensekre kell osztani, melyek m´erete 65536 byte. ´Igy, ebben a szegment´alt mem´ori´aban meg kell adni egy szegmens b´azis c´ımet e´ s egy offszetet. Ez a k´et e´ rt´ek adja meg a logikai c´ımet. A szegmens b´azis c´ım adja meg, hogy a szegmens hol kezd˝odik a mem´ori´an bel¨ul, m´ıg az offszet a szegmensen bel¨uli helyet adja meg. A 3.1. a´ bra a fizikai mem´oria c´ımek e´ s a szegment´alt, logikai c´ımz´es k¨oz¨otti kapcsolatot mutatja. Amint l´athat´o, a szegmens fizikai c´ıme 20 bites (12000h). Hogyan lehet 20 bites c´ımet t´arolni 16 bites regiszterekben? A v´alasz az, hogy sehogy, e´ s egy tr¨ukk¨ot kell alkalmazni. A l´enyeg, hogy a szegmens regiszter a 20 bites c´ımb˝ol a 16 legnagyobb helyi´ert´ek˝u bitet t´arolja (most significant bit) e´ s felt´etelezz¨uk,
28
fizikai cím
12345 offszet (345) szegmens bázis (1200)
12000
3.1. a´ bra: Kapcsolat a fizikai e´ s logikai c´ımek k¨oz¨ott hogy az utols´o 4 bit z´erus, amit nem kell t´arolni. Ez persze azt is jelenti, hogy a szegmensek fizikai c´ıme csak olyan lehet, aminek a 4 legkisebb helyi´ert´ek˝u bite z´erus lesz, vagyis: 00000h, 00010h, 00020h, 00030h, ... FFFE0h, FFFF0h. A szegmensen bel¨uli mem´oria helyet az offszet adja meg. A programoz´onak csak a logikai c´ımz´essel, vagyis a szegmens:offszet p´arral kell foglalkoznia, ami automatikusan konvert´al´odik 20 bites fizikai c´ımm´e, ahogy ez a 3.2. a´ br´an l´athat´o. L´enyeg´eben a szegmens regiszter tartalm´ahoz jobbr´ol hozz´ailleszt¨unk n´egy darab z´erus bitet, majd ehhez az e´ rt´ekhez hozz´aadjuk az offszet e´ rt´ek´et. Ha hexadecim´alis sz´amrendszerben dolgozunk, akkor a szegmens regiszter tartalm´ahoz egy null´at kell hozz´a´ırni e´ s ehhez kell az offszet e´ rt´ek´et hozz´aadni. N´ezz¨unk egy p´eld´at, ahol a logikai c´ım hexadecim´alis sz´amrendszerben: 1200:0345 e´ s ´ıgy a fizikai c´ım: 12345, mivel: 1
2
1
2
+
0 3 3
0 4 4
0 5 5
Minden logikai c´ımhez tartozik egyetlen fizikai c´ım. Ugyanakkor a ford´ıtottja nem igaz, vagyis egy fizikai c´ımhez t¨obb logikai c´ım is tartozhat. P´eld´aul a 1200:0345 e´ s 1000:2345 logikai c´ımek ugyanazt a fizikai c´ımet adj´ak meg. A logikai c´ım t´arol´as´ahoz teh´at kell egy szegmens regiszter e´ s egy offszet regiszter. A szegmens regisztereket a 3.3. t´abl´azat sorolta fel. Ezek a regiszterek teljesen f¨uggetlenek egym´ast´ol e´ s a megc´ımzett szegmensek lehetnek szomsz´edosak, a´ tfed˝ok, ugyanazok illetve egym´ast´ol t´avoli mem´oria tartom´anyok, ahogy ezt a 3.3. a´ bra mutatja. Offszet regiszterk´ent csak azok a regiszterek haszn´alhat´ok, melyeket a c´ımz´esben lehet haszn´alni: BX, BP, SP, SI, DI.
3.3 C´ımz´esi m´odok A CISC processzorok nagy sz´am´u c´ımz´esi m´odot t´amogatnak, szemben a RISC processzorokkal. A 8086-os processzor, mint egy CISC t´ıpus´u processzor, h´arom f˝o c´ımz´esi m´odot t´amogat: 1. Regiszter m´od: Ebben az esetben regiszterek adj´ak az utas´ıt´as a bemeneti param´eter´et e´ s az
29
19 szegmens regiszter
0 4 3 0000
19 16 15 0000
0 offszet regiszter
Összeadó
19
0 20 bites fizikai cím
3.2. a´ bra: Fizikai c´ım gener´al´asa 8086 processzoron
3.3. a´ bra: A szegmensek egym´ashoz val´o viszonya eredm´enyt is regiszterben t´aroljuk. P´eld´aul: MOV AX, BX. Ez a leghat´ekonyabb c´ımz´esi m´od, mivel az adat a processzoron bel¨ul marad, nincs sz¨uks´eg mem´oria m˝uveletre. 2. K¨ozvetlen m´od: Ebben az esetben az adat az utas´ıt´as r´esze e´ s b´ar az adat a mem´ori´aban van, de a k´od szegmensben, nem az adat szegmensben. Az adat mindig egy konstans sz´am e´ s csak forr´as lehet, vagyis a k¨ozvetlen¨ul megadott sz´amot t´aroljuk, vagy manipul´aljuk az utas´ıt´assal. Az utas´ıt´as m´asik operandusa mindig valamilyen m´as t´ıpus´u, c´ımz´es˝u kell legyen, p´eld´aul regiszter. P´eld´aul: MOV AX, 1234h 3. Mem´oria m´od: Amikor az egyik operandus a mem´ori´ara hivatkozik, akkor t¨obb c´ımz´esi lehet˝os´eg¨unk is van. Itt e´ rdemes az el˝oz˝o bekezd´esre eml´ekezni, hogy egy szegmens e´ s egy offszet c´ım komponenst kell megadni a v´egs˝o, fizikai c´ımhez. A szegmens r´eszt vagy explicit m´odon adjuk meg, vagy a haszn´alt regiszterek e´ s kontextus hat´arozza meg az egyik szegmens regisztert. A k¨ul¨onb¨oz˝o c´ımz´esi m´odok csak az offszet form´ait adja meg. A c´ımz´esi m´odok form´ait a 3.4. t´abl´azat foglalja o¨ ssze. Ezekben az esetekben az adat mindig az adat szegmensben van e´ s a hozz´af´er´es lassabb mint az el˝oz˝o k´et esetben. Mem´oria c´ımz´esre csak a BX, BP, SP, SI, DI regiszterek haszn´alhat´ok. A BP e´ s SP regiszter eset´en az SS szegmens regisztert felt´etelezz¨uk, m´ıg a t¨obbi regiszter eset´en (BX, SI, DI) a DS szegmens reg-
30
Direkt Regiszter [disp]
[BX] [BP] [SI] [DI]
C´ımz´esi m´od Indirekt B´azisrelat´ıv Indexelt [BX+disp] [BP+disp]
[SI+disp] [DI+disp]
B´azisrelat´ıv indexelt eltol´as n´elk¨ul eltol´assal [BX+SI] [BX+SI+disp] [BX+DI] [BX+DI+disp] [BP+SI] [BP+SI+disp] [BP+DI] [BP+DI+disp]
3.4. t´abla: C´ımz´esi m´odok Szegmens regiszter DS DS SS DS DS DS DS SS SS
Offszet [disp] [BX+disp] [BP+disp] [DI+disp] [SI+disp] [BX+SI+disp] [BX+DI+disp] [BP+SI+disp] [BP+DI+disp]
C´ımz´esi p´elda [DS:4423] [DS:BX+3] [SS:BP+5512] [DS:DI+6201] [DS:SI+18] [DS:BX+SI+35] [DS:BX+DI+43] [SS:BP+SI+12] [SS:BP+dI+22]
3.5. t´abla: C´ımz´esi m´od p´eld´ak
isztert felt´etelezz¨uk a c´ımz´esn´el, ha nincs szegmens regiszter megadva az utas´ıt´asban. Term´eszetesen a szegmens regiszter explicit m´odon is megadhat´o, ´ıgy p´eld´aul a BX regiszterrel az ES szegmens regiszter is haszn´alhat´o. C´ımz´esi p´eld´akat a 3.5. t´abl´azat tartalmaz.
3.3.1 Direkt c´ımz´esi m´od Ez az egyik legegyszer˝ubb c´ımz´esi m´od. Az adat az adat szegmensben tal´alhat´o e´ s a´ ltal´aban elegend˝o az offszetet megadni. Ilyenkor automatikusan a DS regisztert felt´etelezhetj¨uk. Term´eszetesen explicit m´odon el˝o is ´ırhatjuk a szegmens regisztert. M´ıg a v´egs˝o g´epi k´odban konkr´et sz´amnak, c´ımnek kell szerepelnie, assembly-ben lehet˝os´eg¨unk van szimb´olikus c´ımek haszn´alat´ara. Ha szimb´olikus c´ımet haszn´alunk az assembler majd kisz´amolja e´ s behelyettes´ıti a konkr´et c´ımet a g´epi k´odba. Vegy¨uk a k¨ovetkez˝o adat defin´ıci´okat a 4.2.1. fejezet alapj´an: valasz tabla1 nev1
DB ’i’ DB 0, 0, 0, 0, 0 DB ’Jim Doe’
majd n´ezz¨unk n´eh´any p´eld´at ezeknek az adatoknak a direkt c´ımz´es´ere: MOV MOV MOV MOV
AL, [valasz] [valasz], ’n’ [nev1], ’K’ [tabla1], 32
; ; ; ;
AL-be az ’i’ karakter ırjuk ’n’ karakterrel valasz-t felul´ Ezut´ an ’Kim Doe’ lesz a n´ ev az els} o t´ arolt ´ ert´ ek 32 lesz
Nagyon fontos, hogy a sz¨ogletes z´ar´ojelet haszn´aljuk, ha mag´at az adatot akarjuk bet¨olteni vagy ki´ırni. Hasonl´ıtsuk o¨ ssze az al´abbi k´et utas´ıt´ast: MOV BX, [tabla1] MOV BX, tabla1
31
Az els˝o utas´ıt´as a ‘tabla1’ c´ımen tal´alhat´o 16 bites, word e´ rt´eket t¨olti be a BX regiszterbe. A m´asodik utas´ıt´asban a ‘tabla1’ c´ım´et t¨oltj¨uk be a BX regiszterbe! Ez ut´obbi jel¨ol´esre p´eld´aul az indirekt c´ımz´esn´el van sz¨uks´eg¨unk.
3.3.2 Indirekt c´ımz´esi m´od A direkt c´ımz´esi m´odot az egyszer˝us´ege folyt´an legink´abb arra haszn´aljuk, hogy egy-egy v´altoz´ot k¨ozvetlen¨ul olvassunk vagy ´ırjunk. Ugyanakkor arra m´ar nem alkalmas, hogy egy t¨omb n-edik elem´et m´odos´ıtsuk,1 erre ink´abb az indirekt c´ımz´es alkalmas. Az indirekt c´ımz´es sor´an valamelyik c´ım regisztert haszn´aljuk arra, hogy p´eld´aul egy t¨omb c´ımet a regiszterbe t¨otlts¨uk, majd a regiszter m´odos´ıt´as´aval a t¨omb k¨ul¨onb¨oz˝o elemeit el´erj¨uk. Vegy¨uk azt a p´eld´at amelyben egy 10 elem˝u t¨omb elemit e´ rj¨uk el: tomb DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; | ; [BX+4] ... MOV BX, tomb MOV [BX], byte 11 ; tomb[0] = 11 ADD BX, 4 MOV [BX], byte 66 ; tomb[4] = 66 Fontos megjegyezni, hogy az adat m´eret´et is figyelembe kell venni a c´ımz´es sor´an. A fenti p´eld´aban 10 darab byte adatot kezelt¨unk, m´ıg a k¨ovetkez˝o p´eld´aban word m´eret˝u adatokat haszn´alunk: tomb DW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; | ; [BX+4] ... MOV BX, tomb MOV [BX], word 11 ; tomb[0] = 11 ADD BX, 4 MOV [BX], word 66 ; tomb[2] = 66 Enn´el a p´eld´an´al arra e´ rdemes eml´ekezni, hogy egy word adat k´et byte-b´ol a´ ll, e´ s a BX regiszterhez n´egyet hozz´aadva a BX a´ ltal mutatott c´ımet n´egy byte-al toljuk el. A k´et p´elda k¨oz¨otti k¨ul¨onbs´eget a 3.4. a´ bra mutatja. Az a´ br´an nem v´eletlen a 66 00 adat, mivel b´ar a programban csak 66 szerepel, de ez word m´eret˝u adatk´ent 0066 lesz, amit viszont az Intel processzorok a “Little endian” m´odon t´arolnak. Az indirekt c´ımz´eshez sz¨uks´eges c´ımet m´ask´eppen is bet¨olthetj¨uk a regiszterbe: MOV BX, tomb helyett LEA BX, [tomb] A f˝o k¨ul¨onbs´eg az, hogy az els˝o esetben a c´ımet az assembler a g´epi k´od gener´al´asa k¨ozben sz´amolja ki addig a m´asodik esetben a c´ımet fut´asi id˝oben hat´arozza meg a rendszer. B´ar ebben az esetben nincs k¨ozvetlen el˝onye, de o¨ sszetettebb c´ımz´es eset´en m´ar igen, p´eld´aul: MOV BX, tomb ADD BX, SI 1 Hacsak
nincs minden elemnek a t¨ombben saj´at neve.
32
tomb[4]
tomb[0] 0 1 byte
2 3
11
4 5 ... 66
tomb[0] tomb[1] tomb[2] 0 1 word
2 3
11 00
4 5 ... 66 00
3.4. a´ bra: Byte e´ s word m´eret˝u t¨omb¨ok k¨oz¨otti k¨ul¨onbs´eg helyett LEA BX, [tomb+SI] lehet haszn´alni.
3.4 St´atusz regiszter A st´atusz regiszter 16 bitb˝ol a´ ll. Ebb˝ol a 16 bitb˝ol kilencet haszn´al a 8086-os processzor. A tov´abbi 7 bit nincs defini´alva illetve nem haszn´alja a processzor. A st´atusz bitek f¨uggetlenek egym´ast´ol e´ s term´eszetesen az e´ rt´ek¨uk csak 1 vagy 0 lehet. A st´atusz bitek alapvet˝oen jelz´esek. L´enyeg´eben e´ rtes´ıtik a programoz´ot hogy a processzor valamilyen a´ llapotban van ´ıgy a program reag´alni tud ezekre az a´ llapotokra. Minden st´atusz bitnek k¨ul¨on jelent´ese van e´ s k¨ul¨on k´et bet˝us szimb´olummal jel¨olj¨uk o˝ ket. A 3.6. t´abl´azat mutatja a bitek jel¨ol´es´et. ´ eke 1 ha az utols´o eredm´eny az el˝ojeles sz´am a´ br´azol´asi tartom´anyon k´ıv¨ulre OF : Overflow bit. Ert´ esik. Minden m´as esetben az e´ rt´eke nulla. DF : Direction bit. Ez egy furcsa st´atusz bit, mivel ebben az esetben nem a processzor jelez a programoz´onak, hanem ford´ıtva, a programoz´o jelez a processzornak. Ez a bit adja meg hogy string m˝uveletek sor´an a c´ımek n¨ovekedjenek vagy cs¨okkenjenek. Amikor a bit e´ rt´eke 1, akkor a string m˝uveletek sor´an a c´ımek cs¨okkennek, ha a bit e´ rt´eke 0, akkor pedig cs¨okkennek a c´ımek. Ezt a bitet m´eg u´ jra megvizsg´aljuk a 7.6. fejezetben. IF : Interrupt enable bit. Ez egy k´et ir´any´u st´atusz bit, vagyis nem csak a processzor jelezhet egy a´ llapotot, hanem mi is k´epesek vagyunk jelezni a processzornak. Amikor ennek a bitnek az e´ rt´eke 1, akkor a megszak´ıt´asok enged´elyezettek e´ s b´armikor bek¨ovetkezhetnek. Ha a bit e´ rt´eke z´erus akkor CPU nem veszi figyelembe a megszak´ıt´asokat. TF : Trap bit. Ennek a bitnek a seg´ıts´eg´evel lehet programokat l´ep´esenk´ent v´egrehajtani. Ha be van a´ ll´ıtva (´ert´eke 1), akkor a processzor egy utas´ıt´ast hajt v´egre majd megh´ıv egy megszak´ıt´ast. ´ anos esetben a programoz´ok nem haszn´alj´ak, de p´eld´aul a DEBUG programn´al elengedAltal´ hetetlen. ´ eke 1 ha az utols´o eredm´enyben a legmagasabb helyi´ert´ek˝u bit e´ rt´eke 1, vagyis SF : Overflow bit. Ert´ negat´ıv sz´am az eredm´eny. Ha az eredm´eny pozit´ıv sz´am, akkor a legmagasabb helyi´ert´ek˝u bit e´ rt´eke z´erus e´ s a ez a bit is z´erus lesz. ´ eke 1 ha az utols´o eredm´eny z´erus volt. Ha az utols´o eredm´eny b´armilyen z´erust´ol ZF : Z´erus bit. Ert´ k¨ul¨onb¨oz˝o e´ rt´ek˝u, akkor ennek a bitnek az e´ rt´eke z´erus.
33
15
14
13
12
11 OF
10 DF
9 IF
8 TF
7 SF
6 ZF
5
4 AF
3
2 PF
1
0 CF
3.6. t´abla: St´atusz regiszter bitjei
AF : Auxiliary bit. Ezt a bitet csak a BCD aritmetika sor´an haszn´aljuk. A BCD aritmetik´at a 8.6.1. fejezetben t´argyaljuk. PF : Parity (parit´as) bit. Ez a bit azt jelzi, hogy az utols´o m˝uvelet eredm´eny´eben (mint bin´aris sz´amban) h´any darab 1-es bit van. P´eld´aul a 0F2h hexadecim´alis sz´am bin´arisan 1111 0010 amiben p´aratlan sz´am´u 1-es van e´ s ´ıgy a parit´as bit e´ rt´eke z´erus lesz. A 03Ah bin´arisan 0011 1100 e´ s mivel p´aros sz´am´u 1-es tal´alhat´o az eredm´enyben ´ıgy a parit´as bit e´ rt´eke egy lesz. Ez bit tulajdonk´eppen abb´ol az id˝ob˝ol sz´armazik, amikor m´eg minden kommunik´aci´o soros porton kereszt¨ul zajlott. A soros kommunik´aci´o eset´en a hiba e´ rz´ekel´es´enek egyik m´odja volt, hogy a k¨uld´es el˝ott meg´allap´ıtjuk az adat parit´as´at, majd a´ tk¨uldj¨uk az adatot e´ s a parit´as bitet. A “t´uloldalra” meg´erkezett adatot a parit´as bittel lehet ellen˝orizni. ´ eke 1 ha az utols´o eredm´eny az el˝ojel n´elkuli CF : Carry bit. Ert´ ¨ sz´am a´ br´azol´asi tartom´anyon k´ıv¨ulre esik. P´eld´aul ha egy aritmetikai vagy shift m˝uvelet sor´an egy 9. vagy 17. bit is keletkezik, akkor ennek a bitnek az e´ rt´eke 1 lesz. Minden m´as esetben az e´ rt´eke nulla. P´elda a 8.6. fejezetben l´athat´o.
3.5 Ellen˝orz˝o k´erd´esek 1. Mi a szegmens? Mi´ert kell a Pentium processzorokon szegment´alt mem´oria architekt´ur´at haszn´alni? 2. Val´os m´odban mi´ert 64KByte m´eret˝u egy szegmens? 3. Val´os m´odban egy szegmens nem kezd˝odhet b´arhol a mem´ori´aban. Mi´ert? 4. A 8086-os processzoron n´egy szegmens lehet egyszerre kezelni. Mi´ert? 5. Mutassa be a fizikai c´ım kisz´am´ıt´as´anak m´odj´at logikai c´ımb˝ol! 6. Konvert´alja az al´abbi logikai c´ımet fizikai c´ımm´e: 3911:0200, 3000:0333 7. Az IP regiszterhez, melyik szegmens regiszter tartozik? 8. Lehet-e a CS e´ s DS regiszter e´ rt´eke ugyanaz? 9. Lehet-e a ES regiszter e´ rt´eke: 1234h? 10. Melyik szegmens regiszter j´arul az SP regiszterhez? 11. Mire val´o a st´atusz regiszter? 12. Soroljon fel n´eh´any dolgot, hogy mit jelezhet a st´atusz regiszter! 13. Mi a k¨ul¨onbs´eg a sor orient´alt e´ s oszlop orient´alt t¨omb t´arol´asi m´odok k¨oz¨ott? 14. Adva van a k¨ovetkez˝o adat: tomb resb 12 t¨oltse ki a hi´anyz´o r´eszeket, hogy a 4. e´ s 5. elemet hasonl´ıtsuk o¨ ssze: MOV SI, ____ MOV AX, [tomb+SI] CMP AX, ____
34
4. Fejezet
NASM assembler 4.1 Egy forr´as file szerkezete Az assembly nyelvben, illetve a legt¨obb assembler alatt e´ s ´ıgy a NASM assembler alatt is, a forr´ask´odban a sor a k¨ovetkez˝o n´egyf´ele dolgot tartalmazhatja: es as operandus ; megjegyz´ ıt´ ımke: utas´ c´ A n´egyf´ele r´esz k¨oz¨ul a legt¨obb opcion´alis, hiszen egy sorban lehet csak megjegyz´es, csak c´ımke, ezek kombin´aci´oja, esetleg c´ımke e´ s utas´ıt´as e´ s ´ıgy tov´abb. Az operandus jelenl´ete mindig az utas´ıt´ast´ol f¨ugg. Ha a sor v´eg´en a ’backslash’ (\) karakter a´ ll, ez azt jelenti, hogy a k¨ovetkez˝o sor is az adott sorhoz tartozik, annak folytat´asa. A NASM assemblerben nincs semmilyen megk¨ot´es a SPACE-ek e´ s tabul´atorok haszn´alat´ara. Ezekb˝ol a karakterekb˝ol, a sor r´eszei k¨oz¨ott b´armennyit haszn´alhatunk. R´aa´ ad´asul a c´ımke ut´an a kett˝ospont is opcion´alis. Ez sajnos hib´akhoz vezethet! P´eld´aul, hab´ar a lodsb utas´ıt´ast szeretn´enk le´ırni egy sorba, de a lodab sz¨oveget ´ırtuk le, az assembler nem fog sz´olni mivel u´ gy tekint r´a mintha abban a sorban csak egy c´ımk´et defini´altunk volna. A NASM assemblernek van egy kapcsol´oja (-w+orphan-labels) melynek megad´asa eset´en az assembler sz´olni fog ha egy sorba, kett˝ospont n´elk¨ul, ´ırunk le egy c´ımet. A c´ımk´ekben haszn´alhat´o e´ rv´enyes karakterek a bet˝uk e´ s sz´amok, ‘_’, ‘$’, ‘#’, ‘@’, ‘˜’, ‘.’ e´ s ‘?’. A c´ımke els˝o karaktere bet˝u, ‘_’, ‘?’ vagy pont (.) lehet. Ha egy c´ımke ponttal kezd˝odik, annek sepci´alis jelent´ese van. A NASM assembler k´epes leford´ıtani a 8086, 386, 486, Pentium, P6, FPU e´ s MMX utas´ıt´ask´eszleteket. Az utas´ıt´asok el˝ott szerepelhet egy prefix: REP, REPE/REPZ, REPNE/REPNZ, LOCK. A szegmens regiszter is megadhat´o prefixk´ent: es mov [bx], ax ami egyen´ert´ek˝u azzal, hogy mov [es:bx], ax Az ut´obbi jel¨ol´es prefer´alt, mivel m´as szintaktikai elemekkel ez konzisztens. Ha nem adtunk meg prefixet, p´eld´aul nem adtunk meg szegmens regisztert, akkor a NASM automatikusan gener´alni fogja.
4.2 Pszeudo utas´ıt´asok A pszeudo utas´ıt´asok nem igazi processzor utas´ıt´asok, de egy forr´as sorban az ‘utas´ıt´as’ r´eszben szerepelhet.
35
4.2.1 DB e´ s t´arsai A DB, DW, DD, DQ, DT adatokat ad meg a forr´ask´odban. A f˝o k¨ul¨onbs´eg, hogy milyen m´eret˝u adatot/adatokat defini´alnak. DB : egy byte-ot vagy byte sorozatot defini´al. DW : egy word-ot vagy word sorozatot defini´al. Egy word k´et byte-b´ol a´ ll. Itt azt is figyelembe kell venni, hogy az Intel processzor ‘Little endian’ t´arol´asi m´odot haszn´al, vagyis a t´arol´as sor´an a byte-okat felcser´eli. DD : egy vagy t¨obb double word-ot defini´al. Egy double word 4 byte-b´ol a´ ll. Ez az adatm´eret haszn´alhat´o egyszeres precizit´as´u floating-point sz´amok (float) megad´as´ara is a matematikai koprocesszor sz´am´ara. DQ : egy vagy t¨obb quad word-ot defini´al. Egy quad word 8 byte-b´ol a´ ll. Ez az adatm´eret haszn´alhat´o dupla precizit´as´u floating-point sz´amok (double) megad´as´ara is a matematikai koprocesszor sz´am´ara. DT : egy vagy t¨obb ten byte-ot defini´al. Egy ten byte adat 10 byte-b´ol a´ ll. Az al´abbi lista t¨obb p´eld´at is mutat az adatok defini´al´as´ara: db db db db dw dw dw dw dd dd dq
0x55 0x55,0x56,0x57 ’a’,0x55 ’hello’,13,10,’$’ 0x1234 ’a’ ’ab’ ’abc’ 0x12345678 1.234567e20 1.234567e20
; ; ; ; ; ; ; ; ; ; ;
egy byte 0x55 3 bytes egym´ as ut´ an egy karakter ´ es egy byte keverve karakter sorozat ´ es sz´ amok keverve 0x34 0x12 0x41 0x00 0x41 0x42 0x41 0x42 0x43 0x00 0x78 0x56 0x34 0x12 floating-point konstans double-precision konstans
A fenti p´eld´aban e´ rdemes megfigyelni a 6. e´ s 8. sort. A 6. sorban u´ gy t˝unik, hogy csak egy karaktert defini´alunk, de mivel a sor elej´en a DW pszeudo utas´ıt´as szerepel, ami ‘word’ adatm´eretet, vagyis k´et byte-ot jelent. Ennek megfelel˝oen a leford´ıt´as ut´an val´oj´aban k´et byte-ot foglal le az assembler, amelyb˝ol az egyik z´erus lesz. A fenti p´eld´akb´ol az is l´athat´o, hogy a karakterek (ASCII k´odok) e´ s sz´amok szabadon keverhet˝ok. A karaktersorozatok t¨obbf´elek´eppen is megadhat´ok, egyszeres vagy dupla aposztrofok k¨oz¨ott, illetve egyben vagy karakterenk´ent: db ’hello’ db ’h’,’e’,’l’,’l’,’o’ db "hello"
4.2.2 RESB e´ s t´arsai A RESB, RESW, RESD, RESQ e´ s REST pszeudo utas´ıt´asok inicializ´al´as n´elk¨uli adatoknak foglal helyet. Az ‘inicializ´al´as n´elk¨uli adat’ azt jelenti, hogy csak az adat t´arol´as´ara sz¨uks´eges helyet foglalja le az assembler, de a helyen t´aroland´o adat b´armi lehet kezdetben. (Lehet z´erus vagy a mem´oria egy r´eszlete, b´armi.) Ezek a pszeudo utas´ıt´asok t¨obb adatnak foglalnak helyet, p´eld´aul: buffer: resb 64 wordvar: resw 1 db "hello"
; 64 byte-nyi helyet foglal ; 1 word-nyi helyet foglal
36
4.2.3 Konstansok Ugyan´ugy mint a legt¨obb programoz´asi nyelvben, p´eld´aul a C programoz´asi nyelvben, assembly-ben is lehet konstansokat defini´alni a forr´ask´odban. A konstansokat egy helyen defini´aljuk e´ s a programban mindenhol csak egy n´evvel, szimbolikusan hivatkozunk r´ajuk. Ezeknek a konstansoknak kett˝os lehet szerepe: • ha k´es˝obbi fejleszt´esek sor´an a konstans e´ rt´ek´et meg kellene v´altoztatni, akkor csak a defin´ıci´o hely´en kell megv´altoztatni az e´ rt´eket, hiszen a programban csak a szimb´olikus n´ev szerepel e´ s • ha a konstans neve ‘olvasm´anyos’, vagyis jelent´essel b´ır, akkor a program olvas´asa sor´an k¨onnyebb e´ rtelmezni a forr´ask´odot. P´eld´aul nem csak egy sz´am szerepel az adott helyen, argumentumban, hanem a sz´am funkci´oj´at le´ır´o n´ev. A C programoz´asi nyelvben a konstansok defin´ıci´oja makr´okkal lehets´eges: #define PI 3.1415 A NASM assemblerben az ennek megfelel˝o konstans defin´ıci´o: hossz EQU 12
4.2.4 TIMES pszeudo utas´ıt´as Ha a TIMES pszeudo prefixet haszn´aljuk, akkor arra utas´ıtjuk a NASM Assemblert, hogy az adott utas´ıt´ast vagy adatot t¨obbsz¨or ford´ıtsa bele az eredm´eny programba. P´eld´aul: zerobuffer:
TIMES 64 db 0
Ennek a sornak a hat´as´ara 64 darab z´erus byte ker¨ul az eredm´eny programba. Ezt a sort e´ rdemes o¨ sszevetni az al´abbi sorral, ami csak a helyet lefoglalja le, de a helyen t´arolt adatr´ol nem mond semmit. (L´asd: 4.2.2. fejezetet) zerobuffer: resb 64 A TIMES pszeudo utas´ıt´as egy´eb, o¨ sszetett m´odon is haszn´alhat´o, illetve egyszer˝uen utas´ıt´asokn´al is. P´eld´aul az al´abbi sor azt adja meg, hogy a MOVSB (7.6.1. fejezet) utas´ıt´ast h´aromszor kell a programba beleford´ıtani: TIMES 3 movsb
4.3 SEG kulcssz´o Ha egy olyan programot ´ırunk amelyik t¨obb szegmensb˝ol a´ ll, akkor egy mem´oria hely (p´eld´aul v´altoz´o) el´er´es´en´el sz¨uks´eg lehet a mem´oria hely prefer´alt szegmens c´ım´ere is.1 A prefer´alt itt annyit jelent, hogy az assembler prefer´alja ezt a c´ımet. Ilyen esetben lehet haszn´alni a seg kulcssz´ot. P´eld´aul: mov ax, SEG valami mov es, ax mov bx, valami aminek hat´as´ara a ES:BX regiszterek a valami v´altoz´o mem´oria c´ım´et fogja tartalmazni. 1A
szegmens e´ s offszet regisztereket haszn´al´o mem´oria c´ımz´esr˝ol r´eszletesebb le´ır´as tal´alhat´o a 3.2. fejezetben.
37
¨ 4.3.1 Tov´abbi hasznos´ıt´asi teruletek A seg kulcssz´o haszn´alhat´o t´avoli f¨uggv´eny h´ıv´asn´al is, amikor a f¨uggv´enynek a szegmense e´ s offszet c´ıme is kell. P´eld´aul: call (SEG nyomtat):nyomtat Ha egy mem´oria hely teljes c´ım´et, szegmens e´ s offszetet, is t´arolni kell akkor a k¨ovetkez˝o m´odon lehet ezt megadni: db valami, SEG valami Itt se felejts¨uk el, hogy a ford´ıtott sorrend a ‘Little endian’ t´arol´asi m´od miatt van.
4.4 WRT kulcssz´o El˝ofordulhat, hogy nem a prefer´alt szegmensen kereszt¨ul akarunk hivatkozni egy mem´oria helyre. (Ezt megtehetj¨uk, hiszen a szegmensek a´ tfedik egym´ast a 8086-os g´epeken.) Ilyen esetben a wrt (With Reference To) kulcssz´ot lehet hazn´alni. P´eld´aul: mov ax, egy_masik_szegmens mov es, ax mov bx, valami wrt egy_masik_szegmens
4.5 Parancssori opci´ok ¨ 4.6 Hibauzenetek
38
5. Fejezet
DEBUG program Ez a fejezet a DEBUG program haszn´alat´at mutatja be. A DEBUG program seg´ıts´eg´evel m´ar leford´ıtott programokat tudunk “debuggolni”, l´ep´esenk´ent v´egrehajtani e´ s k¨ozben a rendszer a´ llapot´at megvizsg´alni, illetve hib´akat (bug-okat) keresni. B´ar a program igen egyszer˝u, azt is mondhatn´ank “fapados”, az´ert is e´ rdemes megismerni ezt a programot, mivel minden Microsoft Windows rendszeren l´etezik.
5.1 Jel¨ol´esek c´ ım - c´ımle´ır´as • segmens:offset - pl. 0044:0f57 • segmens reg:offset - pl. ES:0f30 • offset - pl. 400 tartom´ any - egy mem´oriatartom´any kijel¨ol´ese ım ım c´ • c´ • c´ ım, c´ ım • c´ ım L hossz lista - egym´as ut´an le´ırt hexadecim´alis sz´amok sz¨ oveg - dupla aposztrofok k¨oz¨ott karaktersorozat
5.2 A DEBUG ind´ıt´asa • D:\DEBUG <ENTER> : A program elindul e´ s egy minusz jel jelzi, hogy a program v´arja a felhaszn´al´o parancsait • D:\DEBUG file<ENTER> : Bet¨olti a file programot e´ s bel´ep a DEBUG programba
5.3 A DEBUG parancsai q - (Quit) kil´ep´es a programb´ol h val1 val2 - (Hex) ki´ırja a k´et e´ rt´ek o¨ sszeg´et e´ s k¨ul¨onbs´eg´et
39
-h 9 000A -h 1 000A
1 0008 9 FFF8
d tartom´any - (Dump) mem´oria tartalm´anak ki´ır´asa a k´eperny˝ore -d c000:0010 C000:0010 24 C000:0020 4D C000:0030 52 C000:0040 2F C000:0050 29 C000:0060 50 C000:0070 40 C000:0080 E8 -
12 20 4F 56 00 43 00 26
FF 43 58 42 87 49 12 56
FF 4F 2F 45 DB 52 10 8B
00 4D 4D 20 87 2B 00 D8
00 50 47 42 DB 10 80 E8
00 41 41 49 87 01 00 C6
00-60 54-49 2D-47 4F-53 DB-87 10-00 00-38 56-74
00 42 31 20 DB 00 37 22
00 4C 30 28 87 18 34 8C
00 45 30 56 DB 00 2D C8
00 20 20 31 87 00 32 3D
20 4D 56 2E DB 00 00 00
49 41 47 32 87 00 FF C0
42 54 41 20 DB 03 FF 74
$.......‘.... IB M COMPATIBLE MAT ROX/MGA-G100 VGA /VBE BIOS (V1.2 )............... PCIR+........... @.......874-2... .&V....Vt"..=..t
-d 100 130 xxxx:0100 EB 24 0D 0A 54 68 69 73-20 69 73 20 6D 79 20 66 xxxx:0110 69 72 73 74 20 44 45 42-55 47 20 70 72 6F 67 72 xxxx:0120 61 6D 21 0D 0A 24 B4 09-BA 02 01 CD 21 B4 00 CD xxxx:0130 21 -
.$..This is my f irst DEBUG progr am!..$......!... !
s tartom´any sz¨oveg - (Search) mem´oria tartom´anyban megkeresi a sz¨oveg valamennyi el˝ofordul´as´at -s fe00:0 ffff "BIOS" FE00:0021 FE00:006F -d fe00:0 FE00:0000 FE00:0010 FE00:0020 FE00:0030 FE00:0040 FE00:0050 FE00:0060 FE00:0070
41 4D 20 41 6E 41 1B 49
77 20 42 77 63 77 41 4F
61 43 49 61 2E 03 77 53
72 4F 4F 72 6F 0C 61 20
64 4D 53 64 66 04 72 76
20 50 20 20 74 01 64 34
53 41 43 53 77 01 20 2E
6F-66 54-49 4F-50 6F-66 61-72 6F-66 4D-6F 35-31
74 42 59 74 65 74 64 50
77 4C 52 77 20 77 75 47
61 45 49 61 49 E9 6C 00
72 20 47 72 6E 12 61 DB
65 34 48 65 63 14 72 32
49 38 54 20 2E 20 20 EC
42 36 20 49 20 43 42 33
Award SoftwareIB M COMPATIBLE 486 BIOS COPYRIGHT Award Software I nc.oftware Inc. Aw.....oftw... C .Award Modular B IOS v4.51PG..2.3
c tartom´any c´ım - (Compare) o¨ sszehasonl´ıt k´et mem´oria tartom´anyt f tartom´any sz¨oveg - (Fill) mem´oria tartom´any felt¨olt´ese a sz¨oveggel -f 100 12f -d 100 12f xxxx:0100 xxxx:0110 xxxx:0120
’BUFFER’ 42 55 46 46 45 52 42 55-46 46 45 52 42 55 46 46 BUFFERBUFFERBUFF 45 52 42 55 46 46 45 52-42 55 46 46 45 52 42 55 ERBUFFERBUFFERBU 46 46 45 52 42 55 46 46-45 52 42 55 46 46 45 52 FFERBUFFERBUFFER
e c´ım lista - (Enter) e´ rt´ekek bevitele a mem´ori´aba. Ezzel a paranccsal byte sorozatot lehet be´ırni a mem´ori´aba.1 -e 100 B4 09 BA 0B 01 CD 21 B4 00 CD 21
g [c´ım] - (Go) programv´egrehajt´as folytat´asa. Ha a c´ ım is adva van akkor a megadott c´ımre egy t¨or´espontot tesz a debugger e´ s az IP regiszter a´ ltal megadott c´ımt˝ol folytatja a v´egrehajt´ast. A t¨or´espont azt jelenti, hogy ha a v´egrehajt´as sor´an a t¨or´espont c´ım´et el´erj¨uk, akkor a v´egrehajt´as 1 Mivel
a g´epi k´od is csak egy byte sorozat, ez´ert amit ´ıgy be´ırunk a mem´ori´aba az lehet egyszer˝uen adat, de lehet program is!
40
le´all (megt¨orik) e´ s egy parancssor jelenik meg aminek seg´ıts´eg´evel sz´etn´ezhet¨unk a rendszerben. Megvizsg´alhatjuk a regiszterek a´ llapot´at vagy a mem´oria tartalm´at. Persze az is el˝ofordulhat, hogy a v´egrehajt´as sor´an soha nem jutunk el a t¨or´espontig. Ebben az esetben a “program” v´egigfut e´ s v´eg¨ul vagy hib´aval vagy sikeresen le´all a fut´as. a [c´ım] - (Assemble) az opcion´alisan megadott c´ımt˝ol kezdve assembly parancsokat g´epelhet¨unk be. Ebben az esetben a DEBUG program, mint egy assembler m˝uk¨odik. -a 100 xxxx:0100 xxxx:0102 xxxx:0123 xxxx:0126 xxxx:0128 xxxx:012B xxxx:012D xxxx:012F
jmp 126 ; adat ´ atugr´ asa db 0d,0a,"This is my first DEBUG program!" db 0d,0a,"$" mov ah,9 ; 09-es funkcionalit´ as mov dx,102 ; DS:DX -en a $-al lez´ art string int 21 ; string ki´ ır´ asa int 20 ; kil´ ep´ es
u [tartom´any] vagy u [c´ım] - (Unassemble) az aktu´alis vagy a megadott c´ımt˝ol az opcion´alisan megadott tartom´anyban assembly mnemonikra ford´ıtja a g´epi k´odot. -u 126 12F xxxx:0126 B409 xxxx:0128 BA0201 xxxx:012B CD21 xxxx:012D B400 xxxx:012F CD21 -
MOV MOV INT MOV INT
AH,09 DX,0102 21 AH,00 21
i port - (Input) a megadott port-r´ol beolvas egy byte-ot o port byte - (Output) a megadott port-ra ki´ır egy byte-ot Portra val´o ki´ır´as, vagy portb´ol val´o beolvas´as k¨ozvetlen kommunik´aci´ot jelent a hardware-rel. -o -i 18 -o -i 55
70 04 71 70 02 71
; ; ; ; ; ;
K´ erdezz¨ uk le az ´ or´ at Olvassuk vissza az ´ ert´ eket 18 ´ ora K´ erdezz¨ uk le a percet Olvassuk vissza az ´ ert´ eket 55 perc
n filen´ev - (Name) a file nev´enek megad´asa. Erre a parancsra akkor van sz¨uks´eg, ha a mem´oria egy darabj´at mint programot szeretn´enk ki´ırni. p - egy f¨uggv´eny h´ıv´as vagy megszak´ıt´as v´egrehajt´asa eg´eszben. Ebben az esetben a f¨uggv´eny utas´ıt´asait nem l´ep´esr˝ol-l´ep´esre hajtjuk v´egre, hanem egyben. r [reg] - (Register) alapesetben a regiszterek tartalm´at ´ırja ki a k´eperny˝ore. A st´atusz bitek sz¨ovegesen jelennek meg, melyek e´ rtelmez´es´et a 5.1. t´abl´azatban jelennek meg. Ha a regiszter is meg van adva, akkor lehet˝ov´e teszi a megadott regiszter e´ rt´ek´enek megad´as´at. -r cx CX 0100 :273
t - (Trace) egy utas´ıt´as v´egrehajt´asa w - (Write) a BX e´ s CX regiszterekben egy¨uttesen megadott byte-nyi adatot ´ır ki az ‘n’ paranccsal megnevezett file-ba. Ha a file m´ar l´etezett akkor a DEBUG felul´ ¨ ırja!
41
St´atusz bit Carry Parity Aux. carry Zero Sign Trap Direction Interrupt Overflow
1 CY PO AU ZR PL
0 NC NE NA NZ NG
UP EI OV
DW DI NV
5.1. t´abla: A st´atusz bitek sz¨oveges megjelen´ese
5.4 P´eld´ak N´ezz¨unk n´eh´any p´eld´at a DEBUG program haszn´alat´ara. A p´eld´akban a szegmens c´ımet n´egy darab ‘x’ jel¨oli (xxxx), mivel a mem´ori´aban b´arhova bet¨olt˝odhetnek a programok. A p´eld´akban a DEBUG programot kell elind´ıtani a megadott m´odon, illetve a minusz (‘-’) jel ut´ani r´eszt kell beg´epelni.
5.4.1 1. P´elda ´Irjunk egy programot mely egy csillag karaktert nyomtat ki. A programot assembly mnemonikok seg´ıts´eg´evel adjuk meg. Ut´ana a programot lefuttatjuk a DEBUG programban, majd ki´ırjuk a merev lemezre, az aktu´alis k¨onyvt´arba. C:\> DEBUG -a 100 xxxx:100 mov ah,02 xxxx:102 mov dl,2a xxxx:104 int 21 xxxx:106 int 20 xxxx:108 ; csak ENTERT nyomjunk -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=xxxx ES=xxxx SS=xxxx CS=xxxx IP=0100 NV UP EI PL NZ NA PO NC xxxx:0100 MOV AH,02 -g * Program terminated normally -r cx :8 -n csillag.com -w -q C:\>csillag.com * C:\>
5.4.2 2. P´elda Haszn´aljuk a DEBUG programot arra, hogy megn´ezz¨uk az el˝oz˝o program fut´as´at l´ep´esr˝ol-l´ep´esre. Az “egyszer˝u” utas´ıt´asokn´al a ‘t parancsot, a megszak´ıt´asok v´egrehajt´as´an´al a ‘p’ parancsot haszn´aljuk. A megszak´ıt´asokn´al az´ert kell a ’p‘ parancsot haszn´alni, hogy a megszak´ıt´as sor´an v´egrehajtand´o utas´ıt´asokat ne l´ep´esenk´ent, hanem egyszerre hajtsuk v´egre. C:\> DEBUG csillag.com
42
-r AX=0000 BX=0000 DS=xxxx ES=xxxx xxxx:0100 B402 -u xxxx:0100 B402 xxxx:0102 B22A xxxx:0104 CD21 xxxx:0106 CD20 xxxx:0108 0000 xxxx:010A 0000 xxxx:010C 0000 xxxx:010E 0000 xxxx:0110 0000 xxxx:0112 0000 xxxx:0114 0000 xxxx:0116 0000 xxxx:0118 0000 xxxx:011A 0000 xxxx:011C 0000 xxxx:011E 0000 -t AX=0200 BX=0000 DS=xxxx ES=xxxx xxxx:0102 B402 -t AX=0200 BX=0000 DS=xxxx ES=xxxx xxxx:0104 CD21 -p * AX=022A BX=0000 DS=xxxx ES=xxxx xxxx:0106 CD20 -p
CX=0008 DX=0000 SP=FFFE SS=xxxx CS=xxxx IP=0100 MOV AH,02 MOV MOV INT INT ADD ADD ADD ADD ADD ADD ADD ADD ADD ADD ADD ADD
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
AH,02 DL,2A 21 20 [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL
CX=0008 DX=0000 SP=FFFE SS=xxxx CS=xxxx IP=0100 MOV DL,2A
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
CX=0008 DX=002A SS=xxxx CS=xxxx INT 21
SP=FFFE IP=0100
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
CX=0008 DX=002A SS=xxxx CS=xxxx INT 20
SP=FFFE IP=0100
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
Program terminated normally -q C:\>
5.4.3 3. P´elda ´Irjuk meg az els˝o p´eld´aban szerepl˝o programot g´epi k´odban. Ebben az esetben a programot mint byte sorozatot vissz¨uk be. C:\> DEBUG -e 100 b4 02 b2 2a cd 21 cd 20 -u xxxx:0100 B402 MOV AH,02 xxxx:0102 B22A MOV DL,2A xxxx:0104 CD21 INT 21 xxxx:0106 CD20 INT 20 xxxx:0108 0000 ADD [BX+SI],AL xxxx:010A 0000 ADD [BX+SI],AL xxxx:010C 0000 ADD [BX+SI],AL xxxx:010E 0000 ADD [BX+SI],AL xxxx:0110 0000 ADD [BX+SI],AL xxxx:0112 0000 ADD [BX+SI],AL xxxx:0114 0000 ADD [BX+SI],AL xxxx:0116 0000 ADD [BX+SI],AL xxxx:0118 0000 ADD [BX+SI],AL xxxx:011A 0000 ADD [BX+SI],AL xxxx:011C 0000 ADD [BX+SI],AL xxxx:011E 0000 ADD [BX+SI],AL -q
43
C:\>
44
6. Fejezet
Els˝o programok Ez a fejezet n´eh´any egyszer˝u programot mutat be r´eszletes magyar´azattal. A magyar´azat n´eha nagyon r´eszletes e´ s t¨obb k¨ul¨onb¨oz˝o vari´aci´ot mutat be, hogy a teljesen kezd˝ok is megszerezz´ek a sz¨uks´eges alapokat bonyolultabb programok meg´ır´as´ahoz.
6.1 Els˝o program N´ezz¨uk meg az els˝o assembly programot NASM assemblerre ´ırva. A program az 6.1. t´abl´an l´athat´o. Ez a program az egyik legkisebb program amit ´ırni lehet Microsoft Window alatt.1 1 2
org 100h INT 20h
6.1. t´abla: Els˝o program Az 1. sor nem assembly utas´ıt´as, hanem azt jel¨oli, hogy a program a 100-as hexadecim´alis c´ımen kezd˝odik. A hexidecim´alis sz´amot a sz´am ut´an ´ırt kis ‘h’ bet˝u jelenti. Ha a ‘h’ bet˝u nem szerepel 100-as sz´am ut´an, akkor a program a 100-as decim´alis c´ımen kezd˝odik, ami 64 hexadecim´alis sz´amnak felelne meg e´ s ez komoly hiba! A magyar´azat arra, hogy mi´ert a 100-as hexadecim´alis c´ımen kell kezd˝odj¨on a program a 8.3. fejezetben tal´alhat´o. A 2. sor egy szoftveres megszak´ıt´ast h´ıv meg. Az INT az utas´ıt´as m´ıg a “20h” a megszak´ıt´as sz´am´at jelenti. Ez a sz´am is hexadecim´alisan van megadva. Term´eszetesen, ha akarjuk, decim´alisan is megadhat´o a megszak´ıt´as sz´ama. Ez a p´elda a 6.2. t´abl´an l´athat´o. Az “INT 20h” megszak´ıt´as arra val´o, hogy egy COM programb´ol kil´epj¨unk. A kil´ep´es azt jelenti, hogy visszat´er¨unk az oper´aci´os rendszerhez. 1 2
org 100h INT 32
6.2. t´abla: Els˝o program egy v´altozata Ha a programot az elso.asm file-ba mentett¨uk, akkor a leford´ıt´asa a NASM seg´ıts´eg´evel a k¨ovetkez˝o sor beg´epel´es´evel lehets´eges: 1 Lehet
kisebb programot is ´ırni, de ennek most nincs jelent˝os´ege.
45
C:\> nasm -o elso.com elso.asm A NASM alap esetben “COM” programokat ford´ıt, ´ıgy a t´ıpust nem kell megadni. A -o opci´oval azt adjuk meg, hogy a ford´ıt´as eredm´eny´et milyen file-ba ´ırjuk. Az utols´o param´eter adja meg, hogy melyik assembly forr´as file-t kell leford´ıtani. A NASM program param´etereinek r´eszletes list´aj´at a 4. fejezet tartalmazza. A ford´ıt´as eredm´enye egy bin´aris file lesz, mely csak k´et byte-ot (!) fog tartalmazni. A file tartalma hexadecim´alis form´aban: CD 20 Ez a p´elda azt mutatja, hogy az INT utas´ıt´as g´epi k´odja a CD hexadecim´alis e´ rt´ek. Az is l´athat´o, hogy az “org 100h” sorb´ol nem gener´al´odik bin´aris k´od, hiszen ez a sor csak azt jel¨oli, hogy a program milyen c´ımen kezd˝odj¨on a mem´ori´aban. Mivel minden COM program a 100h c´ımen kezd˝odik a mem´ori´aban, ez´ert semmilyen extra utas´ıt´asra nincs sz¨uks´eg a bin´aris programban. Mit jelent az, hogy a program a 100 hexadecim´alis c´ımen kezd˝odik? N´ezz¨uk meg a programot a DEBUG program seg´ıts´eg´evel. (A DEBUG program haszn´alat´at a 5. fejezetben t´argyaltuk.) C:\> DEBUG elso.com -r AX=0000 BX=0000 CX=0002 DX=0000 DS=1481 ES=1481 SS=1481 CS=1481 1481:0100 CD20 INT 20 -q
SP=FFFE IP=0100
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
A p´eld´aban az l´athat´o, hogy a programot az 1481 szegmensre t¨olti be az oper´aci´os rendszer. A szegmens c´ım lehet m´as is! Ami enn´el fontosabb, hogy az offszet c´ım e´ ppen a 100 hexadecim´alis c´ım!
6.2 Egy karakter kinyomtat´asa A k¨ovetkez˝o program egy csillag karaktert nyomtat ki. A program list´aja az 6.3. t´abl´an l´athat´o. 1 2 3 4 5
org 100h MOV AH, 2 MOV DL, 2ah INT 21h INT 20h
6.3. t´abla: Egy karakter kinyomtat´as´ara szolg´al´o program A program nagyon egyszer˝u, mivel az 2. e´ s 3. sor az INT 21h szoftveres megszak´ıt´as param´etereit a´ ll´ıtja be. Ebben az esetben az AH regiszter hat´arozza meg a megszak´ıt´as a´ ltal v´egrehajtand´o m˝uveletet e´ s a DL regiszter adja a kinyomtatand´o karakter ASCII k´odj´at. A MOV utas´ıt´as a jobb oldali argumentum e´ rt´ek´et a´ tm´asolja a bal oldali argumentumba. A 2. sorban azt adjuk meg, hogy az AH regiszter e´ rt´eke a 2-es sz´am legyen. Ez l´enyeg´eben megfelel az e´ rt´ekad´as m˝uveletnek m´as programoz´asi nyelvben. A 3. sorban a DL regiszternek a 2A hexadecim´alis sz´amot adjuk meg. A 2A hexadecim´alis sz´am a csillag (‘*’) karakternek felel meg. (L´asd az A. f¨uggel´ek.) A 4.2.1. bekezd´esben azt l´attuk, hogy egy byte adatot sz´ammal e´ s karakterrel is megadhatunk. R´aad´asul a karaktert egyszeres (’) vagy k´etszeres (”) aposztrofok k¨oz¨ott is megadhatjuk. A 6.4. t´abl´an l´athat´o programban a nyomtatand´o karakter nem sz´ammal, hanem t´enylegesen karakterk´ent van megadva. Ezt az ut´obbi ´ır´asm´odot e´ rdemes haszn´alni, mert ebben az esetben egy´ertelm˝u, ASCII t´abl´azat haszn´alata n´elk¨ul, hogy melyik karaktert akarjuk kinyomtatni.
46
1 2 3 4 5
org 100h MOV AH, 2 MOV DL, ’*’ INT 21h INT 20h
6.4. t´abla: Alternat´ıva a m´asodik programra
6.3 Egy sz¨oveg kinyomtat´asa A harmadik program egy sz¨oveget nyomtat ki a k´eperny˝ore. A program list´aja az 6.5. t´abl´an l´athat´o. 1 2 3 4 5 6
org 100h MOV AH, 9 MOV DX, adat INT 21h INT 20h adat: db ’HELLO$’
6.5. t´abla: Egy sz¨oveg kinyomtat´as´ara szolg´al´o program Ebben a programban is az INT 21h szoftveres megszak´ıt´ast kell haszn´alni. Az AH regiszter most is megszak´ıt´as a´ ltal v´egrehajtand´o m˝uveletet hat´arozza meg. Mivel most egy eg´esz sor karaktert kell kinyomtatni a DL regiszter nem elegend˝o, de a DX regiszter is csak k´et byte-nyi karaktert tud t´arolni. Ebben az esetben a DX regiszter a karaktersorozat c´ım´et tartalmazza. Az assembly programban szerencs´ere nem kell pontosan megadni a c´ımet. Mi´ert szerencse? Mert ahhoz, hogy pontosan megadjuk az adat c´ım´et minden assembly utas´ıt´as eset´en tudnunk kellene, hogy h´any byte-os g´epi k´od gener´al´odik bel˝ole e´ s ezek seg´ıts´eg´evel kellene kisz´amolnunk az aktu´alis c´ımet. A programban szimb´olikusan lehet megadni a karaktersorozat c´ım´et. Maga a karaktersorozat a program v´eg´ere ker¨ult. A karaktersorozat a 4.2.1. bekezd´esnek megfelel˝oen van defini´alva: egy c´ım, ut´ana egy kett˝ospont, a db kulcssz´o e´ s egyszeres aposztrofok k¨oz¨ott maguk a karakterek. Az utols´o karakternek a doll´ar jelnek (‘$’) kell lennie. Ez a doll´ar jel z´arja le a sz¨oveget.2 Ennek a speci´alis karakternek a seg´ıts´eg´evel a´ llap´ıtja meg a rendszert, hogy meddig kell a byte-okat kinyomtatni.3 Ha a doll´ar jelet nem adn´ank meg, akkor a rendszer addig nyomtatn´a a karaktereket am´ıg el nem e´ r egy doll´ar jelet. Elvileg el˝ofordulhat, ha nincs doll´ar jel a mem´ori´aban, hogy az eg´esz mem´ori´at kinyomtatja a program e´ s soha nem a´ ll le. Ezt a programot is e´ rdemes megn´ezni a DEBUG programban, hogy t¨obb dolgot is megn´ezz¨unk: C:\> DEBUG hello.com -u xxxx:0100 B409 xxxx:0102 BA0901 xxxx:0105 CD21 xxxx:0107 CD20 xxxx:0109 48 xxxx:010A 45 xxxx:010B 4C xxxx:010C 4C xxxx:010D 4D
MOV MOV INT INT DEC INC DEC DEC DEC
AH,02 DX,109 21 20 AX BP SP SP DI
2 Kor´ abbi
tanulm´anyokb´ol ismert lehet, hogy a C programoz´asi nyelvben z´er´o a´ ll a sz¨oveg v´eg´en. m´asik strat´egia, hogy megadjuk a karaktereket e´ s a karakterek sz´am´at. Ezt m´odszert a Pascal programoz´asi nyelv haszn´alja. 3A
47
xxxx:010E xxxx:0110 xxxx:0112 xxxx:0114 xxxx:0116 xxxx:0118 xxxx:011A xxxx:011C xxxx:011E -d 100 xxxx:0010 xxxx:0020 xxxx:0030 xxxx:0040 xxxx:0050 xxxx:0060 xxxx:0070 xxxx:0080 -q
2400 0000 0000 0000 0000 0000 0000 0000 0000 B4 00 00 00 00 00 00 00
09 00 00 00 00 00 00 00
AND ADD ADD ADD ADD ADD ADD ADD ADD BA 00 00 00 00 00 00 00
09 00 00 00 00 00 00 00
01 00 00 00 00 00 00 00
CD 00 00 00 00 00 00 00
AL,00 [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL 21 00 00 00 00 00 00 00
CD-20 00-00 00-00 00-00 00-00 00-00 00-00 00-00
48 00 00 00 00 00 00 00
45 00 00 00 00 00 00 00
4C 00 00 00 00 00 00 00
4C 00 00 00 00 00 00 00
4D 00 00 00 00 00 00 00
24 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
......!. HELLO$. ................ ................ ................ ................ ................ ................ ................
A k¨ovetkez˝o e´ szrev´eteleket tehetj¨uk: • Az assembler a ford´ıt´as sor´an kisz´amolta a karaktersorozat c´ım´et, ami jelenleg a 109h c´ımt˝ol indul. • A c´ım k´et byte-b´ol a´ ll e´ s ezt a rendszer “little-endian” m´odon t´arolja: BA 09 01. • A DEBUG program teljesen azonos m´odon kezeli az adatot e´ s a programot is. Igaz´ab´ol nincs is k¨ul¨onbs´eg, hiszen mind a kett˝o egy byte sorozat. P´eld´aul l´athat´o, hogy az “unassemble” parancs sor´an a karaktersorozatot is utas´ıt´ask´ent e´ rtelmezi a DEBUG program. Ez´ert van az, hogy az adatokat e´ s a programot nem szabad keverni. Erre a hib´ara egy p´eld´at mutat az 6.6. t´abla. Ha ezt a programot megn´ezz¨uk a DEBUG programban, akkor azt fogjuk tapasztalni, hogy az adatot is mint utas´ıt´asokat fogja e´ rtelmezni a DEBUG e´ s r´aad´asul e´ rtelmetlen k´odot kapunk. A p´elda azt mutatja, hogy az adatokat e´ s a programot nem szabad o¨ sszekeverni!
1 2 3 4 5 6
org 100h adat: db ’HELLO$’ MOV AH, 9 MOV DX, adat INT 21h INT 20h
6.6. t´abla: Hib´as program C:\> DEBUG hello.com -u xxxx:0100 48 xxxx:0101 45 xxxx:0102 4C xxxx:0103 4C xxxx:0104 4D xxxx:0105 24B4 xxxx:0107 09BA0001 xxxx:010B CD21 xxxx:010D CD20 xxxx:010F 0000 xxxx:0111 0000 xxxx:0113 0000
DEC INC DEC DEC DEC AND OR INT INT ADD ADD ADD
AX BP SP SP DI AL,B4 [BP+SI+0100],DI 21 20 [BX+SI],AL [BX+SI],AL [BX+SI],AL
48
xxxx:0115 xxxx:0117 xxxx:0119 xxxx:011B xxxx:011D xxxx:011F -q
0000 0000 0000 0000 0000 0000
ADD ADD ADD ADD ADD ADD
[BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],AL
6.4 Egy karakter beolvas´asa A 6.7. t´abl´azat egy nagyon egyszer˝u programot mutat, ami beolvas egy karaktert a felhaszn´al´ot´ol e´ s u´ jra kinyomtatja. A karakter beolvas´asra is haszn´alhat´o az oper´aci´os rendszer megszak´ıt´asa e´ s ekkor a funkci´o k´odnak 1-nek kell lennie. A funkic´o k´odot a 2. sorban a´ ll´ıtjuk be. A 3. sorban az INT 21h megszak´ıt´as lefut´asa ut´an a beolvasott karakter ASCII k´odja az AL regiszterben lesz. Ezt akarjuk u´ jra kinyomtatni, ez´ert m´asoljuk a´ t a DL regiszterbe a 4. sorban, majd az 5. sorban az u´ j funkci´o k´odot is be´all´ıtjuk. V´eg¨ul az INT 21h megszak´ıt´as megh´ıv´as´aval v´egezz¨uk a nyomtat´ast a 6. sorban. 1 2 3 4 5 6 7
org 100h MOV AH, 1 INT 21h MOV DL, AL MOV AH, 2 INT 21h INT 20h
6.7. t´abla: Egy karakter beolvas´asa e´ s kinyomtat´asa
49
50
7. Fejezet
Assembly nyelv utas´ıt´asai Ebben a fejezetben az assembly utas´ıt´asok k¨oz¨ul a legfontosabbakat tekintj¨uk a´ t. A fontoss´agi sorrendet u´ gy pr´ob´altam meg´allap´ıtani, hogy amelyeket a leggyakrabban haszn´aljuk a programokban, vagy amelyekre legink´abb sz¨uks´eg lehet a tanul´as sor´an. Azt is meg kell jegyezni, hogy a fejezetben csak a 8086 processzor utas´ıt´ask´eszlet´eb˝ol ker¨ultek kiv´alaszt´asra az itt felsorolt utas´ıt´asok. Ennek az a magyar´azata, hogy v´elem´enyem szerint ezek az utas´ıt´asok elegend˝oek a fontosabb koncepci´ok bemutat´as´ara. A fejezet v´eg´en a be nem mutatott parancsokat az´ert felsoroljuk. Szintakszis: • mem: mem´oria c´ım • reg: regiszter • op: mem´oria c´ım vagy regiszter
51
7.1 Adatmozgat´o utas´ıt´asok 7.1.1 MOV Szintakszis MOV op1, op2 Az op2 tartalm´at az op1-be ´ırja, fel¨ul´ırva annak kor´abbi e´ rt´ek´et. Az utas´ıt´as operandusai a k¨ovetkez˝ok lehetnek: MOV MOV MOV MOV MOV
regiszter, sz´ amadat regiszter, regiszter regiszter, mem´ oria mem´ oria, sz´ amadat mem´ oria, regiszter
Mint l´athat´o, az nem fordulhat el˝o, hogy egy utas´ıt´as mindk´et operandusa a mem´ori´ara hivatkozzon! Egy utas´ıt´as csak egyszer hivatkozhat a mem´ori´ara! Szint´en fontos, hogy k¨ozvetlen¨ul nem lehet egyik szegmens regiszterbe sem ´ırni, csak a´ tt´etelesen, p´eld´aul: MOV AX, 1234h MOV DS, AX P´eld´ak MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV
AX, 1234 AX, ES ES, AX AL, 0ffH AH, AL AL, [BX] [SI], DL AX, [BX] [DI], BP AX, [0ffffh] [0200h], DX [ES:0100h], CX
7.1.2 XCHG Szintakszis XCHG op1, op2 Az op1 e´ s op2 tartalm´at felcser´eli. Mind a k´et operandusnak azonos m´eret˝unek kell lennie, 8 vagy 16 bitesnek. Az utas´ıt´as el˝onye, hogy a cser´et seg´edv´altoz´o n´elk¨ul hajtja v´egre. Az operandusok cser´eje a´ ltal´aban a k¨ovetkez˝ok´eppen t¨ort´enik: MOV temp, op2 MOV op2, op1 MOV op1, temp
52
P´eld´ak XCHG XCHG XCHG XCHG
AL, BL CX, DX DH, [4351h] [DS:3333h], BP
7.1.3 XLAT Szintakszis XLAT A BX regiszter egy maximum 256 bytes t´abl´azatra mutat e´ s az AL regiszterben lev˝o e´ rt´eknek megfelel˝o elemet veszi ki a t´abl´azatb´ol e´ s t¨olti be az AL regiszterbe. Az utas´ıt´as tulajdonk´eppen egy konverzi´ot hajt v´egre. P´eld´ak MOV BX, tabla MOV AL, 0fh XLAT MOV DL, AL MOV AH, 2 INT 21h ... ... tabla: db ’0123456789ABCDEF’
7.1.4 LDS Szintakszis LDS reg, mem A utas´ıt´as m´asodik operandusa a´ ltal megadott mem´oriahelyen tal´alhat´o 4 byte-os mutat´ot bet¨olti a DS szegmens regiszterbe e´ s az els˝o operandusk´ent megadott regiszterbe. Ilyen m´odon egyetlen utas´ıt´assal lehet bet¨olteni egy m´asik szegmensben lev˝o v´altoz´o c´ım´et. Az utas´ıt´as v´egrehajt´asa ut´an azonnal c´ımezhet˝o a mem´orapoz´ıci´o. P´eld´ak LDS BX, [valtozo] MOV AX, [DS:BX]
7.1.5 LES Szintakszis LES reg, mem
53
A utas´ıt´as m´asodik operandusa a´ ltal megadott mem´oriahelyen tal´alhat´o 4 byte-os mutat´ot bet¨olti az ES szegmens regiszterbe e´ s az els˝o operandusk´ent megadott regiszterbe. Ilyen m´odon egyetlen utas´ıt´assal lehet bet¨olteni egy m´asik szegmensben lev˝o v´altoz´o c´ım´et. Az utas´ıt´as v´egrehajt´asa ut´an azonnal c´ımezhet˝o a mem´orapoz´ıci´o. P´eld´ak LES BX, [valtozo] MOV AX, [ES:BX]
7.1.6 LEA Szintakszis LEA reg, mem Az utas´ıt´as els˝o operandusak´ent megadott regiszterbe bet¨olti a m´asodik operandus offszet c´ım´et. A c´ımet fut´as k¨ozben sz´amolja ki, nem el˝ore, illetve b´armilyen c´ımz´esi m´od haszn´alhat´o. P´eld´ak LEA BX, [valtozo+BX] LEA DI, [BX+4] LEA DI, [AX+CX]
7.1.7 PUSH Szintakszis PUSH op A k´et byte-os operandust a veremre helyezi az utas´ıt´as. Az utas´ıt´as egyen´ert´ek˝u a k¨ovetkez˝o k´et utas´ıt´assal: SUB SP, 2 MOV [SS:SP], op Az operandus lehet szegmens regiszter vagy b´armilyen 16 bites regiszter, mem´oria c´ım vagy konstans sz´amadat. Az utas´ıt´as ford´ıtottja a POP utas´ıt´as. P´eld´ak PUSH PUSH PUSH PUSH
AX DS [0003h] 7
; [DS:0003] tartalma a veremre ; 0007h word a veremre
7.1.8 PUSHF Szintakszis PUSHF
54
A st´atusz regiszter teljes tartalm´at a verem tetej´ere m´asolja. Az utas´ıt´as egyen´ert´ek˝u a k¨ovetkez˝o k´et utas´ıt´assal: SUB SP, 2 MOV [SS:SP], statusz-regiszter Az utas´ıt´as ford´ıtottja a POPF utas´ıt´as, mellyel egy¨utt j´ol haszn´alhat´o olyan esetekben, amikor a st´atusz regiszter egy-egy vagy t¨obb bitj´et akarjuk m´odos´ıtani vagy lek´erdezni. P´eld´ak PUSHF AND [SS:SP], 1 POPF
; statusz regiszter elment´ ese ; csak az 1-es bitet tartjuk meg, maszkoljuk ; az ´ uj ´ ert´ eket a statusz regiszterbe ´ ırjuk
7.1.9 PUSHA Szintakszis PUSHA Az utas´ıt´as 8 regisztert t¨olt fel a veremre. A veremmutat´ot (SP) 16-al cs¨okkenti, majd a k¨ovetkez˝o sorrendben a regiszterek tartalm´at felm´asolja a veremre: AX, CX, DX, BX, SP, BP, SI, DI. Az SP regiszter eset´en az utas´ıt´as v´egrehajt´asa el˝otti e´ rt´eket menti el! Az utas´ıt´as ford´ıtottja a POPA utas´ıt´as.
7.1.10 POP Szintakszis POP op Az utas´ıt´as a veremmutat´o (SP) regiszter a´ ltal mutatott word e´ rt´eket az op operandusba ´ırja bele. Az utas´ıt´as egyen´ert´ek˝u a k¨ovetkez˝o k´et utas´ıt´assal: MOV op, [SS:SP] ADD SP, 2 Az operandus lehet szegmens regiszter, b´armilyen 16 bites regiszter vagy mem´oria c´ım. Fontos, hogy az operandus nem lehet a CS regiszter. Ez az´ert van, mert ha ilyen m´odon engedn´enk fel¨ul´ırni a CS regisztert akkor ezzel a´ tt´etelesen szegmensek k¨oz¨otti ugr´o utas´ıt´ast engedn´enk meg, hiszen a k¨ovetkez˝o utas´ıt´asra a CS:IP regiszter p´aros mutat. P´eld´ak POP POP POP POP
AX DS [0003h] [ES:0003h]
7.1.11 POPF Szintakszis POPF
55
A st´atusz regiszter teljes tartalm´at fel¨ul´ırja a verem tetej´en t´arolt 16 bites e´ rt´ekkel. Az utas´ıt´as egyen´ert´ek˝u a k¨ovetkez˝o k´et utas´ıt´assal: MOV statusz-regiszter, [SS:SP] ADD SP, 2 Az utas´ıt´as a PUSHF utas´ıt´assal egy¨utt haszn´alhat´o j´ol olyan esetben, amikor a st´atusz regiszter egy-egy vagy t¨obb bitj´et akarjuk m´odos´ıtani vagy lek´erdezni. P´eld´ak PUSHF AND [SS:SP], 1 POPF
; statusz regiszter elment´ ese ; csak az 1-es bitet tartjuk meg, maszkoljuk ; az ´ uj ´ ert´ eket a statusz regiszterbe ´ ırjuk
7.1.12 POPA Szintakszis POPA Az utas´ıt´as 8 regisztert a´ ll´ıt helyre a vermen elt´arolt e´ rt´ekekb˝ol. Az utas´ıt´as a PUSHA ford´ıtottja e´ s megfelel a k¨ovetkez˝o utas´ıt´asoknak: POP POP POP ADD POP POP POP POP
DI SI BP SP, 2 BX DX CX AX
7.1.13 LAHF Szintakszis LAHF Az utas´ıt´as bet¨olti az AH regiszter megfelel˝o poz´ıci´oj´aba a SF, ZF, AF, PF e´ s CF st´atusz biteket. A 7.1. t´abla mutatja a bitek hely´et az AH regiszterben. 7. SF
6. ZF
5.
4. AF
3.
2. PF
1.
0. CF
7.1. t´abla: LAHF utas´ıt´as ut´an az AH regiszter tartalma
P´eld´ak LAHF SHR AH, 6 AND AH, 1
; AH ´ ert´ eke 1 vagy 0 a ZF bittol fuggoen
56
7.1.14 SAHF Szintakszis SAHF Az utas´ıt´as az AH regiszter megfelel˝o bitjeivel fel¨ul´ırja a SF, ZF, AF, PF e´ s CF st´atusz biteket. A 7.1. t´abla mutatja a bitek hely´et az AH regiszterben.
57
7.2 Matematikai utas´ıt´asok Az ebben a fejezetben t´argyalt utas´ıt´asok eset´en az is felt¨untet´esre ker¨ul, hogy az utas´ıt´as hogyan befoly´asolja a st´atusz regiszter egyes bitjeit. A t´abl´azatokban az ‘x’ jelzi a megv´altoztatott biteket, m´ıg a ‘?’ jel azt jelenti, hogy a bit meghat´arozatlan, vagyis lehet 1 e´ s 0 is.
7.2.1 INC Szintakszis INC op Az utas´ıt´as az operandus e´ rt´ek´ehez 1-et ad hozz´a a CF st´atusz bit megv´altoztat´asa n´elk¨ul. ´ Erintett st´atusz bitek OF DF IF x
TF SF ZF x x
AF x
PF x
CF
P´eld´ak INC INC INC INC
AX BL [100h] [ES:220h]
7.2.2 DEC Szintakszis DEC op Az utas´ıt´as az operandus e´ rt´ek´eb˝ol 1-et von le a CF st´atusz bit megv´altoztat´asa n´elk¨ul. ´ Erintett st´atusz bitek OF DF IF x
TF SF ZF x x
P´eld´ak DEC DEC DEC DEC
AX BL [100h] [ES:220h]
7.2.3 ADD Szintakszis ADD op1, op2
58
AF x
PF x
CF
Az utas´ıt´as az op1 operandushoz adja az op2 operandus e´ rt´ek´et e´ s az eredm´enyt az op1-be ´ırja. Az operandusok m´eret´enek meg kell egyeznie, k´et 8 bites vagy k´et 16 bites e´ rt´eket lehet csak o¨ sszeadni. ´ Erintett st´atusz bitek OF DF IF x
TF SF ZF x x
AF x
PF x
CF x
P´eld´ak ADD ADD ADD ADD ADD
AX, BX [adat], CX CX, [valtozo] BL, 4 SI, [BP+8]
7.2.4 ADC Szintakszis ADC op1, op2 Az utas´ıt´as az op1 operandushoz adja az op2 operandus e´ rt´ek´et e´ s a Carry flag (CF) e´ rt´ek´et is, majd az eredm´enyt az op1-be ´ırja. Az operandusok m´eret´enek meg kell egyeznie, k´et 8 bites vagy k´et 16 bites e´ rt´eket lehet csak o¨ sszeadni. ´ Erintett st´atusz bitek OF DF IF x
TF SF ZF x x
AF x
P´eld´ak ADC AX, BX ADC [adat], CX ADC CX, [valtozo] ADC BL, 4 ADC SI, [BP+8] ... atvitellel as ´ osszead´ ; ¨ MOV CX, 0 MOV AL, 80h MOV AH, 80h MOV CL, AL ADD CL, AH ADC CH, 0 ; eredm´ eny: CX tartalma 100h lesz
7.2.5 SUB Szintakszis SUB op1, op2
59
PF x
CF x
Az utas´ıt´as az op1 operandusb´ol kivonja az op2 operandus e´ rt´ek´et e´ s az eredm´enyt az op1-be ´ırja. Az operandusok m´eret´enek meg kell egyeznie, k´et 8 bites vagy k´et 16 bites e´ rt´eket lehet csak o¨ sszeadni. ´ Erintett st´atusz bitek OF DF IF x
TF SF ZF x x
AF x
PF x
CF x
P´eld´ak SUB SUB SUB SUB SUB
AX, BX [adat], CX CX, [valtozo] BL, 4 SI, [BP+8]
7.2.6 SBB Szintakszis SBB op1, op2 Az utas´ıt´as az op1 operandusb´ol kivonja az op2 operandus e´ rt´ek´et e´ s a Carry flag (CF) e´ rt´ek´et is, majd az eredm´enyt az op1-be ´ırja. Az operandusok m´eret´enek meg kell egyeznie, k´et 8 bites vagy k´et 16 bites e´ rt´eket lehet csak o¨ sszeadni. ´ Erintett st´atusz bitek OF DF IF x
TF SF ZF x x
AF x
PF x
CF x
P´eld´ak SBB SBB SBB SBB SBB
AX, BX [adat], CX CX, [valtozo] BL, 4 SI, [BP+8]
7.2.7 MUL Szintakszis MUL op Ez az utas´ıt´as 8 vagy 16 bites el˝ojel n´elk¨uli sz´amok k¨oz¨otti szorz´ast hajt v´egre. Az operandus hat´arozza meg, hogy 8 vagy 16 bites sz´amokat szoroz-e o¨ ssze. 8 bites szorz´as eset´en az AL regiszter tartalm´at o¨ sszeszorozza az op operandussal e´ s az eredm´enyt az AX regiszterben t´arolja el. Ha az eredm´enyben az AH regiszter tartalma z´erus akkor a CF e´ s OF st´atusz bitek e´ rt´eke z´erus lesz, egy´ebk´ent 1. 16 bites szorz´as eset´en az AX regiszter tartalm´at o¨ sszeszorozza az op operandussal e´ s az eredm´enyt az DX:AX regiszterekben t´arolja el. Az operandusok el˝ojel n´elk¨uli sz´amok e´ s b´armilyen c´ımz´esi m´od haszn´alhat´o. Ha az eredm´enyben az DX regiszter tartalma z´erus akkor a CF e´ s OF st´atusz bitek e´ rt´eke z´erus lesz, egy´ebk´ent 1.
60
´ Erintett st´atusz bitek OF DF IF x
TF SF ZF ? ?
AF ?
PF ?
CF x
P´eld´ak MOV AL, 2 MUL 4 ... adat: db 4 ... MOV AL, 2 MUL [adat]
; AX tartalma 8 lesz
; AX tartalma 8 lesz
7.2.8 IMUL Szintakszis IMUL op Ez az utas´ıt´as 8 vagy 16 bites el˝ojeles szorz´ast hajt v´egre. Az operandus hat´arozza meg, hogy 8 vagy 16 bites sz´amokat szoroz-e o¨ ssze. 8 bites szorz´as eset´en az AL regiszter tartalm´at o¨ sszeszorozza az op operandussal e´ s az eredm´enyt az AX regiszterben t´arolja el. Ha az eredm´enyben az AH regiszter tartalma z´erus akkor a CF e´ s OF st´atusz bitek e´ rt´eke z´erus lesz, egy´ebk´ent 1. 16 bites szorz´as eset´en az AX regiszter tartalm´at o¨ sszeszorozza az op operandussal e´ s az eredm´enyt az DX:AX regiszterekben t´arolja el. Az operandusok el˝ojel n´elk¨uli sz´amok e´ s b´armilyen c´ımz´esi m´od haszn´alhat´o. Ha az eredm´enyben az DX regiszter tartalma z´erus akkor a CF e´ s OF st´atusz bitek e´ rt´eke z´erus lesz, egy´ebk´ent 1. ´ Erintett st´atusz bitek OF DF IF x
TF SF ZF ? ?
AF ?
PF ?
CF x
P´eld´ak MOV AL, 2 IMUL 4 ... adat: db 4 ... MOV AL, 2 IMUL [adat]
; AX tartalma 8 lesz
; AX tartalma 8 lesz
7.2.9 DIV Szintakszis DIV op Ez az utas´ıt´as el˝ojel n´elk¨uli oszt´ast hajt v´egre. Ha byte, 8 bites, operandust adunk meg az utas´ıt´asban, akkor az AX regiszter tartalm´at az operandussal elosztja e´ s a h´anyadost az AL regiszterben, a marad´ekot az AH regiszterben t´arolja el. Word vagy sz´o m´eret˝u operandus eset´en a DX:AX regisztrerek tartalm´at
61
elosztja az operandussal majd a h´anyadost a AX regiszterben e´ s a marad´ekot a DX regiszterben t´arolja el. Ha az oszt´o z´erus vagy a h´anyados t´ul nagy, hogy elf´erjen az AL vagy AX regiszterben, akkor az INT 0 megszak´ıt´as h´ıv´odik meg. ´ Erintett st´atusz bitek OF DF IF ?
TF SF ZF ? ?
AF ?
PF ?
CF ?
P´eld´ak MOV AX, 12 DIV 10
; AL = 1, AH = 2
7.2.10 IDIV Szintakszis IDIV op Ez az utas´ıt´as el˝ojeles oszt´ast hajt v´egre. Ha byte, 8 bites, operandust adunk meg az utas´ıt´asban, akkor az AX regiszter tartalm´at az operandussal elosztja e´ s a h´anyadost az AL regiszterben, a marad´ekot az AH regiszterben t´arolja el. Word vagy sz´o m´eret˝u operandus eset´en a DX:AX regisztrerek tartalm´at elosztja az operandussal majd a h´anyadost a AX regiszterben e´ s a marad´ekot a DX regiszterben t´arolja el. Ha az oszt´o z´erus vagy a h´anyados t´ul nagy, hogy elf´erjen az AL vagy AX regiszterben, akkor az INT 0 megszak´ıt´as h´ıv´odik meg. ´ Erintett st´atusz bitek OF DF IF ?
TF SF ZF ? ?
AF ?
PF ?
CF ?
P´eld´ak MOV AX, 12 IDIV 10
; AL = 1, AH = 2
7.2.11 NEG Szintakszis NEG op Az operandust null´ab´ol kivonja e´ s hozz´aad egyet, majd az eredm´enyt elt´arolja az operandusban, fel¨ul´ırva annak kor´abbi e´ rt´ek´et. Az utas´ıt´as l´enyeg´eben kettes komplemens´et k´epzi az operandusnak. Ha az eredm´eny operandus z´erus, akkor a CF bit e´ rt´eke z´erus lesz, egy´ebk´ent pedig 1. ´ Erintett st´atusz bitek OF DF IF x
TF SF ZF x x
62
AF x
PF x
CF x
P´eld´ak NEG AX NEG BL NEG [DS:100h]
7.2.12 CBW Szintakszis CBW Az utas´ıt´as az AL regiszterben tal´alhat´o el˝ojeles byte-ot el˝ojeles sz´ov´a alak´ıtja az AX regiszterben. Ez u´ gy t¨ort´enik, hogy az AL regiszter legnagyobb helyi´ert´ek˝u bitj´et bem´asolja az AH regiszter minden bitj´ebe. Assembly-ben ez a k¨ovetkez˝o utas´ıt´asoknak felel meg: TEST AL, 128 JNZ egy zerus: MOV AH, 00h JMP vege egy: MOV AH, 0FFh vege: Az utas´ıt´as egy 8 bites sz´am el˝ok´esz´ıt´es´et v´egzi el˝ojeles oszt´ashoz.
7.2.13 CWD Szintakszis CWD Az utas´ıt´as az AX regiszterben tal´alhat´o el˝ojeles word-ot el˝ojeles e´ rt´ekk´e alak´ıtja az DX:AX regiszterekben. Az utas´ıt´as egy 16 bites sz´am el˝ok´esz´ıt´es´et v´egzi el˝ojeles oszt´ashoz.
63
7.3 Bitforgat´o e´ s bitl´eptet˝o utas´ıt´asok Az al´abbi utas´ıt´asokban az op operandus lehet 8 vagy 16 bites e´ s tetsz˝oleges c´ımz´esi m´odot alkalmazhatunk. Az utas´ıt´asokn´al a “kil´ep˝o” bit minden esetben megjelenik Carry bitben. Az utas´ıt´asok k´et csoportba sorolhat´ok: • Bitforgat´o, rot´al´o utas´ıt´asok: RCL, RCR, ROL, ROR • Bitl´eptet˝o, shiftel˝o utas´ıt´asok: SAL, SAR, SHL, SHR
7.3.1 RCL Szintakszis RCL op, 1 RCL op, CL RCL op, szamlalo
CF
Az utas´ıt´as balra forgatja az operandus e´ rt´ek´et olyan m´odon, hogy a legnagyobb helyi´ert´ek˝u bit a Carry bitbe ker¨ul, a Carry bit pedig a legkisebb helyi´ert´ek˝u bit hely´ebe. Minden m´as bit eggyel balra tol´odik. Az utas´ıt´as m˝uk¨od´es´et a 7.1. a´ bra is szeml´elteti. Az utas´ıt´as k´epes a forgat´ast egyszer vagy t¨obbsz¨or v´egrehajtani, a m´asodik operandust´ol f¨ugg˝oen.
7.1. a´ bra: Az RCL utas´ıt´as m˝uk¨od´ese ´ Erintett st´atusz bitek OF DF IF x
TF SF ZF
AF
PF
CF x
Ha a CF bit az operandus magas bitj´evel egyenl˝o, akkor az OF bit e´ rt´eke z´erus lesz, m´ıg ha nem egyenl˝o akkor 1 lesz. P´eld´ak RCL RCL RCL RCL
AL, 1 AX, 3 BX, CL [DS:2456h], CL
Az utas´ıt´as haszn´alat´ara a 9.1. fejezet mutat egy p´elda programot.
7.3.2 RCR Szintakszis RCR op, 1 RCR op, CL RCR op, szamlalo
64
CF
Az utas´ıt´as jobbra forgatja az operandus e´ rt´ek´et olyan m´odon, hogy a Carry bit a legnagyobb helyi´ert´ek˝u bitbe m´asol´odik, a legkisebb helyi´ert´ek˝u bit pedig a Carry bitbe ker¨ul. Minden m´as bit eggyel jobbra tol´odik. Az utas´ıt´as m˝uk¨od´es´et a 7.2. a´ bra is szeml´elteti. Az utas´ıt´as k´epes a forgat´ast egyszer vagy t¨obbsz¨or v´egrehajtani, a m´asodik operandust´ol f¨ugg˝oen.
7.2. a´ bra: Az RCR utas´ıt´as m˝uk¨od´ese
´ Erintett st´atusz bitek OF DF IF x
TF SF ZF
AF
PF
CF x
P´eld´ak RCR RCR RCR RCR
AL, 1 AX, 3 BX, CL [DS:2456h], CL
7.3.3 ROL Szintakszis ROL op, 1 ROL op, CL ROL op, szamlalo
CF
Az utas´ıt´as az els˝o operandust balra rot´alja “¨onmag´an” e´ s a “kicsorg´o” legmagasabb helyi´ert´ek˝u bit ker¨ul a Carry bitbe. A m˝uk¨od´est a 7.3. a´ bra mutatja be. Az utas´ıt´as k´epes a forgat´ast egyszer vagy t¨obbsz¨or v´egrehajtani, a m´asodik operandust´ol f¨ugg˝oen.
7.3. a´ bra: Az ROL utas´ıt´as m˝uk¨od´ese
´ Erintett st´atusz bitek OF DF IF x
TF SF ZF
P´eld´ak ROL AL, 1
65
AF
PF
CF x
ROL AX, 3 ROL BX, CL ROl [DS:2456h], CL
7.3.4 ROR Szintakszis ROR op, 1 ROR op, CL ROR op, szamlalo
CF
Az utas´ıt´as az els˝o operandust jobbra rot´alja “¨onmag´an” e´ s a “kicsorg´o” legalacsonyabb helyi´ert´ek˝u bit ker¨ul a Carry bitbe. A m˝uk¨od´est a 7.4. a´ bra mutatja be. Az utas´ıt´as k´epes a forgat´ast egyszer vagy t¨obbsz¨or v´egrehajtani, a m´asodik operandust´ol f¨ugg˝oen.
7.4. a´ bra: Az ROR utas´ıt´as m˝uk¨od´ese
´ Erintett st´atusz bitek OF DF IF x
TF SF ZF
AF
PF
CF x
P´eld´ak ROR ROR ROR ROR
AL, 1 AX, 3 BX, CL [DS:2456h], CL
7.3.5 SAL, SHL Szintakszis SAL SAL SAL SHL SHL SHL
op, op, op, op, op, op,
1 CL szamlalo 1 CL szamlalo
Az utas´ıt´as balra l´eptet minden bitet. A legmagasabb helyi´ert´ek˝u bit a Carry bitbe ker¨ul, m´ıg a legalacsonyabb helyi´ert´ek˝u bit t¨orl˝odik. Az utas´ıt´as m˝uk¨od´es´et a 7.5. a´ bra mutatja be. Az utas´ıt´as k´epes a bit l´eptet´est egyszer vagy t¨obbsz¨or v´egrehajtani, a m´asodik operandust´ol f¨ugg˝oen. ´ Erdemes megjegyezni, hogy ha egyszer hajtjuk v´egre az utas´ıt´ast, akkor ez megfelel a 2-vel val´o szorz´asnak. Az esetleges szorz´asi t´ulcsordul´as a Carry bitben jelenik meg.
66
CF
0 7.5. a´ bra: Az SAL utas´ıt´as m˝uk¨od´ese ´ Erintett st´atusz bitek OF DF IF x
TF SF ZF x x
AF
PF
CF x
P´eld´ak SHL SHL SHL SHL
AL, 1 AX, 3 BX, CL [DS:2456h], CL
Az utas´ıt´as haszn´alat´ara a 8.6. fejezet mutat n´eh´any p´eld´at.
7.3.6 SAR Szintakszis SAR op, 1 SAR op, CL SAR op, szamlalo
CF
Az utas´ıt´as jobbra l´eptet minden bitet. A legalacsonyabb helyi´ert´ek˝u bit a Carry bitbe ker¨ul, m´ıg a legmagasabb helyi´ert´ek˝u bit ism´etl˝odik. Az utas´ıt´as m˝uk¨od´es´et a 7.6. a´ bra mutatja be. Az utas´ıt´as k´epes a bit l´eptet´est egyszer vagy t¨obbsz¨or v´egrehajtani, a m´asodik operandust´ol f¨ugg˝oen. ´ Erdemes megjegyezni, hogy ha egyszer hajtjuk v´egre az utas´ıt´ast, akkor ez megfelel a 2-vel val´o el˝ojeles oszt´asnak. A h´anyados az operandusban marad, m´ıg a marad´ek a Carry bitbe ker¨ul.
7.6. a´ bra: Az SAR utas´ıt´as m˝uk¨od´ese ´ Erintett st´atusz bitek OF DF IF x
TF SF ZF x x
7.3.7 SHR Szintakszis SHR op, 1
67
AF
PF
CF x
SHR op, CL SHR op, szamlalo
CF
Az utas´ıt´as jobbra l´eptet minden bitet. A legalacsonyabb helyi´ert´ek˝u bit a Carry bitbe ker¨ul, m´ıg a legmagasabb helyi´ert´ek˝u bit t¨orl˝odik. Az utas´ıt´as m˝uk¨od´es´et a 7.7. a´ bra mutatja be. Az utas´ıt´as k´epes a bit l´eptet´est egyszer vagy t¨obbsz¨or v´egrehajtani, a m´asodik operandust´ol f¨ugg˝oen. ´ Erdemes megjegyezni, hogy ha egyszer hajtjuk v´egre az utas´ıt´ast, akkor ez megfelel a 2-vel val´o el˝ojel n´elkuli ¨ oszt´asnak. A h´anyados az operandusban marad, m´ıg a marad´ek a Carry bitbe ker¨ul.
0 7.7. a´ bra: Az SHR utas´ıt´as m˝uk¨od´ese
´ Erintett st´atusz bitek OF DF IF x
TF SF ZF x x
AF
PF
CF x
P´eld´ak Az al´abbi programr´eszlet azt ellen˝orzi, hogy a legalacsonyabb helyi´ert´ek˝u bit z´erus vagy egy: ... SHR AL, 1 JNC zerus ; k´ od v´ egrehajt´ asa ha a bit 1 JMP vege zerus: ; k´ od v´ egrehajt´ asa ha a bit 0 vege: ...
68
7.4 Logikai utas´ıt´asok 7.4.1 AND A 0 1 0 1
B 0 0 1 1
A AND B 0 0 0 1
7.2. t´abla: AND utas´ıt´as igazs´ag t´abl´aja
7.4.2 OR A 0 1 0 1
B 0 0 1 1
A OR B 0 1 1 1
7.3. t´abla: OR utas´ıt´as igazs´ag t´abl´aja
7.4.3 XOR A 0 1 0 1
B 0 0 1 1
A XOR B 0 1 1 0
7.4. t´abla: XOR utas´ıt´as igazs´ag t´abl´aja
7.4.4 NOT A 0 1
NOT A 1 0
7.5. t´abla: NOT utas´ıt´as igazs´ag t´abl´aja
7.4.5 TEST 7.4.6 CMP
69
Felt´etel = nem = > >= < <=
El˝ojeles JE, JZ JNE, JNZ JG, JNLE JGE, JNL JL, JNGE JLE, JNG
El˝ojel n´elk¨ul JE, JZ JNE, JNZ JA, JNBE JAE, JNB JB, JNAE JBE, JNA
7.6. t´abla: Felt´eteles utas´ıt´asok.
7.5 Vez´erl´es´atad´o utas´ıt´asok 7.5.1 JMP 7.5.2 Felt´eteles utas´ıt´asok Az assembly programoz´asi nyelvben nincsennek magasabb szint˝u programoz´asi konstrukci´ok, p´eld´aul ciklus. Minden ilyen szerkezetet felt´eteles ugr´asokkal kell megval´os´ıtani. A felt´eteles ugr´as azt jelenti, hogy a program fut´asa nem a k¨ovetkez˝o utas´ıt´assal folytat´odik, hanem a felt´eteles ugr´as a´ ltal megadott c´ımen, ha a felt´etel teljes¨ul. Itt a felt´etel nem jelenti azt, hogy az utas´ıt´as valamilyen o¨ sszehasonl´ıt´ast v´egezne, csak annyit, hogy egy kor´abbi utas´ıt´as a´ ltal be´all´ıtott st´atusz bit e´ rt´eke alapj´an t¨ort´enhet ugr´as. P´eld´aul a JE c´ ım utas´ıt´as azt jelenti, hogy ha a ZF (z´erus st´atusz bit) e´ rt´eke egy (1) akkor a ’c´ım’-en ım utas´ıt´as folytat´odik a program v´egrehajt´asa. Ha a z´erus st´atusz bit e´ rt´eke nulla (0) akkor a JE c´ ut´ani utas´ıt´assal folytat´odik a program v´egrehajt´asa.
7.5.3 JCXZ 7.5.4 LOOP 7.5.5 LOOPNZ 7.5.6 LOOPZ 7.5.7 CALL 7.5.8 RET 7.5.9 INT
70
7.6 String kezel˝o utas´ıt´asok 7.6.1 MOVSB, MOVSW 7.6.2 CMPSB, CMPSW 7.6.3 LODSB, LODSW 7.6.4 STOSB, STOSW 7.6.5 SCASB, SCASW 7.6.6 REP 7.6.7 REPZ 7.6.8 REPNZ
71
7.7 Processzor vez´erl˝o utas´ıt´asok 7.7.1 CLC 7.7.2 STC 7.7.3 CMC 7.7.4 CLD 7.7.5 STD 7.7.6 CLI 7.7.7 STI
72
7.8 Egy´eb utas´ıt´asok 7.8.1 NOP 7.8.2 IN 7.8.3 OUT
73
7.9 Ellen˝orz˝o k´erd´esek 1. Tegy¨uk fel, hogy a k¨ovetkez˝o adatok vannak defini´alva: num1 DW 100 num2 DB 225 char1 DB ’Y’ num3 DD 0 ´ enyesek-e az al´abbi utas´ıt´asok: Erv´ (a) MOV AX, BX (b) MOV AX, num2 (c) MOV BL, num1 (d) MOV BL, [num1] (e) MOV DH, char1 (f) MOV char1, num2 (g) MOV [char1], [num2] (h) MOV IP, num1 (i) ADD 75, AX (j) CMP 75, AX (k) SUB char1, ’A’ (l) SUB [char1], ’A’ (m) XCHG AL, num2 (n) XCHG AL, [num2] (o) XCHG AL, 23d (p) XCHG AL, [23d] (q) INC num3 (r) INC [num3] 2. Az al´abbi k´odr´eszletekben a ‘MOV AX, 1’ vagy az ‘MOV BX, 1’ utas´ıt´as fog lefutni: (a)
mov CX,5 sub DX,DX cmp DX,CX jge jump1 mov BX,1 jmp skip1 jump1: mov AX,10 skip1: ...
(b)
mov CX,5 mov DX,10 shr DX,1 cmp CX,DX je jump1 mov BX,1 jmp skip1
74
jump1: mov AX,10 skip1: ... 3. Magyar´azza el sz¨ovegesen, hogy mit csin´al a k¨ovetkez˝o k´od r´eszlet: (a) NOT AX ADD AX, 1 (b) NOT BX ADD BX, 1 (c) SUB SUB MOV ADD ADD ADD ADD
AH, DH, DL, DX, DX, DX, DX,
AH DH AL DX DX AX DX
(d) SUB SUB MOV MOV SHL SHL ADD
AH, DH, DL, CL, DX, AX, DX,
AH DH AL 3 CL 1 AX
4. Kell-e tudni az AX regiszter kezdeti tartalm´at ahhoz, hogy meg´allap´ıtsuk az AX regiszter tartalm´at az al´abbi k´odr´eszlet lefut´asa ut´an? Ha igen, magyar´azza meg mi´ert! Ha nem, magyar´azza el mi lesz az AX regiszter tartalma? (a) MOV DX, AX NOT AX OR AX, DX (b) MOV DX, AX NOT AX AND AX, DX
75
76
8. Fejezet
Assembly programokr´ol 8.1 Programoz´asi m´odszer Az assembly programoz´asra jellemz˝o, hogy mindent explicit m´odon meg kell adni a programban. Nincsennek magas szint˝u programoz´asi konstrukci´ok.
8.2 Megszak´ıt´asok INT 16h INT 20h INT 21h
8.3 COM programok A DOS 1.0 ”oper´aci´os rendszer” csak COM t´ıpus´u programokat haszn´alt. Az ut´ana k¨ovetkez˝o DOS 2.0 sor´an vezett´ek csak be az EXE programokat. A DOS 1.0 rendszer alatt egy igen egyszer˝u szab´aly szerint m˝uk¨odtek a programok: miut´an elindult a program a teljes mem´ori´at kezelhette a program. Ebben az id˝oben az ”oper´aci´os rendszer” m´eg nem haszn´alt mem´oria menedzsel´est (memory management), ´ıgy egy program b´armit csin´alhatott a teljes mem´ori´aban. Az ”oper´aci´os rendszer” csak azt tartotta nyilv´an, hogy hol van az els˝o szabad hely ahova a k¨ovetkez˝o programot bet¨oltheti. Amikor a DOS egy u´ j programot akart elind´ıtani, akkor el˝ok´esz´ıtett egy speci´alis ter¨uletet a program sz´am´ara a szabad ter¨ulet els˝o 256 byte-nyi hely´en. A speci´alis ter¨ulet neve: Program Segment Prefix (PSP). Az el˝ok´esz´ıt´es ut´an a DOS egyszer˝uen bet¨olt¨otte a programot a 256 byte-nyi PSP ut´ani ter¨uletre. Mindenf´ele ellen˝orz´es e´ s tov´abbi feldolgoz´as n´elk¨ul. A bet¨olt´es ut´an m´eg egy-k´et regisztert el˝ok´esz´ıtett a rendszer, be´all´ıtott egy visszat´er´esi c´ımet, majd a program elej´ere ugorva elind´ıtotta azt. Mivel 256 byte egyenl˝o 100h hexadecim´alis e´ rt´ekkel ez´ert van az, hogy a COM programok a 100h c´ımen kezd˝odnek. Mindig! A DOS a´ ltal elv´egzett be´all´ıt´asok egy COM programhoz: • A CS, DS, ES, SS regisztereket be´all´ıtja a PSP elej´ere. • Az IP regiszternek a 100h e´ rt´eket adja, ahol majd a program fut´asa elkezd˝odik. • Az SP regiszter a verem tetej´ere van a´ ll´ıtva. Ez a´ ltal´aban az FFFEh e´ rt´eknek felel meg. (Ez a szegmens tetej´enek c´ıme.) • A BX:CX regiszter p´ar a COM program m´eret´et fogja t¨ukr¨ozni. A BX regiszter a 32 bites e´ rt´eknek a fels˝o 16 bitj´et m´ıg a CX az als´o 16 bitj´et t´arolja. ´Igy egy 256d byte m´eret˝u program eset´en:
77
BX = 0000h CX = 0100h • Az AX, DX, SI e´ s DI regiszterek e´ rt´eke z´erus lesz.
8.3.1 Program Segment Prefix
8.4 EXE programok 8.5 XOR haszn´alata 8.6 Assembly integer aritmetika 8.6.1 BCD aritmetika
78
9. Fejezet
P´elda programok Ebben a fejezetben n´eh´any p´elda program ker¨ul bemutat´asra, melyek rem´elhet˝oleg el˝oseg´ıtik az assembly programoz´as elsaj´at´ıt´as´at. A programok nincsennek optimaliz´alva e´ s ebben a fejezetben a lehet˝o legegyszer˝ubb v´altozatban ker¨ulnek bemutat´asra. A k´es˝obbi fejezetek a´ tolvas´asa ut´an arra biztatn´am az olvas´ot, hogy t´erjen vissza ezekhez a programokhoz e´ s pr´ob´alja meg o˝ ket a´ talak´ıtani, r¨ovidebb, m´as m´odon is meg´ırni.
9.1 Egy byte bin´aris kinyomtat´asa Ez a program egy szok´asos gyakorlat az assembly nyelv tanul´as sor´an. A program azt mutatja be, hogy egy byte hogyan e´ p¨ul fel bitekb˝ol, e´ s a biteket hogyan lehet megfelel˝o sorrendben kinyomtatni. A 9.1. t´abla mutatja a program list´aj´at. 1 org 100h 2 MOV BL, [adat] 3 MOV AH, 02 4 MOV CX, 0008 5 ujra: 6 MOV DL, 0 7 RCL BL, 1 8 ADC DL, 30h 9 INT 21h 10 LOOP ujra 11 INT 20h 12 adat: 13 db 10100011b
9.1. t´abla: Egy byte bin´aris kinyomtat´as´ara szolg´al´o program A 2. sorban bet¨oltj¨uk az adat c´ım alatt t´arolt e´ rt´eket. Az adat a program v´eg´en van t´arolva e´ s bin´aris form´atumban van megadva. A 3. sorban el˝ok´esz´ıtj¨uk a nyomtat´ast, vagyis megadjuk az INT 21h megszak´ıt´as funkci´o k´odj´at. A 4. sorban a CX regiszterbe bet¨olt¨unk 8-at, mivel egy byte-ban 8 bit van e´ s a nyomtat´ast nyolcszor kell megism´etelni, vagyis nyolcszor kell 1-et vagy 0-´at nyomtatni. Mivel egy karaktert fogunk kinyomtatni, ez´ert a nyomtatand´o karakternek v´eg¨ul a DL regiszterben kell lennie, ´ıgy a 6. sorban null´aval inicializ´aljuk a DL regisztert. A 7. sorban az RCL utas´ıt´ast haszn´aljuk (L´asd 7.3.1. fejezet). Mi´ert? El˝osz¨or is az L bet˝u az utas´ıt´as nev´enek v´eg´en azt jelenti, hogy balra
79
L´ep´es Kezdeti 1. 2. 3. 4. 5. 6. 7. 8.
CF ?? 1 1 0 1 0 1 1 0
128 1 1 0 1 0 1 1 0 ??
64 1 0 1 0 1 1 0 ?? 1
32 0 1 0 1 1 0 ?? 1 1
Byte 16 8 1 0 0 1 1 1 1 0 0 ?? ?? 1 1 1 1 0 0 1
4 1 1 0 ?? 1 1 0 1 0
2 1 0 ?? 1 1 0 1 0 1
1 0 ?? 1 1 0 1 0 1 1
9.2. t´abla: Egy byte balra forgat´asa a Carry biten kereszt¨ul v´egezz¨uk a bit l´eptet´est vagy bit forgt´ast. Ez az´ert fontos, mert a legmagasabb helyi´ert´ek˝u bit a byte bal oldal´an tal´alhat´o (l´asd ??. a´ bra) e´ s a k´eperny˝ore is balr´ol-jobbra v´egezz¨uk a nyomtat´ast, vagyis el˝osz¨or a legmagasabb helyi´ert´ek˝u bitet kell kinyomtatni. Ha megn´ezz¨uk a 7.1. vagy 7.5. a´ br´akat, akkor azt l´atjuk, hogy egy l´eptet´es vagy forgat´as sor´an a legmagasabb helyi´ert´ek˝u bit a Carry bitbe ker¨ul. A Carry bitet a CF doboz jel¨oli. Amikor egy bitet ilyen m´odon bet¨olt¨unk a Carry bitbe, akkor k´es˝obb haszn´alhatjuk ezt a bitet egy felt´eteles ugr´asn´al, l´asd JC (7.5.2. fejezet) e´ s JNC (7.5.2. fejezet) utas´ıt´asokat. Ugyanakkor ebben a programban a Carry bitet m´ask´epp haszn´aljuk. A programnak v´eg¨ul vagy az ‘0’ vagy a ‘1’ karaktert kell kinyomtatnia amelyek ASCII k´odja 30h e´ s 31h. Ez azt jelenti, hogy a DL regiszterhez hozz´a kell adni 30h e´ s m´eg a Carry bit e´ rt´ek´et. Erre szerencs´ere van k¨ul¨on utas´ıt´as, az ADC utas´ıt´as (l´asd 7.2.4. fejezetet). Mivel ez az utas´ıt´as hozz´aadja az e´ rt´ekeket a DL regiszterhez, ez´ert kellett a 6. sorban null´at t¨olteni a DL regiszterbe. V´eg¨ul a 9. sorban az INT 21h megszak´ıt´as seg´ıts´eg´evel kinyomtatjuk a karaktert. A 10. sorban a LOOP utas´ıt´as (l´asd 7.5.4.fejezet) cs¨okkenti a CX regiszter tartalm´at eggyel e´ s ha a CX regiszter e´ rt´eke nem z´erus, akkor a megadott c´ımre ugrik. Ez azt jelenti, hogy a legbaloldalibb bit nyomtat´asa ut´an ism´et a legbaloldalibb bitet fogja nyomtatni, hiszen a byte-ot mindig balra forgatjuk. A 9.2. t´abl´azat mutat egy p´eld´at arra, hogy hogyan alakul a byte e´ s a Carry bit e´ rt´eke az egyes l´ep´esek, forgat´as sor´an.
80
9.2 Egy hexadecim´alis sz´am kinyomtat´asa Egy hexadecim´alis sz´am 0 e´ s 16 k¨oz¨otti e´ rt´ek lehet. Ezeket az e´ rt´ekeket 4 biten lehet reprezent´alni, ´ıgy ez a program csak egy byte (8 bit) fel´et tudja kinyomtatni. A hexadecim´alis sz´amrendszerben 16 sz´amjegy van: • 0 - 9 sz´amjegyek ASCII k´odja: 30h - 39h • A - F sz´amjegyek ASCII k´odja: 41h - 46h A programban felt´etelezz¨uk, hogy a hexadecim´alis sz´am a BL 8 bites regiszterben van elt´arolva. Ez azt jelenti, hogy a byte e´ rt´eket meg kell vizsg´alni, hogy a fenti tartom´anyokb´ol melyikbe esik e´ s aszerint kell hozz´aadni a megfelel˝o e´ rt´eket, hogy sz´amjegy ASCII k´odj´at kapjuk meg. A pszeudo k´odban az algoritmus a k¨ovetkez˝ok´eppen n´ez ki: IF BL < 0Ah THEN BL = BL + 30h ELSE BL = BL + 37h Ez azt jelenti, hogy ha a BL regiszter tartalma kisebb mint 10, akkor csak 30h e´ rt´ekkel kell m´odos´ıtani, egy´ebk´ent 37h e´ rt´eket kell a BL regiszter tartalm´ahoz hozz´aadni. B´ar az assembly programoz´asi nyelvben megval´os´ıthat´o a felt´eteles utas´ıt´as, de k¨ozvetlen ELSE a´ g nincs. (Az ELSE a´ gba es˝o utas´ıt´asok akkor hajt´odnak v´egre, ha a felt´etel hamis volt.) Ennek k¨ovetkezt´eben a k´odot egy kicsit a´ t kell szervezni, ami pszeudo k´odban ez lesz: BL = BL + 30h IF BL >= 03Ah THEN BL = BL + 07h Az el˝oz˝o v´altozatban 30h vagy 37h e´ rt´eket kellett a regiszterhez hozz´aadni, ´ıgy ebben a v´altozatban 30h-at mindenk´eppen hozz´aadunk e´ s 07h-et m´ar csak akkor kell hozz´aadni, ha a kapott e´ rt´ek nagyobb vagy egyenl˝o mint 3Ah. (Sz´amoljuk v´egig, hogy a nulla sz´am ASCII karakter´enek sz´ama 30h, az egy sz´am´e 31h e´ s ´ıgy tov´abb. V´eg¨ul a kilences sz´am karakter´enek sz´ama 39h, vagyis a 3Ah m´ar a tizes sz´amjegynek felelne meg, de a tizes sz´amjegyet m´ar az A bet˝u jel¨oli aminek az ASCII k´odja m´ar 41h.) Az assembly program list´aja az 9.3. t´abl´an l´athat´o. A hexadecim´alis e´ rt´ek a programban van defini´alva a szam c´ımen, e´ s ezt az e´ rt´eket t¨oltj¨uk be a BL regiszterbe. A program v´eg¨ul kinyomtatja a hexadecim´alis sz´amjegyet, ebben az esetben a B bet˝ut. Az 9.3. t´abl´an l´athat´o programban a m´asodik sorban a BL regiszterbe t¨oltj¨uk a szam c´ımen t´arolt byte e´ rt´eket. A harmadik sorban az AH regiszterbe a 2-es e´ rt´eket t¨oltj¨uk. Ennek az e´ rt´eknek csa k´es˝obb van jelent˝os´ege de mivel a k´es˝obbi utas´ıt´asok nem m´odos´ıtj´ak az AH regiszter tartalm´at ez´ert itt is nyugodtan be´all´ıthatjuk ezt az e´ rt´ek´et. A negyedik sorban a BL regiszter tartalm´at a´ tm´asoljuk a DL regiszterbe. Most m´ar felt˝unhet, hogy val´oj´aban arra t¨oreksz¨unk, hogy a program v´eg´en az INT 21h megszak´ıt´ast haszn´aljuk a karakter kinyomtat´as´ara. (Ha egy karaktert akarunk kinyomtatni a INT 21h megszak´ıt´assal, akkor az AH adja meg a funkc´o k´odot – 02h – e´ s a DL regiszter fogja tartalmazni a kinyomtatand´o karakter ASCII k´odj´at. L´asd 6.2. bekezd´est.) Az 5-8 sorok val´os´ıtj´ak meg az el˝obb t´argyalt pszeudo k´odot. El˝osz¨or a DL regiszterhez hozz´aadunk 30h e´ rt´eket, majd az ´ıgy kapott e´ rt´eket a k¨ovetkez˝o sorban o¨ sszehasonl´ıtjuk a 3Ah e´ rt´ekkel. A CMP utas´ıt´as csak o¨ sszehasonl´ıt´ast v´egez e´ s be´all´ıtja a st´atusz regisztert. A JL utas´ıt´as a felt´eteles ugr´as e´ s a st´atusz bitek e´ rt´ek´et˝ol f¨ugg˝oen folytat´odik a v´egrehajt´es. Ez aztjelenti, hogy ha a DL regiszter e´ rt´eke kisebb mint 3Ah akkor a´ tugorjuk a 8. sort. Ha nagyobb, akkkor a 8. sorban folytat´odik a v´egrehajt´as e´ s m´eg hozz´aadunk 7-et, hogy az A karakter ASCII k´odj´at´olindul´o e´ rt´ekeket kapjunk. A karakter kinyomtat´asa a 10. sorban t¨ort´enik az INT 21h megszak´ıt´assal.
81
1 org 100h 2 MOV BL, [szam] 3 MOV AH, 02 4 MOV DL, BL 5 ADD DL, 30h 6 CMP DL, 3ah 7 JL szamjegy 8 ADD DL, 07 9 szamjegy: 10 INT 21h 11 INT 20h 12 szam: 13 db 0bh
; DL < 3ah
9.3. t´abla: Egy hexadecim´alis sz´am kinyomtat´as´ara szolg´al´o program
82
9.3 Egy byte hexadecim´alis kinyomtat´asa Ez a program annyiban k¨ul¨onb¨ozik az el˝oz˝o programt´ol, hogy ez a program 2 hexadecim´alis sz´amot fog kinyomtatni. Mi´ert? Egy byte 8 bitet vagy k´etszer 4 bitet tartalmaz. 4 biten pedig pontosan 16 f´ele sz´amot lehet a´ br´azolni ami megfelel egy hexadecim´alis sz´amjegynek. B´ar mostanra m´ar egy´ertelm˝unek kell lennie hogyan lehet 4 biten 16 sz´amot a´ br´azolni, de a teljess´eg kedv´ee´ rt a 9.4. t´abl´azat felsorolja a 4 biten t´arolhat´o sz´amokat decim´alis e´ s bin´aris alakban. Ez azt jelenti, hogy egy byte-ban az als´o n´egy bit e´ s a fels˝o n´egy bit is megfelel egy hexadecim´alis sz´amjegynek, vagyis ha egy byte-ot headecim´alisan akarunk kinyomtatni, akkor k´et hexadecim´alis sz´amjegyet kell kinyomtatni. A 9.5. t´abla tartalmazza az assembly program list´aj´at. Ez a program a 9.3. programot k´etszer tartalmazza. (Igaz´ab´ol f¨uggv´enyeket kellene haszn´alni, hogy kevesebb legyen a k´od ism´etl´es, de a f¨uggv´enyekr˝ol majd a ??. fejezetben tanulunk.) Az extra utas´ıt´asok a 9.5. t´abl´an l´athat´o programhoz k´epest azt biztos´ıtj´ak, hogy mindig az als´o 4 bit tartalmazza a hexadecim´alis sz´amot e´ s a fels˝o 4 bit pedig mindig z´erus legyen! A m´asodik sorban bet¨oltj¨uk a byte-ot a BL regiszterbe, majd a harmadik sorban az INT 21h megszak´ıt´as funkci´o k´odj´at a´ ll´ıtjuk be az AH regizterben. Mivel k´etszer kell kezeln¨unk a BL regisztert (als´o e´ s fels˝o n´egy bit) ez´ert az eredeti e´ rt´eket a BL regiszterben t´aroljuk e´ s majd a DL regisztert m´odos´ıtjuk. Ez´ert a BL regiszter tartalm´at a´ tm´asoljuk a DL regiszterbe a 4. sorban. Mivel a sz´amokat balr´ol jobbra ´ırjuk, ez´ert el˝osz¨or a magasabb helyi´ert´ek˝u biteket kell figyelembe venni, vagyis a fels˝o 4 bitnek megfelel˝o sz´amot kell kinyomtatni. B´ar ez igaz, de azt is figyelembe kell venni, hogy a 9.3. program az als´o n´egy bittel dolgozott. Ez´ert nincs m´as teend˝onk, mint a fels˝o n´egy bitet “eltolni” az als´o n´egy bitbe. Sokf´elek´eppen lehet ezt megtenni, de a legegyszer˝ubb bitl´eptet˝o utas´ıt´ast haszn´alni. A bitl´eptet˝o utas´ıt´asok k¨oz¨ul az SHR utas´ıt´as diagramja a 7.7. a´ br´an l´athat´o. Fontos, hogy ez az utas´ıt´as a jobbra l´eptet´es sor´an balr´ol null´akat l´eptet be, vagyis a fels˝o 4 bitet lenull´azza. Miut´an az als´o 4 biten van a kinyomtatand´o hexadecim´alis sz´amjegy, a 9.3. programot lehet haszn´alni a nyomtat´asra. (A 9.3. program jel¨olve van a 9.5 t´abl´an.) A 13. sorban helyre´all´ıtjuk a DL regiszter e´ rt´ek´et a BL regiszterb˝ol. (Itt kell megjegyezni, hogy term´eszetesen a szam cimr˝ol u´ jra bet¨olthetn´enk az e´ rt´eket, de itt n´eh´any o´ rajel ciklust megtakar´ıtva a BL regisztert haszn´aljuk mint gyors, id˝oleges t´arol´ohely. Ha valami´ert m´egis sz¨uks´eg¨unk lenne a BX regiszterre a programban, p´eld´aul c´ımz´esn´el, akkor term´eszetesen c´elszer˝ubb lenne a szam c´ımr˝ol bet¨olteni az e´ rt´eket a DL regiszterbe.) A m´asodik sz´am kinyomtat´as´an´al csak az als´o 4 bitre van sz¨uks´eg¨unk. Igen a´ m, de figyelni kell arra, hogy a fels˝o 4 bit is ott van byte-ban. A 9.3. program felt´etelezi, hogy a fels˝o 4 bit z´erus. Ennek el´er´es´ere “maszkol´ast” fogunk haszn´alni, vagyis a fels˝o 4 bitet ki kell null´azni, u´ gy hogy az als´o 4 bit e´ rt´eke ne v´altozzon. A maszkol´as a 14. sorban az AND utas´ıt´assal val´os´ıtsjuk meg. A 0Fh hexadecim´alis sz´am bin´arisan 00001111b e´ s ezt haszn´aljuk az AND utas´ıt´assal, vagyis ahol a bit e´ rt´eke 1 ott a DL regiszter tartalma v´altozatlan marad, ahol pedig nulla, ott a DL regiszter bitje biztos hogy z´erus lesz. (Ez el´eg egyszer˝uen bel´athat´o, ha megn´ezz¨uk az AND utas´ıt´as igazs´ag t´abl´aj´at, l´asd 7.2. t´abla.) Miut´an a DL regiszter megfelel˝oen be van a´ ll´ıtva, nincs m´as h´atra mint kinyomtatni a 9.3. program szerint. Ez is jel¨olve van a 9.5. t´abl´an.)
83
Decim´alis 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Bin´aris 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
9.4. t´abla: 4 biten a´ br´azolhat´o sz´amok bin´aris alakban
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
org 100h MOV BL, [szam] MOV AH, 02 MOV DL, BL MOV CL, 4 SHR DL, CL ; ADD DL, 30h ; CMP DL, 3ah ; JL szam1 ; ADD DL, 07 ; szam1: ; INT 21h ; MOV DL, BL ; AND DL, 0Fh ; ADD DL, 30h ; CMP DL, 3ah ; JL szam2 ; ADD DL, 07 ; szam2: ; INT 21h ; INT 20h szam: db 0FFh
bit l´ eptet´ es jobbra --| | | elozo program | | --| DL helyreallitasa maszkol´ as --| | | elozo program | | --|
9.5. t´abla: Egy byte hexadecim´alis form´atum´u kinyomtat´as´ara szolg´al´o program
84
9.4 Egy decim´alis sz´amjegy ellen˝orz¨ott beolvas´asa e´ s kinyomtat´asa A 9.6. program azt mutatja be, hogyan lehet megvizsg´alni, hogy a beolvasott karakter sz´amjegy-e. Az e´ rv´enyes karakterek tartom´anya: 0-9, melyek ASCII k´odja egym´as ut´ani az ASCII t´abl´aban, l´asd A.1. t´abl´azat. B´ar a program sz´amjegyeket fogad csak el, term´eszetesen a programot k¨onny˝u u´ gy a´ t´ırni, hogy m´as, egym´as ut´ani karaktereket fogadjon el. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
org 100h ujra: MOV MOV INT MOV INT CMP JB CMP JA MOV MOV INT INT
AH, 9 DX, uzenet 21h AH,1 21h ; beolvasott karakter AL-ben AL, ’0’ ; also korlat hiba AL, ’9’ ; felso korlat hiba DL, AL ; nyomtatas elokeszitese AH, 2 21h 20h
MOV MOV INT JMP
DX, hiba_str AH, 9 21h ujra
hiba:
uzenet: db 0Dh,0Ah,’Adjon meg egy szamot: $’ hiba_str: db 0Dh,0Ah,’Ervenytelen karakter!$’
9.6. t´abla: Egy sz´amjegy beolvas´asa e´ s kinyomtat´asa. A 3-5. sorokban egy u¨ zenetet ´ırunk ki a k´eperny˝ore a felhaszn´al´o sz´am´ara. A 6. e´ s 7. sorban a INT 21h megszak´ıt´ast haszn´aljuk, hogy egy karaktert beolvassunk a felhaszn´al´ot´ol. A beolvasott karakter az AL regiszterbe ker¨ul. A 8. sorban az AL regiszter tartalm´at o¨ sszehasonl´ıtjuk a ‘0’ karakter ASCII k´odj´aval. A CMP utast´as be´all´ıtja a st´atusz regiszter bitjeit a k´et e´ rt´ek egym´ashoz val´o viszonya alapj´an. Ezeknek a biteknek az a´ llapot´at vizsg´alja meg a 9. sorban a JB utas´ıt´as e´ s ha az AL regiszter tartalma kisebb mint a ‘0’ karakter ASCII k´odja, akkor a hiba c´ımre ugrik a program. Ellenkez˝o esetben a k¨ovetkez˝o, 10., sorban folytat´odik a program. A 10. e´ s 11. sorban az AL regiszter tartalm´at a ‘9’ karakter ASCII k´odj´aval hasonl´ıtjuk o¨ ssze e´ s ha az AL regiszter tartalma nagyobb akkor szint´en a hiba c´ımre ugrik a program. Ha az AL regiszter tartalma a megfelel˝o tartom´anyban van, akkor a program a 12. sorban folytat´odik. A 12-14. sorok k¨oz¨ott csak annyi t¨ort´enik, hogy a megfelel˝o regiszterek tartalm´at be´all´ıtjuk, olyan m´odon, hogy egy karaktert ki tudjunk nyomtatni a k´eperny˝ore. A 15. sorban kil´ep¨unk a programb´ol. A 16-19 sorok k¨oz¨otti utas´ıt´asok egy hiba u¨ zenetet ´ırnak ki a k´eperny˝ore. A 20. sorban egy felt´etel n´elk¨uli ugr´assal a program elej´ere ugrunk, hogy u´ jra be lehessen olvasni egy karaktert. A 22. e´ s 24. ssorban a karaktersorozat elej´en a 0Dh e´ s 0Ah byte-ok az´ert vannak megadva, hogy egy “sort emeljenek a k´eperny˝on”, vagyis a k¨ovetkez˝o sorba nyomtassuk ki a sz¨oveget. (Pr´ob´aljuk ki a programot u´ gy, hogy ezeket a byte-okat kit¨or¨olj¨uk.)
85
9.5 Egy karakter beolvas´asa e´ s m´odos´ıt´asa Ez a program egy karaktert olvas be e´ s az ut´ana k¨ovetkez˝o karaktert nyomtatja ki. Az “a” bet˝u helyett a “b” bet˝ut, a “b” bet˝u helyett a “c” be˝ut e´ s ´ıgy tov´abb. 1 2 3 4 5 6 7 8
org 100h MOV AH, 1 INT 21h MOV DL, AL INC DL MOV AH, 2 INT 21h INT 20h
9.7. t´abla: Egy karakter beolvas´asa e´ s az ut´ana k¨ovetkez˝o kinyomtat´asa. A fenti programban semmilyen ellen˝orz´es nincs ´ıgy a programot most kieg´esz´ıtj¨uk annak vizsg´alatval hogy a bolvasott karakter t´enyleg kis bet˝u-e. A programnak van m´eg egy “rejtett” hib´aja: Mi t¨ort´enik ha a “z” bet˝ut adjuk meg? Mivel a karakter sz´amszer˝u e´ rt´ek´ehez hozz´aadunk egyet e´ s a “z” bet˝u ASCII k´odja (ASCII sz´ama) 122 decim´alis vagy 7A hexadecim´alis ez´ert a program a 123-as ASCII k´od´u karaktert nyomtatja ki, a “{ karaktert. A 9.8. program ezt a probl´em´at is kijav´ıtja.
86
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
org 100h MOV AH, 1 INT 21h MOV DL, AL CMP DL, ’a’ JB nem_betu CMP DL, ’z’ JA nem_betu JNE novel MOV DL, ’a’ JMP nyomtat novel: INC DL nyomtat: MOV AH, 2 INT 21h vege: INT 20h nem_betu: MOV AH, 9 MOV DX, nem_betu_szoveg INT 21h JMP vege nem_betu_szoveg: db 10,13,’Nem betut adtal meg!$’
9.8. t´abla: Egy karakter beolvas´asa e´ s az ut´ana k¨ovetkez˝o kinyomtat´asa.
87
¨ karakter bolvas´asa e´ s kinyomtat´asa ford´ıtott sorrendben 9.6 Ot A 9.9. t´abl´an l´athat´o program beolvas o¨ t karaktert, ezeket elt´arolja, majd ford´ıtott sorrendben kinyomtatja a beolvasott karaktereket. A program j´o p´elda az regiszteres c´ımz´esre. (A c´ımz´esi m´odokat a 3.3. fejezet t´argyalja.) A 2. sorban a CX regiszter e´ rt´ek´et 5-re a´ ll´ıtjuk, mivel egy ciklusban fogjuk beolvasni a karaktereket e´ s a CX regiszter lesz a ciklus v´altoz´o. A 3. sorban a DI regiszterbe a t´arol´asra haszn´alt hely c´ım´et t¨oltj¨uk be. Az 5. e´ s 6. sorban az INT 21h megszak´ıt´assal beolvasunk egy karaktert az AL regiszterbe. A 7. sorban elt´aroljuk a beolvasott karaktert a DI regiszter a´ ltal megadott c´ımre. (B´ar nincs megadva szegmens regiszter, de adat eset´en automatikusan felt´etelezhetj¨uk a DS szegmens regisztert, ´ıgy a 7. sor a k¨ovetkez˝o is lehetne: MOV [DS:DI], AL A 8. sorban a DI regiszter e´ rt´ek´et 1-el n¨ovelj¨uk meg, mivel minden karakter 1 byte m´eret˝u, ´ıgy a k¨ovetkez˝o karaktert majd a k¨ovetkez˝o byte-on kell elt´arolni. A 9. sorban tal´alhat´o LOOP utas´ıt´assal val´os´ıtjuk meg a ciklust. Az utas´ıt´as cs¨okkenti a CX regiszter e´ rt´ek´et 1-el e´ s ha a regiszter nem nulla, akkor a megadott c´ımre ugrik, jelen esetben u´ jabb karaktert olvas be. A ciklus v´eg´en a 10. sor fog v´egrehajt´odni, ahol a DI regiszter e´ rt´ek´et 1-el cs¨okkentj¨uk. Erre az´ert van sz¨uks´eg, mert az 5. karakter elt´arol´asa ut´an is megn¨ovelj¨uk a DI regiszter tartalm´at, ´ıgy az m´ar egy hatodik karakterre mutatna, ami nem defini´alt a programban. ´Igy a 10. sorban v´egrehajtott cs¨okkent´es ut´an a DI regiszter megint az 5. karakterre fog mutatni, amit majd kinyomtatunk el˝osz¨or. A 11. sorban ism´et a ciklus v´altoz´ot a´ ll´ıtjuk be, m´ıg a 12. sorban az INT 21h megszak´ıt´as funkci´ok´odj´at adjuk meg. A cikluson bel¨ul a 14. sorban a DL regiszterbe t¨oltj¨uk be a karaktert amit a 15. sorban nyomtatunk ki. A 16. sorban a DI regisztert ism´et cs¨okkentj¨uk, mivel ford´ıtott sorrendben akarjuk kinyomtatni a karaktereket mint ahogy beolvastuk o˝ ket. A ciklust itt is a LOOP utas´ıt´assal val´os´ıtjuk meg. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
org 100h MOV CX, 5 MOV DI, karakterek ujra: MOV AH, 1 INT 21h MOV [DI], AL INC DI LOOP ujra DEC DI MOV CX, 5 MOV AH, 2 nyomtat: MOV DL, [DI] INT 21h DEC DI LOOP nyomtat INT 20h karakterek: db 0,0,0,0,0
¨ karakter beolvas´asa e´ s kinyomtat´asa ford´ıtott sorrendben. 9.9. t´abla: Ot
88
9.7 K´et egyjegyu˝ sz´am o¨ sszead´asa A 9.10. program beolvas k´et decim´alis sz´amjegyet, o¨ sszeadja o˝ ket, majd az eredm´enynek megfelel˝o sz´am´u csillag (‘*’) karaktert nyomtat ki. A programban a sz´amjegyek beolvas´asa k´etszer szerepel. A k´od ism´etl´es elker¨ul´es´ere a legjobb lenne f¨uggv´enyt haszn´alni, de err˝ol csak k´es˝obb lesz sz´o a ??. fejezetben. Az els˝o beolvasott sz´amot a CL regiszterben t´aroljuk el a 13. sorban. A m´asodik beolvasott sz´amjegy az AL regiszterben alakul ki a 24. sorban. A 25. sorban o¨ sszeadjuk a k´et sz´amot e´ s az eredm´enyt a CL regiszterben t´aroljuk el. A 26. sorban a CH regisztert kinull´azzuk, hogy a teljes CX regiszter tartalmazza az eredm´enyt e´ s a LOOP utas´ıt´ast tudjuk haszn´alni. A karakterek nyomtat´as´anak el˝ok´esz´ıt´ese a 27. e´ s 28. sorban t¨ort´enik, m´ıg a nyomtat´asi ciklus a 30. e´ s 31. sorban tal´alhat´o. A 9.11. program egy m´asik lehet˝os´eget mutat a program megval´os´ıt´as´ara. Ebben a programban a beolvas´ast egy ciklussal v´egezz¨uk el. Mivel a ciklushoz sz¨uks´eg van a CL regiszterre ez´ert a beolvasott sz´amokat itt a mem´ori´aban t´aroljuk el. Ebben a programban a sz´amok o¨ sszead´as´at a 21. e´ s 22. sorban v´egezz¨uk el, majd a nyomtat´ast az el˝oz˝oekhez hasonl´oan, ciklussal oldjuk meg.
89
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
org 100h szam_1: MOV AH, 9 ; elso szam bekerese MOV DX, uzenet INT 21h MOV AH, 1 INT 21h CMP AL, ’0’ JB nem_szam_1 CMP AL, ’9’ JA nem_szam_1 SUB AL, ’0’ ; karakterbol szam MOV CL, AL ; karakter t´ arolasa szam_2: MOV AH, 9 ; masodik szam bekerese MOV DX, uzenet INT 21h MOV AH, 1 INT 21h CMP AL, ’0’ JB nem_szam_2 CMP AL, ’9’ JA nem_szam_2 SUB AL, ’0’ ; karakterbol szam ADD CL, AL ; osszeadas XOR CH, CH MOV AH, 2 ; nyomtatas elokeszitese MOV DL, ’*’ ujra: INT 21h LOOP ujra INT 20h nem_szam_1: MOV AH, 9 MOV DX, nem_szam_szoveg INT 21h JMP szam_1 nem_szam_2: MOV AH, 9 MOV DX, nem_szam_szoveg INT 21h JMP szam_2 uzenet: db 0Dh,0Ah,’Adjon meg egy szamot: $’ nem_szam_szoveg: db 10,13,’Nem szamot adtal meg!$’
9.10. t´abla: K´et sz´am o¨ sszead´asa e´ s az eredm´eny kinyomtat´asa.
90
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
org 100h MOV DI, szamok MOV CL, 0 szam_be: MOV AH, 9 ; elso szam bekerese MOV DX, uzenet INT 21h MOV AH, 1 INT 21h CMP AL, ’0’ JB nem_szam CMP AL, ’9’ JA nem_szam SUB AL, ’0’ MOV [DI], AL INC DI INC CL CMP CL, 2 JNE szam_be ; olvasas vege MOV CL, byte [szamok] ADD CL, byte [szamok+1] XOR CH, CH MOV AH, 2 ; nyomtatas elokeszitese MOV DL, ’*’ ujra: INT 21h LOOP ujra INT 20h nem_szam: MOV AH, 9 MOV DX, nem_szam_szoveg INT 21h JMP szam_be szamok: db 0, 0 uzenet: db 0Dh,0Ah,’Adjon meg egy szamot: $’ nem_szam_szoveg: db 10,13,’Nem szamot adtal meg!$’
9.11. t´abla: K´et sz´am o¨ sszead´asa e´ s az eredm´eny kinyomtat´asa ciklussal.
91
9.8 Egy karakter n-szeri kinyomtat´asa A 9.12. t´abl´an l´athat´o program beolvas egy karaktert, ut´ana egy decim´alis sz´amjegyet e´ s az els˝ok´ent beolvasott karaktert annyiszor nyomtatja ki, amekkora a m´asodiknak beolvasott sz´am volt. A program mostanra tal´an nem ig´enyel magyar´azatot, mivel minden r´eszlete eddig m´ar szerepelt egy kor´abbi programban. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
org 100h MOV AH, 9 MOV DX, uzenet1 INT 21h MOV AH, 1 INT 21h MOV [karakter], AL olvas: MOV AH, 9 MOV DX, uzenet2 INT 21h MOV AH, 1 INT 21h CMP AL, ’0’ JB hiba CMP AL, ’9’ JA hiba SUB AL, ’0’ XOR CX, CX MOV CL, AL MOV AH, 9 ; uj sor nyomtatasa MOV DX, ujsor INT 21h MOV AH, 2 ; karakter sorozat nyomtatasa MOV DL, [karakter] nyomtat: INT 21h LOOP nyomtat INT 20h hiba: MOV AH, 9 MOV DX, uzenet_nem_szam INT 21h JMP olvas ujsor: db 10, 13, ’$’ karakter: db 0 uzenet1: db 10, 13, ’Adjon meg egy karaktert: $’ uzenet2: amjegyet: $’ db 10, 13, ’Adjon meg egy sz´ uzenet_nem_szam: amjegyet adott meg!’ db 10, 13, ’Nem sz´
9.12. t´abla: Egy karakter n-szeri kinyomtat´as´ara szolg´al´o program
92
9.9 T´eglalap kinyomtat´asa A 9.13. e´ s 9.14. t´abl´akon bemutatott program beolvas k´et egyjegy˝u sz´amot ellen˝orz´essel, a sorok e´ s oszlopok sz´am´at, majd a sz´amoknak megfelel˝o m´eret˝u t´eglalapot nyomtat ki a k´eperny˝ore. A program igaz´ab´ol nem t´ul bonyolult, de az u¨ zenetek nyomtat´asa e´ s az ellen˝orz´esek miatt olyan hossz´u lett, hogy k´et t´abl´an ker¨ul bemutat´asra. A program speci´alis abban az e´ rtelemben, hogy ez a program nem “line´aris”. Ez azt jelenti, hogy a 2. sorban m´ar r¨ogt¨on 19. sorra ugrunk e´ s ott folytat´odik a program v´egrehajt´asa. A 2. e´ s 19. sor k¨oz´e beker¨ult n´eh´any adat, illetve a hiba kezel˝o programr´eszletek is. Itt ez jelenti azt, hogy a program nem line´aris, nem csak fentr˝ol, lefel´e fut a program e´ s adat is be´ekel˝odik a programba. A 20-22. sorokban egy u¨ zenete ´ırunk ki a felhaszn´al´onak, majd a 23. e´ s 24. sorokban beolvasunk egy karaktert. A 25. e´ s 28. sorok k¨oz¨ott ellen˝orizz¨uk, hogy a beolvasott karakter sz´amjegy-e. Ha nem sz´amjegyet olvastunk be, a program egy hiba¨uzenetet ´ır ki e´ s u´ jra megpr´ob´al beolvasni egy sz´amjegyet. A 29. sorban a beolvasott sz´amjegy ASCII k´odj´at sz´amm´a konvert´aljuk e´ s elt´aroljuk a CH regiszterben. A 32-34. sorokban egy u´ jabb u¨ zenetet ´ırunk ki, majd ism´et egy karaktert olvasunk be a 35. e´ s 36. sorban. A 37-40. sorok k¨oz¨ott ism´et ellen˝orz´est hajtunk v´egre, hogy a beolvasott karakter sz´am-e. ´ Erdemes megfigyelni, hogy a k´et beolvas´asn´al k¨ul¨on hiba u¨ zenet nyomtat´o r´eszt haszn´altunk: hiba1 e´ s hiba2. Mi´ert? Ez az´ert van, mert ha csak egy hiba¨uzenet nyomtat´o programr´eszlet lenne, akkor a hiba u¨ zenet kinyomtat´asa ut´an k´et k¨ul¨onb¨oz˝o helyre kellene valahogy visszat´ernie. Egyszer a hiba1 c´ımre, m´askor pedig a hiba2 c´ımre. Term´eszetesen ezt nem lehet. A f¨uggv´enyekn´el majd l´atni fogjuk, hogy ezt hogyan lehet megval´os´ıtani, de itt most azt az egyszer˝u megold´ast haszn´aljuk, hogy a k´odot megism´etelj¨uk. A m´asodszorra beolvasott e´ rt´eket a BL regiszterben t´aroljuk el. A t´eglalap nyomtat´as´at a 9.14. t´abla mutatja be. A 46-48. sorokban csak egy soremel´est nyomtatunk. A 50. sorban be´all´ıtjuk a karakter nyomtat´asi funkci´o k´odot e´ s az 51. sorban a nyomtatand´o karaktert adjuk meg. Az 52. sorban a CL regiszterbe a´ tm´asoljuk a BL regiszter tartalm´at, az oszlopok sz´am´at. A CL regiszter lesz az egyik ciklus v´altoz´o. A m´asik ciklus v´altoz´o a CH regiszter. Mi´ert kell k´et ciklus v´altoz´o? N´ezz¨uk meg a k¨ovetkez˝o C k´odot, ami egy t´eglalapot nyomtat ki: for(ch = n; ch > 0; ch--) { for(cl = m; cl > 0; cl--) { printf(’’o’’ } printf(’’\n’’ } A fenti k´odban az l´athat´o, hogy van egy bels˝o e´ s egy k¨uls˝o ciklus. Ezeket jel¨oli a belso e´ s kulso c´ım az assembly programban. Az is l´athat´o, hogy amikor a bels˝o ciklus elkezd˝odik a CL regisztert mindig u´ jra kell inicializ´alni. Ez t¨ort´enik a 52. sorban, amikor a CL regiszterbe a´ tm´asoljuk a BL regiszter tartalm´at. (A BL regiszter tartalma nem v´altozik meg a nyomtat´as sor´an.) A bels˝o ciklusban a 54. sor v´egzi a nyomtat´ast. A 55. sor v´egzi a ciklus v´altoz´o cs¨okkent´es´et, majd a 56. sor val´os´ıtja meg a felt´eteles ugr´ast. Ha a CL regiszter tartalma a cs¨okkent´es ut´an nem z´erus, akkor megism´etelj¨uk a nyomtat´ast, mivel a belso c´ımre ugrik a program. Ha z´erus lett a CL regiszter, akkor a 57. sorban folytat´odik a program fut´asa. A 57-59. sorokban egy soremel´est nyomtatunk ki. Mivel itt megv´altozik a funkci´o k´od az AH regiszterben, ez´ert kell az 50. sorban ism´et be´all´ıtani a karakter nyomtat´o funkci´o k´odot. A 60. e´ s 61. sorok val´os´ıtj´ak meg a k¨uls˝o ciklust. A 62. sorban l´ep¨unk ki a programb´ol.
93
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
org 100h JMP olvas1 hiba1: MOV AH, 9 MOV DX, uzenet_nem_szam INT 21h JMP olvas1 hiba2: MOV AH, 9 MOV DX, uzenet_nem_szam INT 21h JMP olvas2 uzenet_nem_szam: amjegyet adott meg!’ db 10, 13, ’Nem sz´ uzenet1: db 10, 13, ’Adja meg a sorok szamat: $’ uzenet2: db 10, 13, ’Adja meg az oszlopok szamat: $’ olvas1: MOV AH, 9 MOV DX, uzenet1 INT 21h MOV AH, 1 INT 21h CMP AL, ’0’ JB hiba1 CMP AL, ’9’ JA hiba1 SUB AL, ’0’ MOV CH, AL olvas2: MOV AH, 9 MOV DX, uzenet2 INT 21h MOV AH, 1 INT 21h CMP AL, ’0’ JB hiba2 CMP AL, ’9’ JA hiba2 SUB AL, ’0’ MOV BL, AL ; folytat´ odik ...
9.13. t´abla: Egy t´eglalap kinyomtat´as´ara szolg´al´o program els˝o r´esze
94
45 ; nyomtatas itt kezdodik 46 MOV AH, 9 ; uj sor 47 MOV DX, ujsor 48 INT 21h 49 kulso: 50 MOV AH, 2 51 MOV DL, ’o’ 52 MOV CL, BL 53 belso: 54 INT 21h 55 DEC CL 56 JNE belso 57 MOV AH, 9 58 MOV DX, ujsor 59 INT 21h 60 DEC CH 61 JNE kulso 62 INT 20h 63 ujsor: 64 db 10, 13, ’$’
9.14. t´abla: Egy t´eglalap kinyomtat´as´ara szolg´al´o program m´asodik r´esze
95
9.10 Sakkt´abla nyomtat´asa Ez a program tulajdonk´eppen nagyon hasonl´ıt a t´eglalap nyomtat´o programhoz (9.9. fejezet), de itt nem egyf´ele karaktert kell nyomtatni, hanem felv´altva k¨ul¨onb¨oz˝o karaktereket. A 9.15. program mutatja be a sakkt´abla nyomtat´as´at megval´os´ıt´o assembly program. Ebben a programban is k´et egym´asba a´ gyazott ciklus van. Az egyik ciklus v´altoz´o a BX regiszter, m´ıg a m´asik a CX regiszter. B´ar a program 8x8-as t´eglalapot nyomtat ki, de a CX regiszter kezdeti e´ rt´eke csak 4. Ez az´ert van mert n´egy darab dupla karaktert nyomtatunk ki egy sorba: vagy XO vagy OX karaktereket. Az´ert van k´etf´ele dupla karakter, mivel az egyiket a p´aros a m´asikat a p´aratlan sorokba nyomtatjuk. A 7. sorban vizsg´aljuk meg, hogy a sor sz´ama, BX regiszter, p´aros-e. Hogyan csin´aljuk? A 7. sorban a TEST utas´ıt´as egy maszkol´ast v´egez e´ s a legkisebb helyi´ert´ek˝u bitet tartja meg a BX regiszterb˝ol. Ez az´ert elegend˝o, mivel a fels˝obb bitek minden kett˝o hatv´anyai azok csak p´arosak lehetnek, ez´ert a legals´o bit az ami eld¨onti, hogy a BX-ben t´arolt e´ rt´ek p´aros vagy p´aratlan. Ha a legkisebb helyi´ert´ek˝u bit 1 akkor a BX regiszter tartalma p´aratlan, ha z´erus, akkor p´aros. Miut´an eld˝olt, hogy p´aros vagy p´aratlan sort nyomtatunk, kinyomtatjuk a k´et megfelel˝o karaktert a bels˝o ciklusban. A bels˝o ciklus a 6. e´ s 21. sor k¨oz¨ott van. A 22. e´ s 26. sorok k¨oz¨ott csak egy sor emel´est nyomtatunk. A 27. sorban cs¨okkentj¨uk a BX regisztert, a k¨uls˝o ciklus ciklusv´altoz´oj´at e´ s ha nem z´erus akkor a 28. sorban a k¨uls˝o ciklus elej´ere ugrunk. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
org 100h mov bx, 8 mov ah,2 kulso: mov cx, 4 belso: test bx,1 jz paros paratlan: ; ez a cim igaz´ abol nem kellene mov dl,’O’ int 21h mov dl,’X’ int 21h jmp ciklus paros: mov dl,’X’ int 21h mov dl,’O’ int 21h ciklus: loop belso ; uj sor mov dl, 0dh int 21h mov dl, 0ah int 21h dec bx jnz kulso int 20h
9.15. t´abla: Egy sakkt´abla kinyomtat´as´ara szolg´al´o program
96
Ez a sakkt´abla nyomtat´asi feladat arra is j´o, hogy a XOR utas´ıt´as egy m´asik jellemz˝o alkalmaz´as´at is bemutassuk. K´et e´ rt´ekre alkalmazva a XOR utas´ıt´ast egy harmadik e´ rt´eket fogunk kapni a 7.4. t´abl´azat szerint. Ha u´ jra alkalmazzuk ugyanazt a XOR utas´ıt´ast az eredm´enyre, akkor az eredeti e´ rt´eket kapjuk vissza. N´ezz¨unk erre egy p´eld´at: MOV XOR XOR XOR XOR
AL, AL, AL, AL, AL,
33h 11h 11h 11h 11h
; ; ; ; ;
AL AL AL AL AL
= = = = =
33h !!! 22h 33h !!! 22h 33h !!!
A XOR utas´ıt´asnak ezt a tulajdons´ag´at haszn´alja ki a 9.16. program. A 6. sorban a nyomtatand´o karaktereket o¨ ssze-XOR-oljuk, (amib˝ol kapunk valamilyen e´ rt´eket) de ezut´an ezt az e´ rt´eket u´ jra XORolva az egyik karakterrel, hol az egyik, ‘X’, hol a m´asik, ‘O’, karaktert kapjuk meg a 10. sorban. Ebben a programban is a BX regiszter a k¨uls˝o ciklusv´altoz´o e´ s a CX regiszter a bels˝o ciklusv´altoz´o, aminek viszont 8 a kezdeti e´ rt´eke, mivel itt egyes´evel nyomtatjuk ki a karaktereket. A bels˝o ciklus ut´an a 13. sorban elmentj¨uk a DX regiszter tartalm´at, mert a soremel´es nyomtat´asn´al t¨onkretessz¨uk a regiszter tartalm´at. A 14-17. sorokban nyomtatjuk ki a soremel´es karaktereket e´ s a 18. sorban vissza´all´ıtjuk a DX regiszter tartalm´at. A 21. sor szorul m´eg magyar´azatra. N´ezz¨uk meg a k¨ovetkez˝o k´et sort: XOXOXOXO OXOXOXOX Azt lehet l´atni, hogy a m´asodik sort ugyanazzal a karakterrel kell kezdeni, mint amivel az els˝o sort lez´artuk. A 21. sor ezt biztos´ıtja, hogy a XOR utas´ıt´as alkalmaz´as´aval a ‘X’ karaktert “´atugorjuk”. V´eg¨ul a 22. e´ s 23. sor a k¨uls˝o ciklust val´os´ıtja meg.
97
1 org 100h 2 mov ah,2 3 mov bx, 8 4 mov dl, ’X’ 5 mov dh, ’O’ 6 xor dh, dl 7 kulso: 8 mov cx, 8 9 belso: 10 xor dl,dh 11 int 21h 12 loop belso 13 mov bp, dx ; elmenti DX-et ´j sor nyomtat´ 14 mov dl, 0dh ; u asa 15 int 21h 16 mov dl, 0ah 17 int 21h as DX-et allit´ 18 mov dx, bp ; vissza´ 19 ; mivel ugyanazzal a karakterrel 20 ; folytat´ odik a k¨ ovetkez¨ o sor 21 xor dl,dh 22 dec bx 23 jnz kulso 24 int 20h
9.16. t´abla: Egy sakkt´abla kinyomtat´as´ara szolg´al´o program XOR utas´ıt´assal
98
9.11 ASCII t´abla kinyomtat´asa A 9.17. t´abl´an l´athat´o program az ASCII t´abl´aban tal´alhat´o karaktereket nyomtatja ki a k´eperny˝ore. A program igen egyszer˝u. A 2. sorban adjuk meg, hogy 256 darab karaktert fogunk kinyomtatni. A 3. sorban megadjuk az els˝o karakter ASCII k´odj´at. A 4. sorban az INT 21h megszak´ıt´as funkci´o k´odj´at adjuk meg. A 6. sor v´egzi a nyomtat´ast, majd a 7. sorban a DL regiszter megn¨ovel´es´evel a k¨ovetkez˝o ASCII karaktert a´ ll´ıtjuk be. A 8. sor cs¨okkenti a CX regiszter tartalm´at eggyel e´ s ha m´eg nem z´erus, akkor az ujra c´ımre ugrik. A LOOP utas´ıt´as seg´ıts´eg´evel k´epezz¨uk a ciklust mely 256-szor fut le. Az utols´o sorban kil´ep¨unk a programb´ol. 1 2 3 4 5 6 7 8 9
org 100h MOV CX, 256 MOV DL, 0 MOV AH, 2 ujra: INT 21h INC DL LOOP ujra INT 20h
9.17. t´abla: Az ASCII t´abla kinyomtat´as´ara szolg´al´o program
99
9.12 Sz´am ki´ır´asa decim´alis form´aban Ha egy sz´amot decim´alis form´aban akarunk kinyomtatni, speci´alis nyomtat´asi elj´ar´ast kell alkalmazni. A 9.18. program erre mutat egy p´eld´at. Az algoritmus l´enyege, hogy a sz´amot mindig 10-el osztjuk e´ s az oszt´as marad´eka mindig egy decim´alis sz´amjegyet ad, hiszen a marad´ek 0 e´ s 9 k¨oz¨otti lehet. N´ezz¨unk egy p´eld´at: 152 / 10 -> 15 ´ es a marad´ ek: 2 ´s a marad´ 15 / 10 -> 1 e ek: 5 1 / 10 -> 0 ´ es a marad´ ek: 1 Amint ez l´athat´o t´enyleg a sz´am sz´amjegyeit kapjuk meg, de ford´ıtott sorrendben. Ezt is figyelembe kell venni az algoritmusn´al. A 2. sorban az AX regiszterbe t¨oltj¨uk be azt a sz´amot amit decim´alis form´aban szeretn´enk kiny´ omtatni. Erdemes arra is gondolni, hogy mivel az AX regiszter 16 bites regiszter ez´ert 21 6 = 65536 f´ele sz´amot tud csak t´arolni, ahol a legkisebb sz´am a nulla e´ s a legnagyobb sz´am a 65535. Erre az inform´aci´ora az´ert van sz¨uks´eg, mivel ´ıgy m´ar tudjuk, hogy maximum 5 sz´amjegyet kell majd kinyomtatni. Ezt mutatja a 18. sorban az szamstr v´altoz´o defin´ıci´oja, ami 5 darab SPACE karaktert tartalmaz e´ s a v´eg´en egy doll´ar jelet ($). A doll´ar jel az´ert kell a v´eg´ere, hogy majd egyben tudjuk a sz´amokat kinyomtatni az INT 21h megszak´ıt´assal. A 3. sorban az SI regiszterbe azt a c´ımet t¨oltj¨uk be ami az utols´o SPACE karakterre mutat a szamstr v´altoz´oban. Az 5. sorban adjuk meg az oszt´ot. A 6. sorban azt k´esz´ıtj¨uk el˝o, hogy majd az DX:AX sz´amot osztjuk egy 16 bites regiszterrel e´ s ´ıgy majd az eredm´eny is egy 16 bites regiszterbe ker¨ul. Az oszt´ast a 7. sorban v´egezz¨uk el. A h´anyados az AX regiszterbe, a marad´ek a DX regiszterbe ker¨ul. A marad´ek csak 0 e´ s 9 k¨oz¨otti sz´am lehet. A nyomtat´ashoz a sz´amot ASCII karakterr´e kell konvert´alni, vagyis a sz´amhoz hozz´aadjuk a ‘0’ karakter ASCII k´odj´at. A 8. sor ut´an a DL regiszter tartalma a 30h e´ s 39h e´ rt´ekek k¨oz¨otti sz´am lesz, mely megfelel a 0 e´ s 9-es sz´amok ASCII k´odj´anak. A 9. sorban elt´aroljuk az ASCII k´odot az SI regiszter a´ ltal megadott helyre. A 10. sorban az SI regisztert az´ert cs¨okkentj¨uk eggyel, hogy a k¨ovetkez˝o karaktert az el˝oz˝o el´e ´ırjuk. A 11. sor a le´all´ıt´asi felt´etel. Itt azt vizsg´aljuk, hogy a h´anyados z´erus-e, vagyis nincs tov´abbi sz´amjegy amit konvert´alni kellene. A 12. sor tartalmazza a felt´eteles ugr´ast, ami az ujra c´ımre ugrik ha ha van m´eg sz´am amit konvert´alni kell. Ha a h´anyados z´eros, AX regiszter tartalma z´erus, akkor nincs m´as h´atra mint kinyomtatni az elt´arolt sz´amokat. A program olyan e´ rtelemben tr¨ukk¨os, hogy a szamstr v´altoz´o alap esetben SPACE karaktereket tartalmaz, e´ s ´ıgy ha csak k´et jegy˝u sz´amot t´arolunk el, az´ert m´eg a program j´ol fog m˝uk¨odni, mivel ebben az esetben a program legfeljebb 3 SPACE karaktert nyomtat a sz´amok el˝ott.
100
1 org 100h 2 MOV AX, 54321 3 MOV SI, szamstr 4 ujra: 5 MOV BX, 10 ; 6 MOV DX, 0 ; 7 DIV BX ; 8 ADD DL, ’0’ ; 9 MOV [SI], DL ; 10 DEC SI ; 11 CMP AX, 0 12 JNZ ujra 13 MOV AH, 9 14 MOV DX, szamstr 15 INT 21h 16 INT 20h 17 szamstr: ’,’$’ 18 db ’
+ 4 10-es osztassal valasztunk le egy jegyet DX:AX az osztando szam, BX az oszto hanyados -> AX, maradek -> DX szamjegy karakterre eltaroljuk aroljuk e t´ visszafel´
9.18. t´abla: Sz´am ki´ır´asa decim´alis form´aban
101
9.13 Olvas´as a mem´ori´ab´ol A 9.19. program arra mutat egy p´eld´at, hogyan lehet a mem´ori´aban, egy fix c´ımen l´ev˝o byte-ot megc´ımezni, illetve azt vizsg´alni, hogy annak a byte-nak valah´anyadik bitje 1-e. A 0:417-es c´ımen tal´alhat´o byte ´ırja le a billenty˝uzet LED-ek a´ llapot´at. P´eld´aul ha a 7. bit e´ rt´eke 1, akkor a CAPS LOCK be van kapcsolva. Az al´abbi program azt fogja vizsg´alni, hogy a CAPS LOCK be van-e kapcsolva e´ s annek megfelel˝o u¨ zenetet fog ki´ırni. A 2. e´ s 3. sorban az ES szegmens regiszterbe a z´erus szegmens c´ımet t¨oltj¨uk. Mivel szegmens regiszterbe nem lehet k¨ozvetlen¨ul e´ rt´eket t¨olteni, ez´ert haszn´aljuk az AX regisztert. A 4. sorban direkt m´odon, szegmens regiszterrel egy¨utt adjuk meg a vizsg´aland´o byte c´ım´et. A byte-ot bet¨oltj¨uk a BL regiszterbe. Az 5. sor egy maszkol´ast hajt v´egre. L´enyeg´eben a 40h = 0100 0000b e´ rt´ekkel e´ s mivel az AND utas´ıt´ast haszn´aljuk ez´ert a m˝uvelet ut´an csak a 7. bit e´ rt´eke marad meg. P´eld´aul: 0101 1001 <- BL AND 0100 0000 <- Maszk -------------0100 0000 Ez azt jelenti, hogy az 5. sor ut´an a BL regiszter e´ rt´eke vagy z´erus vagy pedig 40h lesz. Ezt a felt´etelt haszn´alja ki a 6. sorban a felt´eteles ugr´as. (Nem kell k¨ul¨on o¨ sszehasonl´ıt´o utas´ıt´as, CMP, mivel az AND utas´ıt´as m´ar megfelel˝oen be´all´ıtja a Z´erus bitet, ZF.) Mivel csak egy u¨ zenetet akarunk kinyomtatni e´ s csak a nyomtatand´o u¨ zenet m´as ez´ert att´ol f¨ugg˝oen hogy a z´erust kaptunk-e a DX regiszterbe m´as c´ımet t¨olt¨unk. Fontos lehet m´eg kiemelni a 8. sorban a felt´etel n´elk¨uli ugr´ast, JMP. Erre az´ert van sz¨uks´eg, mert miut´an be´all´ıtottuk a DX regiszter tartalm´at a 7. sorban, m´ar csak nyomtatni kell e´ s nem szabad engedni hogy a DX regiszter tartalm´at fel¨ul´ırjuk. Ha nincs a felt´etel n´elk¨uli ugr´as akkor pedig ez t¨ort´enne, mivel a 9. sorban folytat´odna a program. A 12. sort´ol m´ar ugyanazt kell csin´alni mind a k´et esetben, be´all´ıtani a funkci´o k´odot az INT 21h megszak´ıt´asnak, megh´ıvni a megszak´ıt´ast, majd kil´epni a programb´ol. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
org 100h mov mov mov and jnz mov jmp
ax,0 es,ax bl,[es:417h] bl, 40h eg dx,kikapcs kiir
eg: mov dx,bekapcs kiir: mov ah,9 int 21h int 20h kikapcs: db ’Ki van kapcsolva$’ bekapcs: db ’Be van kapcsolva$’
9.19. t´abla: CAPS LOCK a´ llapot´anak nyomtat´as´ara szolg´al´o program
102
0.bit 1.bit 2.bit 3.bit 4.bit 5.bit 6.bit 7.bit
az el˝ot´er k´ek sz´ın¨osszetev˝oje az el˝ot´er z¨old sz´ın¨osszetev˝oje az el˝ot´er piros sz´ın¨osszetev˝oje az el˝ot´er intenzit´asa a h´att´er k´ek sz´ın¨osszetev˝oje a h´att´er z¨old sz´ın¨osszetev˝oje a h´att´er piros sz´ın¨osszetev˝oje a villog´as ki-bekapcsol´asa (a bit 1 e´ rt´ek´en´el villog)
9.20. t´abla: A k´eperny˝o byte attrib´utum´anak bitjei
9.14 K¨ozvetlen vide´o mem´ori´aba ´ır´as Lehet˝os´eg van arra, hogy egy program k¨ozvetlen¨ul a videok´artya mem´ori´aj´aba ´ırjon adatot e´ s ilyen m´odon k¨ozvetlen¨ul a k´eperny˝ore ´ırjunk. Ehhez persze tudnunk kell, hogy melyik szegmensen kezd˝odik ´ aban a 0B800h a a k´eperny˝o mem´oria, vagyis hova van lek´epezve a videok´artya mem´ori´aja. Altal´ szegmens c´ıme, kiv´eve p´eld´aul a Herkules video k´artya (ma m´ar nem haszn´alj´ak ezt a k´arty´at). Teh´at a 0B800h a szegmens c´ımet fogjuk haszn´alni a 80x25 karakteres sz¨oveges k´eperny˝o eset´en. A nyomtat´ashoz m´eg azt is tudnunk kell, hogy milyen a k´eperny˝o fel´ep´ıt´ese. Minden megjelen´ıtett karakterhez k´et byte tartozik: az egyik byte maga a karakter, a m´asik byte pedig a karakter attrib´utuma. Az attrib´utum a karakter sz´ın´et, intenzit´as´at e´ s villog´as´at jelenti a 9.20. t´abl´azat szerint. A k´eperny˝o bal fels˝o sark´ahoz tartozik a z´erus oszlop e´ s z´erus sor karakter poz´ıci´o. Hogyan lehet egy tetsz˝oleges poz´ıci´oj´u karaktert kinyomtatni?
103
9.15 Sz¨oveg beolvas´asa Karakterenk´ent olvasunk. ESC-re v´ege Az INT 21 el˝ok´esz´ıt´ese e´ s haszn´alata.
104
9.16 Beolvasott sz¨ovegben karakterek sz´aml´al´asa
105
˝ 9.17 Beolvasott sz¨oveg nagy betusre konvert´al´asa
106
9.18 Feladatok 1. ´Irjunk programot, mely megsz´amolja, hogy egy byte-ban h´any darab 1-es e´ rt´ek˝u bit van. ´ 2. Irjunk programot, mely bek´er egy decim´alis sz´amjegyet. A sz´amjegyr˝ol eld¨onti, hogy nagyobb-e mint o¨ t e´ s ennek megfelel˝o u¨ zenetet ´ır ki: “Nagyobb mint o¨ t”, “Kisebb mint o¨ t”, “Egyenl˝o o¨ ttel”.
107
108
10. Fejezet
Speci´alis programok 10.1 Hardware vez´erl´es 10.2 Zen´el˝o program 10.3 Mem´oria rezidens programok 10.4 V´ırusok
109
110
11. Fejezet
Megjegyz´esek 11.1 Szok´asos hib´ak
111
112
¨ A. Fuggel´ ek
ASCII t´abl´azat Elvileg 256 ASCII karakter van. Az A.1. t´abl´an l´athat´o ASCII t´abl´azat csak a fontosabb karaktereket tartalmazza e´ s direkt ilyen m´odon van a´ br´azolva. dec ⇓ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
⇒ hex 0 1 2 3 4 5 6 7 8 9 A B C D E F
0 0 NULL
BELL BS HT LF VT FF CR
16 1
32 2 SPC ! ” # $ % & ’ ( ) * + , . /
48 3 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
64 4 @ A B C D E F G H I J K L M N O
80 5 P Q R S T U V W X Y Z [ \ ] ˆ _
A.1. t´abla: Egyszer˝us´ıtett ASCII t´abl´azat A t´abl´azatban szerepl˝o speci´alis szimb´olumok magyar´azata: BELL - Alarm BS - Backspace HT - Horizontal TAB LF - Linefeed VT - Vertical TAB FF - Formfeed CR - Carriage return
113
96 6 ‘ a b c d e f g h i j k l m n o
112 7 p q r s t u v w x y z { | } ˜ DEL
SPC - Space DEL - Delete
114
¨ B. Fuggel´ ek
Felhaszn´alt irodalom • Agner Fog: Optimizing subroutines in assembly language An optimization guide for x86 platforms, Copenhagen University College of Engineering, 2009. • Sivarama P. Dandamudi: Introduction to Assembly Language Programming, For Pentium and RISC Processors, Springer, 2005.
115
P´elda programok list´aja ¨ karakter beolvas´asa e´ s kinyomtat´asa ford´ıtott Ot sorrendben, 88 ASCII t´abla kinyomtat´asa, 99 CAPS LOCK a´ llapot´anak nyomtat´asa, 102 Egy byte bin´aris kinyomtat´asa, 79 Egy byte hexadecim´alis kinyomtat´asa, 83 Egy hexadecim´alis sz´am kinyomtat´asa, 81 Egy karakter beolvas´asa e´ s a k¨ov. kinyomtat´asa (a), 86 Egy karakter beolvas´asa e´ s az ut´ana k¨ov. kinyomtat´asa (b), 86 Egy karakter kinyomtat´asa, 46 Egy karakter n-szeri kinyomtat´asa, 92 Egy sakkt´abla kinyomtat´asa, 96 Egy sakkt´abla kinyomtat´asa XOR-al, 97 Egy sz¨oveg kinyomtat´asa, 47 Egy sz´amjegy beolvas´asa e´ s kinyomtat´asa, 85 Egy t´eglalap kinyomtat´asa, els˝o r´esz, 93 Egy t´eglalap kinyomtat´asa, m´asodik r´esz, 93 Els˝o program, 45 K´et sz´am o¨ sszead´asa, 89 K´et sz´am o¨ sszead´asa ciklussal, 89 Sz´am ki´ır´asa decim´alis form´aban, 100
116
T´argymutat´o ASCII, 46 AT&T, 12, 13 big-endian, 22 branching, 19 Carry bit, 80 CISC, 9 COM, 77 data alignment, 23 EXE, 78 g´epi k´od, 9 I/O kontroller, 24 Intel, 12 Little endian, 36, 38 little-endian, 22 LSB, 22 maszkol´as, 83 megszak´ıt´as, 25 memory management, 77 MSB, 22 Program Segment Prefix, 77 PSP, 77 rendszer busz, 15 RISC, 9 seg kulcssz´o, 37 times kulcssz´o, 37 ugr´o utas´ıt´as, 19 wrt kulcssz´o, 38
117