410

Ассемблер Для Процессоров Intel Pentium

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