Upload
ilija-martinovic
View
47
Download
12
Embed Size (px)
Citation preview
2006
32.973-018.1
004.43
12
. .
12 Intel Pentium. .: , 2006. 410 .: .
ISBN 5-469-00662-X
Intel
Pentium. ,
, MMX, SSE
SSE2.
Intel Pentium, Intel Pentium 4. -
. ,
.
32.973-018.1
004.43
.
.
, , , .
, ,
, .
ISBN 5-469-00662-X , 2006
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1. Intel x86 . . . . . . . . . . . . . . . 14
2. . . . . . . . . . . 21
3. . . . . . . . . . . . . . . . . . . . . . . 26
4. . . . . . . . . . . . . . . 53
5. . . . . . . . . . . . . . . . . . 61
6. . . . . . . . . . . . . . . . . . . . . 93
7. . . . . . . . . . . . . . . . . . . 120
8. . . . . . . . . . . . . . . . 163
9. . . . . . . . . . . . . 206
10. . . . . . . . . . . . . . . . . 250
11. Intel Pentium . . . . . . . . . 266
12. MMX- Intel Pentium . . . . . . . . . . . . . 270
13. SSE- Intel Pentium . . . . . . . . . . . . . . 318
14. SSE2 Intel Pentium 4 . . . . . . . . . . . . 362
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
. 80x86 . . . . . . . . . . . . . 399
. 80x86 . . . . . . . . . . 406
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1. Intel x86 . . . . . . . . . . . 14
2. . . . . . . . 21
2.1. . . . . . . . . . . . . . . . . . . . . . 23
2.2. . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3. . . . . . . . . . . . . . . . . . . 26
3.1. . . . . . . . . . . . . . . . . . . . . 26
3.2. . . . . . . . . . . . . . . . . . . . 32
3.3. Intel Pentium . . . . . . . . . . . . . . . . 38
4. . . . . . . . . . . . 53
4.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.2.
MASM . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.3. MASM . . . . . . . . . . . . . . . . . . 57
5. . . . . . . . . . . . . . . 61
5.1. . . . . . . . . . . . . . . . . . . . . . . 63
5.2. jmp . . . . . . . . . . . . . . . . . . . . 66
5.3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.4. Intel Pentium . . . . . . . . . . . . . . . . 78
6. . . . . . . . . . . . . . . . . 93
6.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
6.2. . . . . . . . . . . . . . . . . . . . 100
6.3. . . . . . . . . . . . . . . 110
6.4. . . . . . . . . . . . . . . 116
7. . . . . . . . . . . . . . . 120
7.1. . . . . . . . . . . . . . . . . . . . . . 124
7.2. . . . . . . . . . . . . . . . . . . . . . . . . 135
7.3. . . . . . . . . . . . . . . . . . . . . . . 145
7.4. lods stos . . . . . . . . . . . . . . . . . . . . . 150
7.5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
7.6. . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
7.7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
8. . . . . . . . . . . . . 163
8.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
8.2. . . . . . . . . . . . . . . . . . . . . . . . 166
8.3. . . . . . . . . . . . . . . . . . . . 168
8.4. . . . . . . . . . . . . . . . . . . . . . . . . . . 170
8.5. ASCII BCD . . . . . . . . . . . . . . . . . 189
8.6. ASCII- . . . . . . . . . . . . . . 197
8.7. ASCII . . . . . . . . . . . . . . 199
8.8. . . . . . . . . . . . . . . . . . . . . . 200
9. . . . . . . . . . 206
9.1. . . . . . . . . . . . . . . . . . . . . . . . . 207
9.2. . . . . . . . . . . . . . . . . . . . . . . . . . 209
9.3. . . . . . . . . . . . . . . 214
10. . . . . . . . . . . . . 250
10.1. . . . . . . . . . . . . . . . . . 250
10.2. Delphi 2005 . . . . . . . . . . . . . . 255
10.3. Visual C++ .NET 2005 . . . . . . . . . 261
11. Intel Pentium . . . . 266
11.1. Intel NetBurst . . . . . . . . . . . . . . . . . . . . . . 266
11.2. Intel Pentium 4 . . . . . . 268
12. MMX- Intel Pentium . . . . . . . . . 270
12.1. . . . . . . . . . . . . . . . . . . . . . . . . . 274
12.2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
12.3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
12.4. . . . . . . . . . . . . . . . . . . 287
12.5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
12.6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
12.7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
12.8. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
12.9. . . . . . . . . . . . . . . . . . . . . . . . . . 316
7
13. SSE- Intel Pentium . . . . . . . . . . 318
13.1. . . . . . . . . . . . . . . . . . . . . . . . . 322
13.2. . . . . . . . . . . . . . . . . . . . . . . . . 328
13.3. . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
13.4. . . . . . . . . . . . . . . . . . . . . . . . . 347
13.5. . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
13.6. . . . . . . . . . . . . . . . . . . . . . 356
13.7. . . . . . . . . . . . . . . . . . . . . . . . 356
13.8. . . . . . . . . . . . . . . . . . . . 360
14. SSE2 Intel Pentium 4 . . . . . . . . 362
14.1. 128- . . . . . 364
14.2. 128- . . . . . . . . 385
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
. 80x86 . . . . . . . . 399
. 80x86 . . . . . . 406
. . . . . . . . . . . . . . . . . . . . . . . . . . . 409
8
Intel Pentium. ,
, -
Intel Pentium.
. -
, .
,
. :
,
, , , Visual C++ .NET Microsoft
Borland Delphi 2005?
-
, , . . -
.
. -
-
. , C++ Pascal, -
, Visual C++
Delphi, . , -
-
, SIMD.
, , -
( -
),
.
, ,
, .
,
, , .
, , -
, ,
. Visual C++ .NET Delphi 2005 -
. ,
Microsoft .
- -
, -
.
,
, -
.
,
, . -
, -
-
.
, -
, - . -
-
MASM32, AsmStudio NASM.
. -
, -
, -
.
- -
Intel Pentium, -
,
(SIMD).
,
--
, -
.
,
SIMD. -
, . ,
.
.
. -
,
10
, ,
, , . -
.
MASM Micro-
soft 7.10.xxxx. Win-
dows XP DDK Windows Server 2003 DDK.
6.14.xxxx, SIMD -
.
MASM32 8, -
ML 6.14.xxxx LINK 5.12.xxxx
Microsoft.
, -
.
MASM, , -
.
-
.
,
, .
, .
14 .
1, Intel x86. -
x86 Intel -
Intel Pentium.
2, .
.
-
MASM Microsoft.
3, .
, , -
Intel.
4, . -
-
.
5, . -
. -
-
Intel Pentium.
11
6, .
,
. -
, -
.
7, . -
Intel Pentium -
. -
.
8, . -
,
.
9, . -
-
.
10, . -
. -
.
11, Intel Pentium . -
Intel Pentium 4 -
.
Pentium 4.
12, MMX- Intel Pentium. -
MMX -
-
.
13, SSE- Intel Pentium. -
SSE
.
14, SSE2 Intel Pentium 4. -
SSE2 -
. -
.
Intel
( ).
, .
12
.
.
,
: [email protected] ( , ).
!
, , http://
www.piter.com/download.
- -
: http://www.piter.com.
13
Intel x86
Intel. Intel ,
, ,
. -
Intel 8086,
Intel x86.
Intel. 1979 . Intel
16- 8086,
- 70- . -
8086 , -
80x86 86.
8088, -
8086 16- , -
8 . 1981 . 80186/80188, -
8086,
. --
: , / -
. , -
. ,
.
80286. -
, -
. 80286 :
( 8086)
(protected virtual address mode), -
. -
16 , -
.
1
32- 80386
: -
. -
8086 --
(real address mode).
80386 16-
80286 - .
32- , .
32- 80386:
,
, . -
4 .
80386
(34 ) -
.
1989 . Intel i486,
. -
386,
. -
, - -
.
. i486
8 , ,
.
-
Intel Pentium.
i486 ,
. , u v,
-
.
,
8 .
i486 (write-through) -
(write-back).
Intel Pentium -
(branch prediction).
-
.
. , Intel Pentium
,
8086 4
4 .
32-,
128 256 ,
Intel x86 15
. ,
64- .
Intel Pentium , -
, . ,
:
;
;
;
;
64- ;
;
;
;
.
Intel c
Intel Pentium -
. ,
. ,
, , -
.
-
.
Intel Pentium -
32--
Intel. , i486 -
,
Intel -
.
, Pentium,
.
-
, , -
.
-
. - Pentium
8
. - -
32- , , .
64- ,
.
16 1 Intel x86
, ,
-
. , -
. -
, -
. Intel Pentium
-
.
-
, -
.
Intel Pentium -
-
,
8- -
. 4- -
4- . ,
, -
,
. , , ,
, .
Intel Pentium
,
33 M i486, -
, 3D- CAD/CAM--
.
-
(Advanced Programmable Interrupt Cont-
roller, APIC), Intel
Pentium. Intel Pentium
MMX (MultiMedia eXtensions
). MMX
64- SIMD
(Single Instruction, Multiple Data , ).
-
.
MMX
, ,
.
Intel Pentium
32- . 64--
, .
, -
, 256- .
Intel x86 17
,
. 64- -
Intel Pentium
528 M/ 66 160 M/ 50
i486. -
,
Intel Pentium i486.
Intel Pentium 60 66 -
- 64-
, .
. Intel Pentium
.
Intel Pentium
. -
, Intel Pentium 100
66 , 90 60 . -
-
, , PCI.
Intel Pentium P6,
1995 . -
, -
.
P6 Intel Pentium Pro.
, Intel Pentium II, Intel Pentium II Xeon,
Intel Celeron, Intel Pentium III Intel Pentium III Xeon.
Pentium Pro
Intel Pentium. Intel Pentium
86,
. -
, ,
,
.
Pentium Pro -
, .
, -
.
Intel Pentium, Pentium Pro
, -
, -
, .
Pentium Pro
. , -
( -
,
18 1 Intel x86
).
, . -
,
: , FPU
(Floating-Point Unit) .
-
(retirement unit), -
.
Intel Pentium, Pentium Pro -
(2nd-level cache) 256 . Pentium Pro
36- , -
64 .
Pentium Pro -, -
. -, -
(static) (Random Access
Memory, RAM) 256 512 , -
Pentium Pro.
Intel Pentium II P6 -
MMX. Pentium II Xeon, -
Intel.
4- 8- ,
, 2 .
.
Intel Celeron
IA-32 -
.
128 K, .
Intel Penti-
um III, SSE (Streaming SIMDExtensions
SIMD-).
MMX. 128-
.
, Pentium III Xeon -
(advanced transfer cache).
Intel Pentium 4
Intel, IA-32, -
NetBurst.
Intel,
, Pentium 4
. NetBurst
:
, -
(rapid execution engine);
Hyper Pipelined;
Intel x86 19
Advanced Dynamic Execution;
-;
SSE2 (Streaming SIMD Extensions 2), -
MMX SSE Intel
128- -
128-
;
.
NetBurst -
(400 ) ,
:
3,2 /, 3 -
Pentium III;
100 M
(400 M);
;
128- 64-
;
-
, IA-32.
20 1 Intel x86
,
. -
, --
.
, ,
Intel x86 -
.
, -
,
. , -
, ,
, .
, MASM Microsoft,
. MASM -
:
MASM -
;
MASM (7.10.xxxx)
(SIMD), -
. -
,
;
, MASM, -
;
2
, MASM, -
, (Microsoft
Visual C++ .NET Borland Delphi 2005).
,
.
TASM, , ,
. -
-
Intel, -
(SIMD).
, -
6.14.xxxx,
SIMD 7.10.xxxx. -
MASM32,
6.14 -
. MASM32 8.2.
MASM. , -
6.14.xxxx .
MASM Microsoft , -
, .
:
1. (assembling)
. , ,
ASM,
OBJ.
2.
/ ( EXE).
ml.exe, -
, link.exe.
, -
. ml, link ,
.
,
ml link,
. -
, -
MASM, .
,
OPTION. , - .
.
22 2
2.1.
ml.exe -
. -, -
. -, ml.exe
link.exe,
.
:
1. , -
.
2. .
3. , , , mydata and 10h, .
4. , . ,
mov AX, 10, - , .
5.
, .
6. .
7. (relocatable addresses).
8. .
9. link.exe (-
, INCLUDELIB DOSSEG).
MASM 6.14 Microsoft.
2.2.
-
link.exe.
EXE-.
, ,
, . -
.
, ( -
) :
;
,
;
-
.
2.2. 23
, 16- , -
str MS-DOS, :
assume CS:code, DS:datacode segmentstart:mov AX, datamov DS, AXmov , 09hmov DX, offset strint 21hmov AX, 4C00hint 21h
code endsdata segmentstr DB "Test string$"
data endsend start
MS-DOS
, Windows 2000 Windows XP, -
, -
.
, , Windows XP,
.
, MS-DOS Windows -
,
MS-DOS Windows. -
MS-DOS 16- -
, Windows XP, , 32-
.
ml.exe link.exe MASM -
.
ASM
:
ml /c /coff _.asm
COFF.
/coff , - OMF.
link.exe OBJ- COFF,
OMF,
OMF COFF. -
COFF. , ,
, Visual C++ .NET,
COFF.
, Borland Delphi 2005, -
OMF.
24 2
,
MS-DOS,
link /co _.obj
, link.exe -
16- MS-DOS. 32--
EXE-.
32- EXE- -
, :
link /SUBSYSTEM:WINDOWS /OPT:NOREF _.obj
, . -
MASM , -
.
MASM.
2.2. 25
, , -
,
. , -
, Intel
.
,
, -
, .
-
, , -
.
Intel Pentium.
, ,
Microsoft 6.14 . ,
, .
, -
. -
,
, .
3.1.
-
. -
. : 0 1
.
, ,
3
(8 , ), -
( --
). . -
, -,
. , -
. 3.1.
. 3.1.
7, 0. -
(. 3.2).
. 3.2.
, ,
.
.
, .
.
, ,
. , 4 , ,
. ,
( ) ( )
. :
, -
(. 3.3).
,
() 1, 3 7- .
,
, . -
. 3.4.
3.1. 27
. 3.3.
, -
.
, ,
. -
.
, , -
, -
(. . 3.4).
. 3.4.
, . -
(), .
. (), -
:
10100101
, -
:
1 27 + 0 26 + 1 25 + 0 24 + 0 23 + 1 22 + 0 21 + 1 20.
165. ,
, n ,
k 2n1 + k 2n2 + . . . + k 20.
28 3
k : 0 1. n -
.
, ,
, , , , -
, .
-
, - -
. , -
, .
, .
, -
1.
61. -
61 00111101, -
:
11000010 ( 61)
+
00000001
------------
11000011 (61)
. -
:
0 + 0 = 0
1 + 0 = 1
0 + 1 = 1
1 + 1 = 0 + 1 ( )
, -
.
. 3.5.
. 3.5.
3.1. 29
: ,
. , 61 61, 0:
00111101 (61)
+
11000011 (61)
------------
00000000
, -
. .
, , -
. ,
() -
.
. 5 2. -
5 + (2). 5 -
00000101, 2 11111110.
:
00000101 (5)
+
11111110 (2)
------------
00000011 (3)
. -
, , -
.
,
.
- -
.
. 0 F , -
16, . -
.
, -
. -
.
. 3.1 ,
0 15.
,
.
30 3
3.1. ,
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
10 1010 A (a)
11 1011 B (b)
12 1100 C (c)
13 1101 D (d)
14 1110 E (e)
15 1111 F (f)
, -
: B, b ; H, h .
:
56 = 00111000b = 38h
13 = 11110101 = F5h
, : -
. .
: 3Fh 27h:
3F
+
27
---
66
, F 7,
22 ( ), 22 16 = 6,
.
3 + 2 + , -
66h.
3.1. 31
7Eh
AAh:
AA
7E
---
2C
, A (10 ) E
(14 ), .
16 + 10 14 = 12 -
C. 9 7 = 2. -
2Ch.
, -
. -
ASCII (American National Standard
Code for Information Interchange
).
A ASCII
41h, B 42h
. .
. 8- ASCII, -
, 256 ,
.
3.2.
-
. -
, , ,
. MASM -
:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Za b c d e f g h i j k l m n o p q r s t u v w x y z0 1 2 3 4 5 6 7 8 9? @ _ $ : . [ ] ( ) < > { }+ / * & % ! ' ~ | \ = # ^ ; , ` "
-
. , _, ?, $ @, . 1 31
( 31, ).
, -
.
32 3
, , ,
.
-
:
, ( 16--
, :
; 32- );
;
, , .
(label) ,
. 16-
:, 32--
.
EQU, :
var1 EQU label1. . .label1:
mov AX, 1. . .
,
EQU . -. :
name1 EQU 'ABCD'digit EQU 10
, , -
. , (-
) , , . -
(location counter), $.
, NEAR. - :
string1 BYTE "Test String"level WORD 5res BYTE 10 DUP (?)len EQU $-string1
len 22 ( - string1, level res).
,
. -
, Abs abs . - /ML /MX MASM.
, -
, .
3.2. 33
. / -
, ( ). -
: B , O , D T
, H .
(,
ABh 0ABh). A F
.
, :
DB 1 - . ,
, DUP (. ), ?. ? . , -, . , -
BYTE - .
, .
,
, ;
DW (2 ) .
, - , DUP, -, ?. ? - . , , .
, WORD - .
. ( )
.
, , ;
DD (4 ) .
, - , ,
, DUP, , ?. ? ., , .
, DWORD . -
. ( )
. ,
, . ;
DQ 8 - . , -
, , -
, DUP, , ?. ? . ,
34 3
, . , -
QWORD - .
. ( )
. ,
, . ;
DT 10 - . -
, , - ,
, DUP ?. ? - . , ,
. ,
TWORD -. .
( )
. , -
, . .
DT , , , , .
10- , -
(D d
, H h ). -
, -
.
DUP. :
DUP (, ...)
-
. -
, , -
DUP ( 17 DUP). , , . DUP , .
:
db1 DB 1db2 DB 'ABCD'db3 DB ?dw1 DW 9325dw2 DW 4*3dw3 DW 1,'$'dw4 DW arraydd1 DD 'xyz'dd2 DD 1.5dq1 DQ 18446744073709551615mix1 DB 5 DUP(5 DUP(5 DUP(10)))mix2 DW DUP(1,2,3,4,5)
3.2. 35
() -
. ( ) -
:
xxxx.xxxx[R][[+|-]]xxxx.xxxx[[E[[+|-]]xxxx]]
x 0 9.
DD, DQ DT, :
a1 DD 56.23Ra2 DD -45.6Ra3 DD 211.77E-2
, :
[[+|-]]xxxx
x 0 9.
, ,
.
:
'cccccc'"ccccc"
c .
( -
)
. -
(CR/LF).
, . -
.
, ,
.
EQU, LABEL =. :
=
, ,
.
. -
.
. -
,
.
36 3
, -
, .
65 535.
:
int = 167string1 = 'ab'const = 7*4addr1 = string1
EQU :
EQU
EQU , . -
, 16- ,
. -
.
,
. -
. , ,
, , ,
. ,
, , .
.
EQU:
k EQU 1024adr EQU [BP]cle EQU XOR AX,AXd EQU BYTE PTRt EQU 'File'MASM EQU 5.1 + 0.9Msft EQU mat EQU 20*30
LABEL :
LABEL
LABEL - .
.
: BYTE, WORD, DWORD, QWORD,TBYTE, NEAR, FAR.
LABEL:
byte_array LABEL BYTEword_array DW 10 DUP(0)
byte_array word_array .
3.2. 37
3.3. Intel Pentium
,
, -
. -
Intel Pentium, :
8 , -
;
6 ;
EFLAGS, - ( )
;
- EIP ;
() ;
.
Intel Pentium.
Intel Pentium
. -
. 3.6.
. 3.6. Intel Pentium
38 3
. 32- (EAX, EBX,ECX, EDX, ESI, EDI, EBP, ESP), :
;
;
.
-
, -
ESP , . -
- -
. ECX, ESI EDI. , ,
, , ,
DS. -
:
EAX ;
EBX , , - DS;
ECX ;
EDX -;
ESI , , - DS ( -);
EDI , , ES ( --);
ESP , SS;
EBP , , - SS.
16 32- -
, 16- 8086 AX, BX,CX, DX, BP, SI, DI, SP. , 16- AX, BX, CX DX - 8- (AH, BH, CH, DH), (AL, BL, CL, DL). . 3.7.
(CS, DS, SS, ES, FS GS) 16- - . ,
3.3. Intel Pentium 39
.
4.
. 3.7.
, ,
: /
EFLAGS - EIP. .
EFLAFS, , 32 - , , ,
. . 3.8
.
. 3.8. /
40 3
. 3.8 -
:
OF ( ) ,
;
DF ( ) . DF = 0, , . DF = 1, ;
SF ( ) , SF = 1;
ZF ( ) 1, 0;
AF ( ) - - .
( 3);
PF ( ) 1, ;
CF ( ) , .
CF stc, clc cmc. , ,
bt, bts, btr btc. ,
, -
(BCD) .
, CF 1 ( ) . -
( ), -
1 OF.
BCD, AF . SF , . ZF .
-
CF adc ( ) sbb( ) , -
.
jCC (CC : eq, le, lt, ne . .), setCC, loopCC cmovCC.
-
pushf, pushfd, popf, popfd. , AX - lahf sahf.
3.3. Intel Pentium 41
EIP . -
jCC, call, ret iret, EIP - -
, . -
- , -
, call, , .
EIP , - , , - . ,
call.
, ,
.
. 32- Intel Pentium
:
, , (flat memory model) -
. -
. , , -
.
, 232.
. 3.9;
. 3.9.
(segmented memory model)
, -
42 3
. , -
. ,
,
( ) . , 32--
, 16 383 ,
232 . -
. 3.10.
. 3.10.
: , ,
, -
. -
.
.
. ,
,
;
(real-address mode memory model)
, 8086. -
, -
16- .
, -
64 . ,
, 220 .
3.3. Intel Pentium 43
32- -
, , . 32- -
, ,
. 32-
16- 32- . 16--
16-
16- .
, -
. - -
.
, -
.
,
, .
, .
- , , -
. - -
, -.
, , -
.
:.
16 : 16 16 : 32.
(Effective
Address, EA).
. -
, -
, . 3.2.
3.2.
CS
SS
,
,
ESP EBP
DS
, ,
-
- ES ,
ES
-
44 3
, -
. 3.2.
DS, - , .
, , EAX , ES , EBX.
mov ES:[EBX], EAX
, -
.
-
, ,
. :
-
CS;
-
ES;
-
SS.
. 16--
, , , :
mov DS, BX
, BX, - DS. - 48- , .
32- , 16- -
.
, , -
.
-
, . -
,
, , -
.
, , -
. -
:
, 8-, 16- 32- ;
, -
;
3.3. Intel Pentium 45
,
;
, 2, 4 8.
, , ,
, -
. , . 3.11.
. 3.11. (EA)
,
-
:
ESP ;
ESP EBP, SS. DS.
, ,
, .
.
.
1.
. . -
. -
,
mov AX, mem1
mem1 . -, - , -
. , , mem1 -. , , , -
PTR:
mov AX, word ptr mem1
, mem1 . - AX 1D7Fh (. 3.12).
46 3
. 3.12. mem1
AX mem1,
mov AX, word ptr mem1+2
AX mem1(. . 3.12), AX 0EC34h ( - !).
PTR.
PTR
PTR , , .
, . 3.3.
3.3. PTR
BYTE 1
WORD 2
DWORD 4
QWORD 8
TBYTE 10
NEAR 0FFFFh
FAR 0FFFEh
. BYTE, WORD, DWORD,QWORD TWORD , NEAR FAR . PTR , . , PTR ,
(, WORD). 2. -
(). -
, .
.
lea BX, mem1mov AX, [BX]
mem1 . - BX, AX
3.3. Intel Pentium 47
, , BX. - . 3.13.
. 3.13.
, mem1 1A9Fh 1CD6h ( ) 1CD7 (-
). BX mem1, . AX mem1.
3.
( + ). -
:
, 2. -
, -
;
. -
, -
, . ,
EBP, . - .
, , -
. MASM
:
[ + ][][]
48 3
, , -
, . :
. . .s1 DB "String 1". . .lea EBX, s1mov AL, byte ptr [EBX][5]. . .
(lea EBX, s1) EBX , - ( 0).
EBX 5, 6- s1 ( g), AL. , - AL g. - . 3.14.
. 3.14.
4. -
+ .
,
. ,
AL s1 10 (11- , +):
. . .s1 DB "!@#$%^&*()+][". . .mov EBX, 10mov AL, byte ptr s1[EBX]. . .
3.3. Intel Pentium 49
5. -
( ) + .
, , 2, ,
. . -
, .
, :
. . .s1 DB "0123456789ABCDEF". . .mov EBX, 7mov AL, byte ptr s1[EBX*2]. . .
EBX AL E, 14 (7 2) s1.
6. -
+ + .
-
, .
, :
. . .s1 DB "ABCD EFGH IJKLM"s2 DB "abcd efgh ijklm"s3 DB "0123 4567 89"sarray label dword
DD s1DD s2DD s3
. . .mov EBX, sarray+4mov ESI, 10mov AL, byte ptr [EBX][ESI][2]. . .
sarray, s1 s3. , - . , k, - s2. EBX , ESI . EBX s2, (- mov EBX, sarray+4), ESI , k ( 10).
mov ESI, 10
k 2 ijklm, - AL:
mov AL, byte ptr [EBX][ESI][2]
7.
+ ( ) + . -
50 3
, -
, .
, :
. . .a1 DD 45, -87, 23, -11, 83, -442, 56, -340a2 DD 92, -31, 9, -598, 361, 406, -172, 7a3 DD 234, 8, -177, 921, 380, -12, 0, -51iarray label dword
DD a1DD a2DD a3
. . .mov EBX, iarray+8mov ESI, 4mov EAX, [EBX][ESI*2][8]
(a1 a3), - . , 380 ( -
) EAX. , .
EBX a3 ( mov EBX, iarray+8), - . , EBX . ESI , - 4 ( )
mov ESI, 4
, a3 (380) EAX:
mov EAX, [EBX][ESI*2][8]
[ESI*2], 8, a3c 2 ( 177), [8] 8. (EBX, ESI, 8) (EA) .
, - -
,
.
:
MASM 7.10 Windows XP DDK.
, -
. -
. , -
20 EAX:
sub EAX, 20
, div idiv, . -
, -
, (232).
3.3. Intel Pentium 51
, ,
. -
, .
, .
:
mov EAX, EDXadd EAX, ECX
.
:
mov EAX, BL
EAX BL , .
Intel Pentium.
,
. (general-purpose instructions) -
:
(, ) ;
(, ,
);
;
( , -
);
( ,
, ).
- (, -
, -
. .).
,
, , (EAX,EBX, ECX, EDX, ESI, EDI, EBP, ESP) (CS, DS, SS, ES, FS, GS).
MASM 6.14 -
Intel Pentium, MMX-,
SSE- SSE2-,
. .
52 3
-
.
, , -
. , -
MASM Microsoft,
. -
. 3, -
.
4.1.
, ,
.
Intel Pentium :
. 16--
-
64 , 32- 4 .
, -
, .
, 16, ,
, .
. -
, , -
. -
. ,
64 ,
, .
4
, ,
, -
. , ,
, -
. :.
32- -
. , ( )
32-
.
:
, . MASM -
,
CS, DS SS .
4.2.
MASM
MASM , -
, , , -
Microsoft. -
,
.
,
:
.DATA (.data) _DATA . .MODEL. , - .DATA, , , :
.dataval1 DW 11string1 DB "Text string"byte1 DB ?
.DATA? (.data?) , - .
.
.DATA? ?. .DATA? , - , , -
. .MODEL. .DATA?:
.data?DB 5 DUP (?)
54 4
.CONST (.const) , - . -
.
, -
. , .CONST, . .MODEL.
.STACK (.stack) [] , .
, 1 . -
. -
.MODEL.
.CODE (.code) [] , .
_TEXT, . , _TEXT tiny, small,compact flat __TEXT medium, large huge. .MODEL, , .
.MODEL (.model) _ [,__] [,_] [,-_] , .
-
. -
, tiny, small, compact, medium, large, huge flat. _ .
,
, , -
. ,
() .
, .386,.486, .586, .686. , (near far). , . . 4.1 .
4.1.
TINY NEAR NEAR MS-DOS
SMALL NEAR NEAR MS-DOS, Windows
MEDIUM FAR NEAR MS-DOS, Windows
COMPACT NEAR FAR MS-DOS, Windows
LARGE FAR FAR MS-DOS, Windows
HUGE FAR FAR MS-DOS, Windows
FLAT NEAR NEAR Windows NT, Windows 2000,
Windows XP, Windows 2003
4.2. 55
MASM, -
6.1.
small . near (). large . (far).
medium , -
(far), (near). compact , - (far), (near). huge large.
, -
. , -
large (near). , - .
tiny 16- MS-DOS. .
64 . ,
flat - 32- .
tiny , , 32-. ,
flat. flat .model flat
: .386, .486, .586 .686. - , ,
Intel Pentium .386 .486. ,
,
16- 32- .
(near), 32-. __ -
,
(C++, Pascal). :
C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL. , , -
, ,
.
-
.
_ OS_DOS, - .
56 4
, _
NEARSTACK ( SS DS, ) FARSTACK ( SS DS, ). -
NEARSTACK. .MODEL:
.model flat, c
flat , 32- . c , (, -
) , C.
:
.model large, c, farstack
large, C ( SS DS).
.model medium, pascal
medium, - Pascal ,
.
4.3. MASM
, MASM,
, ,
, .
, (main), , -
. -
, ,
. ,
.MODEL. - 32-,
, 16-
, . 16- .
16- , -
MASM:
.model small, c ; ;
.stack 100h ; 256
.data ;
. . .; . . ..code ; main:. . .
4.3. MASM 57
; . . .end mainend
end main main . end . 16- MS-DOS
, -
. 4.1 .
4.1. MS-DOS
.model large
.datas1 DB "TEST STRING$"
.codemov AX, @datamov DS, AXlea DX, s1mov AH, 9hint 21hmov ax, 4c00hint 21h
end
s1. DS , - .data:
mov AX, @datamov DS, AX
s1, DS:DX, - 9h 21h MS-DOS.
.
32- :
.model flat
.stack
.data; .codemain:. . .; . . .end mainend
(flat), 32- near.
, 32- -
( .data), (- .stack) ( .code).
58 4
, 32- -
/ .
SEGMENT. SEGMENT - :
SEGMENT . . . ENDS
, SEGMENT , flat. SEGMENT - ,
flat. ASSUME:
ASSUME CS:FLAT, DS:FLAT, SS:FLAT, ES:FLAT, FS:ERROR, GS:ERROR
FS GS , ERROR.
32- -
( _seg_ex), . src, data1, dst data2 (code segment).
, ( -
):
_seg_ex (, _seg_ex proc _seg_ex endp). _seg_ex 4.2.
4.2. 32-
.586
.model flatoption casemap:none
data1 segmentsrc DB "Test STRING To Copy"len EQU $-src
data1 endsdata2 segment publicdst DB len+1 DUP('+')
data2 endscode segment_seg_ex procassume CS:FLAT,DS:FLAT, SS:FLAT, ES:FLAT, FS:ERROR, GS:ERRORmov ESI, offset data1mov EDI, offset data2cldmov CX, lenrep movsbmov EAX, offset data2ret
_seg_ex endpcode endsend
4.3. MASM 59
flat 32-- , , -
( src dst) ESI EDI,, :
mov ESI, offset data1mov EDI, offset data2
src dst, CX :
cldmov CX, lenrep movsb
EAX - dst. , ,
.model flat. -: , flat, , , .
,
Visual C++ .NET (
). 4.3.
4.3. , seg_ex
#include extern "C" char* seg_ex(void);int main(void){printf("EXTERNAL MODULE EXAMPLE: %s\n", seg_ex());return 0;
}
seg_ex , extern.
EXTERNAL MODULE EXAMPLE: Test STRING To Copy+
60 4
, , , -
.
, , , C++ Pascal, -
, ,
.
-
. , ,
:
, - -
.
A, B,
C. if else. , if else, - switch case.
, .
, -
. -
while, do while, for, repeat until . .
. ,
? ,
,
, , ,
.
5
:
, , .IF .WHILE, ( MASM).
, if else, , . -
, , -
, . ,
, -
, .
-
.
,
. -
, , ,
if else, while , :
;
( )
.
-
,
. , -
, -
.
-
; .
, -
EFLAGS . 16
.
. -
:
CF (Carry Flag ) (0 1) -
;
PF (Parity Flag ) 8 . -
0, 1.
;
AF (Auxiliary Carry Flag ) - 1, -
( 3) .
ASCII--
, ;
62 5
ZF (Zero Flag ) - . -
0, 1.
je jz;
SF (Sign Flag ) - ( ) -
: 0, -
1.
jg jl;
TF (Trap Flag ) - 1, ,
;
IF (Interrupt Flag ) , ;
DF (Direction Flag ) - . -
SI (ESI) DI (EDI), ;
OF (Overflow Flag ) -, () -
.
CF, SF, ZF, PF, DF, - OF AF. , - , TF IF.
,
.
5.1.
.
next ECX. - ECX cmp, - AF, CF, OF, PF, SF ZF:
. . .cmp ECX, 0jz next , ECX 0
next: , ECX 0
. . .
5.1. 63
ECX , cmp ZF . jz ZF , 1, - , , next. if, - ECX = 0.
-
cmp. ZF, - ECX. jz next, .
Intel , -
.
-
(cmp, test), (add, sub .) (and, or, xor). , test SF, ZF PF. OF CF , AF . , test . ,
:
. . .test AX, 1jne bit1_set. . .
AX. 1, ZF 0 bit1_test.
, -
. -
.
, .
, -
, : . -
, ,
. -
, .
, AX 11000110B, BX 00010110B, - AX BX, . - . 5.1.
5.1.
JE/JZ , / ZF
JNE/JNZ , / ZF
64 5
JA/JNBE , / ZF, CF
JAE/JNB , / CF
JB/JNAE , / CF
JBE/JNA , / CF, AF
-
. , jb jnae , jb , jnae.
. 5.2.
5.2.
JE/JZ , / ZF
JNE/JNZ , / ZF
JG/JNLE , / ZF, SF, OF
JGE/JNL , / SF, OF
JL/JNGE , / SF, OF
JLE/JNG , / ZF, SF, OF
,
(je/jz) (jne/jnz) - . / .
- ,
. . 5.3.
5.3.
JS , SF
JNS , SF
JC , CF
JNC , CF
JO , OF
JNO , OF
JP/JPE , PF
JNP/JP , PF
-
CX . - . jcxz - , CX.
5.1. 65
5.2. jmp
jmp, , .
- EIP .
, -
, ,
. , -
- EIP. , -
CS. : - jmp:
jmp short _jmp near ptr _jmp far ptr _
_ , -
. jmp:
jmp label1 ; , ; ,
jmp near ptr label1 ; ;
jmp short label1 ; , ; , ; -128 - +127
jmp far ptr label1 ; , ; , ;
, . short , 128 +127,
.
EIP 8- . near ptr ,
EIP 16- . , far ptr , . CS, - EIP.
jmp 16- MS-DOS,
64 ,
.
32- -
4 .
, 3, flat,
66 5
, , -
. 32--
.
32- -
. ,
DOS, 32- Windows- COM-, -
. 32-
(near ptr) 4 .
jmp - , .
, :
jmp reg16jmp reg32jmp word ptr [reg16]jmp dword ptr [reg32]
reg16 (reg32) 16- 32- .
, , -
.
32- (reg32), , -
, 32-. -
jmp 32- Windows-. jmp -
, , -
, . :
. . .
.code. . .
L1:xor EDX, EDX. . .lea ESI, L1jmp ESI. . .
ESI L1, - jmp ESI .
. . .
.datalabel_offset DD L1
.code. . .
L1:xor EDX, EDX. . .lea ESI, label_offsetjmp dword ptr [ESI]. . .
5.2. jmp 67
ESI label_offset, label_offset L1. jmpdword ptr [ESI] L1.
,
,
,
. .
16- , -
5.1, s1, s2 s3.
5.1.
.model small
.stack 100h
.datas1 DB 0dh, 0ah, "String 1$"s2 DB 0dh, 0ah, "String 2$"s3 DB 0dh, 0ah, "String 3$"
sarray label word ; , DW s1 ; s1 s2DW s2DW s3
num DW 0 ; jmplabel_array label word ;
DW L1 ; L1DW L2 ; L2DW L3 ; L3
.codestart:mov AX, @datamov DS, AXmov ES, AX;mov CX, 3 ; -> CXlea DI, label_array ;
next:mov SI, DImov BX, num ; -> BXshl BX, 1 ; 2
; label_arrayadd SI, BX ;
; jmpjmp word ptr [SI] ; ,
; SI (L1 L2)wedge:inc num ; loop next ; ;
L1: ; L1lea DX, s1mov AH, 9hint 21h
68 5
jmp wedge ; L2: ; L2lea DX, s2mov AH, 9hint 21hjmp wedge
L3: ; L3lea DX, s3mov AH, 9hint 21h;mov AH, 1h ; int 21h;mov AX, 4c00h ; int 21hend startend
-
jmp , - L1, L2 L3. jmp SI : SI label_array, , ( L1 L3 ).
-
. , L2 label_array 2 ( num = 1). :
String 1String 2String 3
, jmp -
. , , -
jmp - switch case C++ ( case Pascal), .
,
, ,
jmp. 32- ( _case_1).
02, EAX , -. ,
_case_1, .
5.2. jmp 69
EBP, - EBX. - 5.2.
5.2. case
.686
.model flatoption casemap: none.datas1 DB "String 1", 0s2 DB "String 2", 0s3 DB "String 3", 0err DB "Incorrect parameter!", 0label_array label dword ; ,
; ; L1, L2 L3
DD 3 DUP (?).code_case_1 procpush EBPmov EBP, ESPmov EBX, dword ptr [EBP+8] ; ( )
; EBXlea ESI, label_array ; -> ESImov [ESI], offset L1 ; mov [ESI+4], offset L2 ; L1, L2 L3mov [ESI+8], offset L3lea EAX, err_exit ; EAX
; ;
shl EBX, 2 ; ; ,; 4
cmp EBX, 8 ; ; 8 ( ; 02)
jle next1 ; 8? ; ,
jmp EAX ; , 2,;
next1:cmp EBX, 0 ;
; ? jge get_string ; ,
; jmp EAX ; , ,
; get_string: ;
; , ; ;
cmovge EAX, [ESI][EBX]jmp EAX
L1: ; ; ,; 0
70 5
lea EAX, s1 ; s1 -> EAXjmp exit ;
L2: ; ; ,; 1
lea EAX, s2 ; s2 -> EAXjmp exit ;
L3: ; ; ,; 2
lea EAX, s3 ; s3 -> EAXjmp exit ;
err_exit: ; ;
lea EAX, err ; -> EAXexit:pop EBPret
_case_1 endpend
lea ESI, label_arraymov [ESI], offset L1mov [ESI+4], offset L2mov [ESI+8], offset L3
,
. 32- -
, , label_array , L1, L2 L3. , .
EAX , - :
lea EAX, err_exit
jmp EAX
( EAX), - , .
(L1, L2 L3), - :
shl EBX, 2
,
02, , .
,
cmovge EAX, [ESI][EBX]
5.2. jmp 71
. -
, cmovge, -, :
( SF);
SF = 1, EAX (L1, L2 L3). , - label_array ( ESI) ( EBX).
.
5.3.
, , . -
() -
, .
:
;
, .
:
. , , -
. ,
:
. . .
.datas1 DB "ABCDFEG", 0
.code. . .mov AL, 0lea SI, s1
next:cmp byte ptr [SI], 0je exitinc SIinc ALjmp next
exit:. . .
. -
AL, 0. - ,
, . SI. , , -
DS : SI. -
cmp byte ptr [SI], 0
72 5
, .
0, AL 1, SI
inc SI
. , -
( ).
,
. -
A s1. - len, - :
. . ..datas1 DB "ABCAEFGAGEBA"len EQU $-s1
.code. . .mov DX, lenmov AL, 'A'xor BL, BLlea SI, s1
next:cmp byte ptr [SI], ALje inc_counter
continue:dec DXjz exitinc SIjmp next
inc_counter:inc BLjmp continue. . .
exit:. . .
, .
len, DX DX 1. DX, 0. A - , BL (- 0).
-
AL. , - A, BL :
cmp byte ptr [SI], ALje inc_counter. . .
inc_counter:inc BL
5.3. 73
BL. - -
loop, .
loop CX (ECX), ,
128 +127 . CX (ECX) . loop CX (ECX) . loop : ,
.
loop:
. . .
.datacounter DW 5
.code. . .xor AX, AXmov CX, counter ; -> CX
next:inc AX ; AXloop next ;
. . .
AX 5. loop , ,
:
. . .
.datacounter DW 5
.code. . .xor AX, AXmov CX, counter ; -> CX
next:inc AX ; AXdec CX ; CXjcxz skip ; CX = 0, jmp next ;
. . .skip:. . .
jcxz jz, :
. . ..datacounter DW 5
.code
74 5
. . .xor AX, AXmov CX, counter ; -> CX
next:inc AX ; AXdec CX ; CXjnz next ; CX = 0, ,
; . . .
loop loope/loopz loopne/loopnz. loope/loopz. loope loopz - .
. -
CX (ECX), 0 ZF 1, .
loope. 16-,
( 5.3).
5.3.
.model small
.datas1 DB " String with leading blanks !$"len EQU $-s1msg DB "Blank string!$"
.codestart:mov AX, @datamov DS, AXlea SI, s1 ; -> SIdec SI ; mov CX, len ; -> CXmov AL, ' ' ; -> AL
next:inc SI ; cmp byte ptr [SI], AL ; loope next ; , ,
; ,; ;
cmp CX, 0 ; ?je fail ; , ,
; mov DX, SI ; , ,
; ,; , DX
show:mov AH, 9h ; int 21hmov AH, 1hint 21h
5.3. 75
mov AX, 4C00hint 21h
fail:lea DX, msgjmp showend startend
loopne/loopnz. loope/loopz , , ZF = 0. - loopne loopnz . loopne 5.4. - , 16- , -
, + ( String 2).
5.4. +
.model small
.datas1 DB "String 1+String 2$"len EQU $-s1msg DB "Char + not found!$"
.codestart:mov AX, @datamov DS, AXlea SI, s1dec SImov CX, lenmov AL, '+'
next:inc SIcmp byte ptr [SI], ALloopne nextcmp CX, 0je failmov DX, SI
show:mov AH, 9hint 21hmov AH, 1hint 21hmov AX, 4C00hint 21h
fail:lea DX, msgjmp showend startend
, loop - ,
.
76 5
5.3 ()
, ,
loop, . 32- , -
.
loopd, loop - , ECX, 4. , -
4 , ECX - . -
4 ,
. loopd , loop. , loopd Intel.
loopd - 32- , -
, 100.
EAX, 0 . ( _loopd_ex) 5.5.
5.5. , 100
.586
.model flatoption casemap: none.dataa1 DD 312, -45, 91, -16, -377 ; len EQU $-a1 ;
.code_loopd_ex procmov ECX, len ; -> ECXshr ECX, 2 ; lea ESI, a1 ; -> ESImov EAX, -100 ; -> EAX
next:cmp EAX, [ESI] ;
; EAXjge found ; -100,
; add ESI, 4 ; -100,
; loopd next ; jmp not_found ; , -100
found:mov EAX, [ESI] ; -> EAXjmp exit ;
not_found:mov EAX, 0 ; EAX
; 0exit:ret
_loopd_ex endpend
5.3. 77
, , ,
4 .
5.4. Intel Pentium
-
, -
.
, -
,
.
-
, Intel Pentium,
, . -
, .
, . ,
-
, .
, .
Intel Pentium -
, , -
.
--
, , , -
. Intel
Pentium ,
.
.
Intel
, Pentium II, , -
.
setCC, cmovCC fcmovCC, CC (e, ne, le . .). setCC.
:
setCC reg8setCC mem8
setCC : sete/setz, setl/setnge . ., reg8/mem8 , 8-
, AL, AH, BL . ., . , 1, 0. -
78 5
setCC , .
:
cmp AL, 0sete BL
cmp - AL, ZF 1. sete - BL 1. AL - , , BL 0.
setCC . 5.4.
5.4. setCC
SETAE/SETNB , / CF
SETE/SETZ , / ZF
SETNE/SETNZ , / ZF
SETB/SETNAE , / CF
SETBE/SETNA , / CF, ZF
SETL/SETNGE , / SF, OF
SETGE/SETNL , / SF, OF
SETG/SETNLE , / ZF, SF, OF
SETS , SF = 1 SF
SETNS , SF = 0 SF
SETC , CF = 1 CF
SETNC , CF = 0 CF
SETO , OF = 1 OF
SETNO , OF = 0 OF
SETP/SETPE , PF = 1 PF
SETNP/SETPO , PF = 0 PF
setCC . , -
. . -
, 50 100. -
find_num, 5.6. a1, -
ESI. -, :
100 ( cmp dword ptr [ESI], 100 jle next1), 50 ( cmp dword ptr [ESI], 50 jge found). setCC .
5.4. Intel Pentium 79
5.6. , 50100
.686
.model flatoption casemap: none.dataa1 DD 34, -53, 88, 13, 67len EQU $-a1
.codefind_num proclea ESI, a1 ; -> ESImov ECX, len ; -> ECXshr ECX, 2 ;
next:cmp dword ptr [ESI], 100 ; 100?jle next1 ; , jmp next_addr ; 100,
; next1:cmp dword ptr [ESI], 50 ; 50?jge found ; , ,
; EAX next_addr: ; add ESI, 4dec ECX ; jnz next ; ECX 0,
; mov EAX, 0 ; ,
; , EAX 0jmp exit
found:mov EAX, [ESI] ; -> EAX
exit:ret
find_num endpend
5.7 ,
setCC.
5.7. setCC 5.6
.686
.model flatoption casemap: none.dataa1 DD 34, -53, 88, 13, 67len EQU $-a1g50 DB ? ; l100 DB ?
.codefind_num proclea ESI, a1 ; -> ESImov ECX, len ; -> ECXshr ECX, 2 ;
80 5
next:cmp dword ptr [ESI], 50 ; 50?setge g50 ; , g50 1,
; g50 0cmp dword ptr [ESI], 100 ; 100?setle l100 ; , l100 1,
; l100 0mov AL, g50 ; g50 l100cmp AL, l100je found ; ,
; add ESI, 4 ; , g50 l100, dec ECXjnz nextmov EAX, 0 ; , ,
; EAX 0jmp exit
found:mov EAX, [ESI] ; -> EAX
exit:ret
find_num endpend
.
, ,
. -
EAX 88.
, , cmovCC. :
cmovCC src, dst
CC (e, ne, nz, le . .), src 16- 32-- , dst 16- 32- .
, , dst
src. , src . -
cmovCC:
.dataop1 DW ?
.code
. . .cmp AX, op1cmovge AX, op1. . .
AX op1, op1 - AX. AX op1, -.
cmovCC - . cmovCC , , cpuid.
5.4. Intel Pentium 81
, -
, .
.
, -
:
. . .
.datanum1 DD 12num2 DD 11
.code
. . .clcmov EAX, num1mov EDX, num2cmp EAX, EDXjg num1_g_num2mov EBX, EDXjmp exit
num1_g_num2:mov EBX, EAX
exit:. . .
num1 num2, EBX. jg, , num1 num2. - cmovl. - :
. . .
.datanum1 DD 12num2 DD 11
.code. . .mov EAX, num1mov EDX, num2cmp EAX, EDXcmovl EAX, EDXmov EBX, EAX. . .
. EAX (num1), EDX (num2). - :
cmp EAX, EDX
EAX EDX, EDX EAX, EAX , EAX EDX:
cmovl EAX, EDX
, EAX EBX. - , .
82 5
cmovCC , -. cpuid.
. (
) . jge, :
.datanum1 DD -18
.code. . .mov EAX, num1cmp EAX, 0jge exitneg EAX
exit:. . .
, cmp -. , cmovl. - :
. . .
.datanum1 DD 18
.code. . .mov EAX, num1mov EDX, EAXneg EDXcmp EAX, 0cmovl EAX, EDX. . .
find_num, setCC cmovCC ( 5.8).
find_num, ( - ). , g50 l100 cmove EAX, [ESI] EAX. je exit ( ZF = 1), ( add ESI, 4). cmove EAX, [ESI] , je exit, , - , cmp AL, l100. , - .
- , ,
.
, ,
, -
. -
, .
, -
.
5.4. Intel Pentium 83
5.8. , 50100
( )
.686
.model flatoption casemap: none.dataa1 DD 34, -93, 95, 13, 7, 1len EQU $-a1g50 DB ?l100 DB ?
.codefind_num proclea ESI, a1mov ECX, lenshr ECX, 2
next:cmp dword ptr [ESI], 50setge g50cmp dword ptr [ESI], 100setle l100mov AL, g50cmp AL, l100cmove EAX, [ESI]je exitadd ESI, 4dec ECXjnz nextmov EAX, 0
exit:ret
find_num endpend
.
, -
-
. :
:
jmp
, -
:
xor EBX, EBXLl:
inc EBXcmp EBX, 100000je exitjmp Ll
exit:
EBX 0 100 000, exit.
84 5
.
,
.
,
:
. . .mov EDX, 100000
L1:. . .
. . .dec EDXjnz L1
exit:. . .
, -
EDX. , . - ZF, 0, , . -
.
-
,
. ( 5.9).
.
32- ( _set0).
5.9.
.686
.model flatoption casemap:none.dataiarray DD -73, 931, -89, 92, -5, 67, 30len EQU $-iarray
.code_set0 proclea ESI, iarray ; -> ESImov EDX, len ; ( ) -> EDXshr EDX, 2 ;
next:cmp dword ptr [ESI], 0 ; jge no_change ; , mov dword ptr [ESI], 0 ; , 0
no_change:add ESI, 4 ; dec EDX ; 1jnz next ; lea EAX, iarray ; -> EAXret
_set0 endpend
5.4. Intel Pentium 85
, -
next jnz next . jge no_change, - .
,
. setge., (-
5.10).
5.10. 5.9,
setge
.686
.model flatoption casemap:none.dataiarray DD 273, 417, -31, -92, 5, -67, 360len EQU $-iarray
.code_set0 procpush EBXlea ESI, iarraymov EDX, lenshr EDX, 2
next:xor EBX, EBXcmp dword ptr [ESI], 0setge BLimul EBX, dword ptr [ESI]mov dword ptr [ESI], EBXadd ESI, 4dec EDXjnz nextlea EAX, iarraypop EBXret
_set0 endpend
,
, . -
(unrolling) .
,
.
, ,
.
() , -
, -
( src) (dst). - 5.11.
86 5
5.11.
. . .
.datasrc DD 345, -65, 12, 99, 369, 267len EQU $-srcdst DD 6 DUP (?)
.code
. . .mov ESI, src ; src> ESImov EDI, dst ; dst -> EDImov ECX, len ; -> ECXshr ECX, 2 ;
; L1:mov EAX, [ESI]add ESI, 4mov [EDI], EAXadd EDI, 4dec ECXjnz L1
. . .
-
. -
5.12 ( ).
5.12. 5.11
. . .
.datasrc DD 345, -65, 12, 99, 369, 267len EQU $-srcdst DD 6 DUP (?)
.code
. . .mov ESI, src ; src> ESImov EDI, dst ; dst -> EDImov ECX, len ; -> ECXshr ECX, 3 ;
; (; )
L1:mov EAX, [ESI] ;
; EAXmov EBX, [ESI + 4] ; EBXmov [EDI], EAX ; EDImov [EDI + 4], EBX ;
; EDI 4 add ESI, 8 ; , add EDI, 8 ; dec ECXjnz label ;
; . . .
5.4. Intel Pentium 87
-
, .
, , .
.
10
0, 1. -
, -
, 5.13.
5.13.
. . .
.dataiarray DD 10 dup (0)len EQU $-iarray
.code
. . .mov ECX, len ; ( ) -> ECXlea ESI, i1 ; -> ESImov EBX, 2 ; 2 EBX
; , next:mov EAX, ECX ; -> EAXdiv EBX ; ,
; cmp EDX, 0jne store_1 ; ,
; 1mov DWORD PTR [ESI], 0 ; , 0jmp next_addr
store_1:mov DWORD PTR [ESI], 1
next_addr: ; add ESI, 4loop next. . .
, -
. -
, unr_1. 5.14.
5.14. 5.13
.686
.model flatoption casemap: none.dataiarray DD 10 dup (7)len EQU $-iarray
.code_unr_1 proclea ESI, iarraymov EBX, len
88 5
shr EBX, 2dec EBXxor EDX, EDX
next:mov DWORD PTR [ESI], 0mov DWORD PTR [ESI+4], 1add EDX, 2cmp EDX, EBXjae exitadd ESI, 8jmp next
exit:lea EAX, iarrayret
_unr_1 endpend
,
. -
; ,
.
-
mov DWORD PTR [ESI], 0mov DWORD PTR [ESI+4],1
ESI 8 - add ESI,8, . - EBX:
mov EBX, lenshr EBX, 2dec EBX
.
10 , EBX 9 - . , -
. -
,
, . -
, 1589 , , -
397 -
.
,
.
-
loop . . ,
.
loop, , , loope loopne, - .
5.4. Intel Pentium 89
, loop . -
, loop , . -
loop . , , , Intel Pentium, -
loop - .
loop :
dest:. . .dec cxjnz dest. . .
loope loopne, -, ,
Intel Pentium. loopCC (CC = e, ne,z, nz) . , -
.
loope 16- (. 5.3)., -
. 5.15 -
.
5.15. 5.3
.model small
.datas1 DB " String with leading blanks !$"len EQU $-s1msg DB "Blank string!$"
.codestart:mov AX, @datamov DS, AXlea SI, s1dec SImov CX, lenmov AL, ' '
next:inc SIcmp byte ptr [SI], ALjne $+7dec CXjnz nextjmp failmov DX, SI
show:mov AH, 9h
90 5
int 21hmov AH, 1hint 21hmov AX, 4C00hint 21h
fail:lea DX, msgjmp showend startend
loope (- ):
. . .jne $+7dec CXjnz next. . .
?
cmp byte ptr [SI], AL
, , . -
cmp ZF 0. jne $+7 ZF , +7 .
.
mov DX, SI
DX -. 7 .
, jne $+7
mov DX, SI
,
CX, 0, . - ,
jmp fail
loopne, , +(. 5.4).
5.16.
, loopne, - .
, , jne je, , (8 7). , ,
5.4. Intel Pentium 91
dec CX dec CL, - 1 .
5.16. loopne 5.4
.model small
.datas1 DB "String 1+String 2$"len EQU $-s1msg DB "Char + not found!$"
.codestart:mov AX, @datamov DS, AXlea SI, s1dec SImov CL, lenmov AL, '+'
next:inc SIcmp byte ptr [SI], ALje $+8dec CLjnz nextjmp failmov DX, SIinc DX
show:mov AH, 9hint 21hmov AH, 1hint 21hmov AX, 4C00hint 21h
fail:lea DX, msgjmp showend startend
loopCC. , ,
.
92 5
,
, , -
. -
, ,
, .
. -
(
).
, -
, proc endp. , ,
. -
() .
-
, , -
. ,
ASM
, OBJ.
, -
32- Windows:
(Dynamic Link Library, DLL),
.
, DLL. -
DLL
Windows, , -
-
.
6
, -
.
6.1.
, -
.
SS:SP (16- ) SS:ESP (32- ). SP(ESP) 16- 32- - , . , ,
. LIFO (Last In, First Out
, ). ,
, , .
x86 ,
, -
, (2 ).
, . , -
SP (ESP) 2, 4 . .
, .
- ,
push. 16- 32- . -
SP (ESP) 2 ( ) 4 ( ). :
push reg16/reg32push mem16/mem32push segregpush immed
reg16/reg32 16- 32- , mem16/mem32
(16 32 ), segreg
(CS, DS, ES), immed . push c - (immed) Intel Pentium .
push. , , - 16- -
pushf, 32- pushfd. - , 80386. ,
push, - :
pusha 16- (AX, BX, CX, DX, SP, BP, SI, DI);
pushad 32- (EAX, EBX, ECX, EDX, ESP,EBP, ESI, EDI).
push .
94 6
, , 7EE3h
(. 6.1).
. 6.1.
mov BX, 2CE9hpush BX
push - BX , SP 2 - , . 6.2.
. 6.2. push BX
, , ,
16 , SP (ESP) 1. ,
1 . () 2
4 ( ). , -
,
. 6.3:
mov EBX, 4FE91A77hpush EBX
. 6.3.
6.1. 95
4, -
.
pop. ( ) .
16- 32-
. SP (ESP) - 2 ( ) 4 ( ).
pop push - , push. , - popf ( 16- ) popfd ( 32-). - , popa ( 16-- ) popad ( 32-). , , ,
EDX:
pop EDX
EDX 4FE91A77h, 4 (. 6.4).
. 6.4. pop EDX
,
. , push pop , -
. -
:
mov EAX, 11223344hpush EAXpop BXpop CX
push EAX 11223344h. pop BX , 3344h, BX. ESP 2. - pop CX , 1122h, - CX. ESP 2.
. . .
.dataop DW 7777h
.code
96 6
. . .push DS:oppop AX. . .
16- op (- push DS:op), , ( DS). SP 2. pop AX - AX , SP 2. , - AX 7777h.
16--
. 6.1.
6.1. (16- )
.model small
.datanum1 DW '91's1 DB "STRING 1 $"s2 DB "STRING 2 $"
.codestart:
mov AX, @datamov DS, AXpush DS:num1lea SI, s2push SIlea DX, s1mov AH, 9hint 21hpop DXint 21hpop DXxchg DH, DLmov AH, 2hint 21hxchg DH, DLint 21hmov AX, 4c00hint 21hend startend
-
num1 s1 s2, - s1, s2 num1. num1 ( push DS:num1), s2:
push DS:num1lea SI, s2push s2
6.1. 97
4,
, . 6.5.
. 6.5.
s1:
lea DX, s1mov AH, 9hint 21h
s2 DX. s2 :
pop DXint 21h
num1, SP 2. pop DX num1 DX, 2. DX :
pop DXxchg DH, DLmov AH, 2hint 21hxchg DH, DLint 21h
: , -
, , -
, . ( )
. , s1 - S.
, . -
- ,
-
- . ,
, . , -
, .
98 6
-
, -
.
push pop. , , -
, BP(EBP). SP (ESP) BP (EBP), . ( 6.2).
6.2. EBP (16- )
. . .
.dataop1 DW 1149hop2 DW 0E37h
.code
. . .mov AX, @datamov DS, AXpush DS:op1push DS:op2mov BP, SPmov AX, word ptr [BP+2]mov BX, word ptr [BP]. . .
op1 op2 , op1 [SP+2], op2 [SP] (. 6.6).
. 6.6. op1 op2
mov BP, SP BP - SP, op1 [BP+2], op2 [BP]. AX 1149h, BX 0E37h.
32- Intel Pentium
EBP ESP. ,
6.1. 99
op2 op1, EAX:
.686
.model flatoption casemap: none.dataop1 DD 145op2 DD 98
.code. . .push op1push op2mov EAX, dword ptr [ESP] ; op1 -> EAXsub EAX, dword ptr [ESP+4] ; op2 - op1 > EAX. . .
-
, pop .
add:
add ESP, n
n , -
SP (ESP). , (12 ):
.code
. . .push EAXpush EBXpush ECX. . .add ESP, 12. . .
push 12 ( ), -
, add. , .
6.2.
, ,
,
-
.
. (-
) , :
. . .mov AX, 0mov BX, 0
100 6
jmp startadd1 proc ; add1inc AXret ;
add1 endpsub1 proc ; sub1dec BXret ;
sub1 endpstart:call add1 ; add1call sub1 ; sub1jmp start
, ( -
) proc, - endp. - ret. ASM .
proc. proc ,
. ,
.
proc : near far. - near , , far , . , ,
near ( near ). (near) -
, , (far) -, , . 32-
.
, , -
,
.
, ,
.
, -
, -
:
mov AX, 0mov BX, 0
next:call add1call sub1jmp next
add1: ; , inc AXret
sub1: ; , dec BXret
6.2. 101
proc endp , () .
,
. ,
proc endp, . - call, , - . -
ret, , call.
call ret. - .
, ,
, ret - , .
, , , .
call , call, SP (ESP). ret - , -
.
(near far) ret call . call - . ., ,
.
, ret . ,
, , ,
. ret , -
,
.
call :
( );
( ,
);
( -
, );
( , -
, , -
).
-
. .model near far
102 6
, tiny, small compact - near, medium, large huge far. far- medium, large huge . 32-, flat, - (near).
call. - , call -
EIP , .
-
, 3
( E8h ).
call : ,
. -
EIP CS: EIP , , CS .
, 5 (
9Ah, ).
far ptr, , .
6.3 , -
.
6.3. (16- )
.model largedata segments1 DB 0dh, 0ah, "Direct far call of subr1 demo !$"s2 DB 0dh, 0ah, "Direct far call of subr2 demo !$"
data endscode1 segmentassume CS:code1main proc ; mov AX, @datamov DS, AXcall far ptr subr1 ; subr1call far ptr subr2 ; subr2
; call ; : 9
mov AH, 1hint 21hmov Ax, 4C00hint 21h
main endpcode1 ends
6.2. 103
. . .code2 segmentassume CS:code2subr1 proc far ; subr1
lea DX, s1mov AH, 9hint 21hret ; ret 0h (
; )subr1 endpsubr2 proc far ; subr2
lea DX, s2mov AH, 9hint 21hret ; ret 0h (
; )subr2 endpcode2 ends. . .
subr1 subr2 - s1 s2. call ,
, . 6.7.
. 6.7.
( far), ret 0CBh, -
(0C3h), -:
EIP CS, . -
retf. . -
, . ,
, , -
. -
16-
( 6.4).
104 6
6.3. ()
6.4. (16- )
.model small
.datas1 DB 0dh, 0ah, "Near indirect call of subr1 !$"s2 DB 0dh, 0ah, "Near indirect call of subr2 !$"addr1 DW subr1addr2 DW subr2
.codestart:mov AX, @datamov DS, AXcall DS:addr1 ; subr1 ,
; addr1call DS:addr2 ; subr2 ,
; addr2mov AH, 1hint 21hmov AX, 4C00hint 21h
subr1 proclea DX, s1mov AH, 9hint 21hret
subr1 endpsubr2 proclea DX, s2mov AH, 9hint 21hret
subr2 endpend startend
subr1 subr2 near , , addr1 addr2 .
( s1 s2) .
:
call BX ; BXcall[BX] ; ,
; BXcall[BX][SI] ; ,
; SI tbl[SI] ; tbl ,
; SI
6.5 16- , -
.
( )
6.2. 105
SI BX, SI tbl , BX .
6.5. (16- )
.model smalldata segmenttbl label word
DW subr1 ; subr1DW subr2 ; subr2DW subr3 ; subr3
s1 DB 0dh, 0ah, "Near indirect call subr1 demo 2 !$"s2 DB 0dh, 0ah, "Near indirect call subr2 demo 2 !$"s3 DB 0dh, 0ah, "Near indirect call subr3 demo 2 !$"
data endscode segmentassume CS:code, DS:datamain procmov AX, datamov DS, AXlea SI, tbl ; -> SIxor BX, BX ; -> BXmov CX, 3 ; -> CX
next:call word ptr [BX][SI] ; add BX, 2 ;
; dec CX ; 1jnz next ; mov Ax, 4C00hint 21hmain endp
subr1 proc ; subr1lea DX, s1mov AH, 9hint 21hret
subr1 endpsubr2 proc ; subr2lea DX, s2mov AH, 9hint 21hret
subr2 endpsubr3 proc ; subr3lea DX, s3mov AH, 9hint 21hret
subr3 endpend maincode endsend
106 6
, -
add BX, 2
next:call word ptr [BX][SI] ; add BX, 2
. . .jnz next
tbl , - BX 2.
:
Near indirect call subr1 demo 2 !Near indirect call subr2 demo 2 !Near indirect call subr3 demo 2 !
. -
,
, ,
.
6.6. 16-
, .
6.6. (16- )
.model largedata segmenttbl label dword
DD subr1 ; subr1DD subr2 ; subr2DD subr3 ; subr3
s1 DB 0dh, 0ah, "FAR INDIRECT CALL subr1 DEMO !$"s2 DB 0dh, 0ah, "FAR INDIRECT CALL subr2 DEMO !$"s3 DB 0dh, 0ah, "FAR INDIRECT CALL subr3 DEMO !$"
data endscode0 segmentassume CS:code0, DS:datamain procmov AX, datamov DS, AXlea SI, tbl ; -> SIpush SI ;
; ; subr1, subr2 subr3
mov word ptr [SI], offset subr1 ; subr1 > ;
mov AX, code1 ; , ; subr1 > AX
mov word ptr [SI+2], AX ; AX -> ; ; ; subr2
add SI, 4
6.2. 107
mov word ptr [SI], offset subr2mov AX, code2mov word ptr [SI+2], AX
; ; ; subr3
add SI, 4mov word ptr [SI], offset subr3mov AX, code3mov word ptr [SI+2], AXpop SI ;
; tblxor BX, BX ; BX,
; ;
mov CX, 3 ; -> CXnext:call dword ptr [BX][SI] ;
; subr1, subr2 subr3add BX, 4 ;
; tbldec CX ; 1jnz next ; ,
; CX 0mov AX, 4C00hint 21h
main endpcode1 segmentassume CS:code1subr1 proc far ; subr1lea DX, s1mov AH, 9hint 21hret
subr1 endpcode1 endscode2 segmentassume CS:code2subr2 proc far ; subr2lea DX, s2mov AH, 9hint 21hret
subr2 endpcode2 endscode3 segmentassume CS:code3subr3 proc far ; subr3lea DX, s3mov AH, 9hint 21hret
subr3 endpcode3 endsend mainend
108 6
6.6 ()
, .
tbl. (subr1, subr2 subr3), (code1, code2 code3). - .
( ) , ,
. , tbl - 12 .
4-
, , , subr2:
mov word ptr [SI], offset subr2mov AX, code2mov word ptr [SI+2], AX
(-
code0) next, -, :
next:call dword ptr [BX][SI]add BX, 4dec CXjnz next
:
FAR INDIRECT CALL subr1 DEMO !FAR INDIRECT CALL subr2 DEMO !FAR INDIRECT CALL subr3 DEMO !
, -
. 32- ( -
.model flat), .
4 , , -
.
( near ptr). , 16- ( -
), 32- .
32- -
,
. 6.7.
_far_demo32 - sub1 sub2. sub1 i1 i2, res. sub2 -
res. _far_demo32 , - ESI. ESI tbl, - .
6.2. 109
6.7. (32- )
.686
.model flatoption casemap: none.datatbl label dword
DD sub1DD sub2
i1 DD -39i2 DD 41res DD 2 DUP(0)
.code_far_demo32 proclea ESI, tblmov [ESI], offset sub1mov [ESI+4], offset sub2call dword ptr [ESI]call dword ptr [ESI+4]lea EAX, resret
_far_demo32 endpsub1 procclcmov EAX, i1adc EAX, i2mov res, EAXret
sub1 endpsub2 procclcmov EAX, i1sbb EAX, i2mov res+4, EAXret
sub2 endpend
_far_demo32 res, - .
, 32- ,
,
.
6.3.
. -
,
. -
,
110 6
,
, .
, -
. , ,
. -
, -
, .
,
, -
- .
-
.
? , -
, .
EAX, EBX, ECX, EDX, - EBP, ESI, EDI. EBP - ESP , , - . ESI EDI , .
.
32-
. , -
() . -
: minint - minabs .
minint -, minabs .
minint EAX, - EBX. , , - i1 i2. , min_val abs_val . -
EAX. minint - minabs.
-
, 6.8.
6.8.
(32- )
. . .
.datai1 DD 34i2 DD 17min_val DD ?abs_val DD ?
. . .
6.3. 111
.code
. . .mov EAX, i1mov E, i2call minint
; i1 i2 EAX.; min_val;
mov min_val, EAXcall minabs
; abs_valmov abs_val, EAX. . .
; minint minabsminint proccmp E,Ejl exitmov E,E
exit:ret
minint endpminabs procmov EAX, min_valcmp EAX, 0jge quitneg EAX
quit:ret
minabs endp. . .
. -
minint EBX, .
, EBX :
mov EAX, i1push EBXmov E, i2call minintpop EBX
, -
, , .
( -
), , -
. ,
pusha, pushad, popa popad., ,
( AX EAX), , .
112 6
6.8 ()
. , ; -
, . -
: -
( ) ,
. , -
.
?
EBP. ( ESP), [EBP+n] . n -
2 (2, 4, 6, 8 . .).
EBP, . (sub2),
, . -
, EAX. , -
i1 i2, i1 i2., , -
. .
:
. . ..model flat.datai1 DD 34i2 DD 190
.code. . .push i2push i1call sub2pop i1pop i2. . .
sub2 procpush EBPmov EBP, ESPmov EAX, dword ptr [EBP+8]sub EAX, dword ptr [EBP+12]pop EBPret
sub2 endp. . .
. -
i1 i2 :
push i2push i1call sub2
6.3. 113
sub2. , . 6.8.
. 6.8. push i2 push i1
,
push 8. call sub2 , .
sub2 push EBP - EBP, i1 i2 . , . 6.9.
. 6.9. call sub2 push EBP
, , i1, - [EBP+8], i2 [EBP+12]. , , . -
i2 i1, i1 i2:
mov EAX, dword ptr [EBP+8]sub EAX, dword ptr [EBP+12]
EAX . pop EBP - EBP, ret , call, EIP.
, sub2 - i1 i2. , ,
, . -
,
114 6
. , -,
, .
, .
sub2 pop - , :
pop i1pop i2
,
, .
, call
add ESP, 8
ESP , . -
push i2push i1call sub2add ESP, 8
sub2 . ret n, n , . sub2 :
sub2 procpush EBPmov EBP, ESPmov EAX, dword ptr [EBP+8]sub EAX, dword ptr [EBP+12]pop EBPret 8
sub2 endp
ret ret n n = 0. n , -
ret . ,
. , -
add , - ret n. : -
, , , -
. .
. ,
,
. , -
, ,
6.3. 115
. ,
. , -
EAX.
6.4.
, ,
, -
.
.
: -
, -
.
. -
.
:
. , -
, -
.
- .
, ,
-
.
,
-
.
-
, , .
, , , -
, -
. ,
.
-
.
public extern. public , extern ,
. -
-
.
116 6
:
, ,
public;
, -
, extern.
. -
a1 + a2 b3, a1, a2 b3 . -
: _add2, a1 + a2, _sub1, b3.
(
_add_sub). ASM, -
OBJ. (link ) -
32- .
_add_sub a1, a2 b3 , .
, -
, public. , _add2 _sub2, _add_sub, extern. _add_sub 6.9.
6.9. (32- )
.686
.model flat
.stack 100hoption casemap: noneextern _add2:procextern _sub1:procpublic a1, a2, b3
.dataa1 DD 12a2 DD 17b3 DD 34
.code_add_sub procclc ; call _add2 ; a1 + a2push EAX ; ,
; ; _sub1
call _sub1 ; (a1 + a2); b3. ; EAX
ret_add_sub endpend
6.4. 117
, .
(extern), , - , . public, ASM- , -
, .
_add2:
.686
.model flatoption casemap: nonepublic _add2extern a1: DWORDextern a2: DWORD
.code_add2 procmov EAX, a1adc EAX, a2ret
_add2 endpend
_add2 _add_sub, - (public) . , _add2 -, (
_add_sub), (extern). - .
,
. , , ,
EAX. _sub2.
:
.686
.model flatoption casemap: noneextern b3: DWORDpublic _sub1
.code_sub1 procpush EBPmov EBP, ESPmov EAX, dword ptr [EBP+8]sub EAX, b3pop EBPret 4
_sub1 endpend
b3 , - _add_sub, . _sub2
118 6
,
_add_sub. . _sub2 . -
, _add_sub :
push EAXcall _sub1
( a1 a2). - _sub2 EBP ( - ).
, ,
ret . 4 , ret 4. , EAX.
, _add_sub EAX. EAX 5. ,
.
6.4. 119
, .
-
, . , -
,
.
, .
-
. :
;
- -;
;
;
;
;
().
.
-
,
.
, ,
.
, , .
, , .
.
7
( , ), -
.
0, ,
, -
. Pascal -
Delphi. (short strings), -
255 .
,
(0). -
(null-terminated strings). -
C Windows.
:
String_0 DB "NULL-TERMINATED STRING",0
-
. , . -
:
. . .
.datas1 DB "STRING"len EQU $-s1
. . .
s1, len - . , -
len . len ( CX ECX, ).
, -
. -
, :
. . .
.datas1 DB "TEST STRING",0
.code
. . .lea ESI, s1 ; . . .cmp byte ptr [ESI],0 ; . . .
( Pascal), -
, :
. . .
.datas1 DB 7, "STRING1"
.code
. . .
121
lea ESI, s1mov CL, byte ptr [ESI]inc ESI. . .
1,
[ESI+1]. CL s1, - 7 ( mov CL, byte ptr [ESI]). .
, , -
, -
. .
,
,
, .
. , -
. -
CX (ECX) - , :
. . .
.datanum_array DD 34, 456, -768, 12len EQU $-num_array
.code
. . .lea ESI, dword ptr num_array ; -> ESImov ECX, len ; -> ECXshr ECX, 2 ;
; . . .add ESI, 4 ; . . .
-
. -
4 , 2 .
Intel
. -
Intel , -
. .
, .
rep. rep - :
rep , CX 0;
repz, repe , , ( ZF 0). , ZF 1 ECX (CX) ;
122 7
repne, repnz , , - ( ZF 1). - ZF 0 0 ECX (CX).
Intel, , -
, , -
.
,
. -
ESI(SI) EDI (DI). ESI (SI), (-
) EDI (DI). . , -
. () ()
. -
DF . 1, , 0, -
. -
. , ,
1 , 1 .
, 4 ,
4.
ESI (SI) EDI (DI) . .
. :
movs ;
lods - EAX (AX, AL) , ESI (SI);
stos EAX (AX, AL) , EDI (DI);
cmps , , - ESI (SI) EDI (DI);
scas , - EAX (AX, AL) , EDI (DI).
. ,
movs : movsb, movsw movsd. movsb , movsw - , movsd . b, w d - ESI (SI) EDI (DI). ,
.
ESI (SI) / EDI (DI) .
123
, -
.
.
-
16- 32- . -
32- ,
, . -
EAX () -, .
7.1.
movs. - , , rep - ECX (CX) . EDI (DI) - , , -
ESI (SI). , movs
ESI (SI) EDI (DI) . DF movs - 1 ( ), 2 ( ) 4 (
) EDI (DI) ESI (SI). 16- --
DS:SI, - ES:DI, CX. 32- ESI EDI, ECX. ,
.
movsb, movsw movsd -
. movs - . , STRING_A STRING_B DB, - , CX, STRING_B STRING_A:
rep movs STRING_A, STRING_B
:
rep movs ES:BYTE PTR[DI], DS:[SI]
DI SI STRING_A STRING_B.
124 7
rep , . rep - CX, - ( movs) CX . DF :
cld - DF 0;
std - DF 1.
-
, .
rep movsb ( 16- ):
. . .mov CX, counter
next:mov AL,[SI]mov DI],ALinc SI | dec SI ; inc DI | dec DI ; loop next
. . .
16- MS-DOS, -
movsb. 7.1.
7.1. movsb
(16- )
.model small
.datasrc DB "COPIED TEST STRING"len EQU $-srcdst DB len DUP (' ')
DB '$'.codestart:
mov AX, @data ; mov DS, AXmov ES, AXcld ; DF lea SI, src ; -> DS:SIlea DI, dst ; -> ES:DImov CX, len ; -> CXrep movsb ; lea DX, dst ; mov AH, 9hint 21hmov AX, 4c00hint 21hend startend
7.1. 125
-
DF , . 0 cld. - SI, - DI. -
9h 21h.
32-
( _cp_strings), 7.2.
7.2. movsb
(32- )
.586
.model flatop