Asm Ucebnice 1

Embed Size (px)

Citation preview

  • ..

    .. , .. , ..

    "

    "

    (- )

    1

    2012

  • 004.2+004.43(075.8)

    32.973-0273

    89

    -

    ..

    : C.. ,

    .. ,

    .. , .. , .. .

    89 : -

    . . .

    .. ( 05899 24.09.2001); , 2012.

    64 .

    ISBN 978-5-89407-499-3

    ISBN 978-5-317-04302-5

    , , 1 1 2010-2012 . , , .

    004.2+004.43(075.8)

    32.973-0273

    ISBN 978-5-89407-499-3

    .. , 2012

    ISBN 978-5-317-04302-5 .., .., .., 2012

  • 3

    ............................................................................................................................. 5

    1. .................................................................. 6

    ............................................................................................. 8

    ................................................................................. 9

    ...................................................................................................................... 10

    .............................................................................................................. 11

    1-1 ....................................................................... 11

    ...................................................................................... 12

    ....................................................................................................... 13

    ................................................................................................ 14

    1-2 ........................................................... 15

    1-3 ...................................................... 15

    / ............................................................................................... 17

    1-4 Hello, World! ............................................................................................. 18

    ............................................................................................................................ 19

    2. ......................................................... 23

    ............................................................ 23

    2-1 ....................................... 23

    2-2 ..................................................................................... 24

    2-3 ............................................................. 25

    2-4 ............................................................................................... 26

    2-5 .................................................................................................... 27

    ............................................................................................................................ 28

    3. ......................................................................... 31

    ................................................................................ 31

    ................................ 31

    3-1 ................................................................... 32

    3-2 ................................................... 32

    3-3 .............................................................................. 34

    3-4 .......................................................... 35

  • 4

    ............................................................................................................................ 36

    4. ...................................................................................... 39

    4-1 ....................................... 40

    4-2 ........................................ 41

    ............................................................................................................................ 43

    5. ........................................................................ 48

    5-1 .............................................................................. 48

    5-2 .................................................................................. 49

    5-3 ................................................................... 49

    5-4 ...................................................... 50

    5-5

    ............................................................................................................................ 51

    ............................................................................................................................ 51

    6. ..................................................................................................... 54

    ........................................................................................................................ 62

  • 5

    , 1 1

    . ,

    : ,

    , .

    , .

    ,

    ,

    .

    ,

    1 ,

    .

  • 6

    1. () , IA-32/Linux

    IA-32/Windows, ,

    (. 1).

    ,

    .

    8 (1 ), 0

    232-1 ( ). 32-

    , ,

    , .

    ,

    , .

    1 - IA-32,

    .

    , ,

    .

    ,

    ( ) .

    ; , ,

    (. 2).

    IA-32 ,

    , ,

    . ,

    :

    ,

  • 7

    . ,

    , ,

    .

    2 - .

    ,

    .

    .

    . ()

    .

    .

    , , ( ):

    , , .

    , ,

    .

    , , ..

    .

    () . IA-32

    : AT&T Intel.

    , .

    NASM (Netwide Assembler),

    , Microsoft

  • 8

    Windows UNIX-.

    http://www.nasm.us/.

    .asm. , ,

    (

    ) .

    , , (

    ):

    , .text;

    ( , ), .data;

    , ; .bss.

    . ,

    ,

    . . ,

    ,

    :

    , , (/);

    , ( ), ;

    ;

    . . , , , .

    :

    ( ,

    ). ,

    .

    .

    , , ,

    : _ ;

  • 9

    , ,

    . ,

    .

    .

    :

    , ;

    , .

    DB, DW, DD DQ. :

    , ,

    , , _.

    NASM ( MASMe

    ?), RESB, RESW,

    RESD RESQ, :

    TIMES ( DUP

    MASMe):

    zerobuf ,

    64 .

    TIMES , ,

    , , :

    zerobuf times 64 db 0

    TIMES _

    _ RESB _

    _ DD 1[, 2, ... ]

    _ [:] __ ;

  • 10

    buffer 64 ,

    , . $

    . $-buffer,

    , hello, world!.

    NASM : ,

    , .

    : ,

    , , .

    : d, b y, o q, h. -

    .

    , : 0d

    0b , 0o , 0h .

    -,

    0x.

    .

    .

    ,

    , . NASM ,

    ,

    , , .

    .

    , , ,

    . ,

    ,

    mov ax,200 ; mov ax,0200d ; mov ax,0c8h ; mov ax,0xc8 ; mov ax,310q ; mov ax,11001000b ; mov ax,1100_1000b ;

    buffer: db hello, world! times 64-$+buffer db

  • 11

    : 'abcd' 0x61626364, 0x64636261.

    :

    , . ,

    , , abcd, dcba.

    db/dw/dd/dq.

    .

    .

    (storage duration):

    , , .

    . ,

    ,

    .data, .bss. ,

    , .

    1-1

    .

    . .

    ,

    io.inc, /.

    %include 'io.inc' ; (1) section .text ; (2) ; (3) global CMAIN ; (4) CMAIN: ; (5) MOV EAX, 0 ; (6) RET ; (7)

    dd 'ninechars' ; ; dd 'nine','char','s' ; db 'ninechars',0,0,0 ;

  • 12

    #include -

    , .

    , /.

    ,

    io.inc, /.

    , , , ,

    ( .text).

    .

    , CMAIN

    . CMAIN,

    io.inc .

    ,

    6. , CMAIN

    .

    main -.

    MOV, EAX

    0. RET,

    .

    -.

    6 return 0;

    0.

    IA-32 32- :

    EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP (. 3).

    AX,

    BX, CX, DX, SI, DI, BP, SP. ,

    16- . , AX, BX,

    CX, DX

    #include int main () { return 0; }

  • 13

    AL, AH, BL, BH, CL, CH, DL, DH,

    8- . L

    16- , H

    .

    3 IA-32.

    IA-32

    MOV. ,

    :

    MOV , ;

    MOV -1, -2 -2 -1;

    MOV , ;

    MOV , ;

    MOV , . , (

    ), .

    Intel. , ,

    MOV (

    AX EBX).

  • 14

    :

    [ ],

    (dword, word byte) .

    , dword [a] a (32

    ).

    ADD SUB. ,

    .

    ADD SUB . ,

    ( ) .

    .

    . (,

    ) ,

    .

    : , ,

    .

    ADD EBX, EAX ; EBX := EBX + EAX = 1 + 1 = 2, EAX ADD EBX, EBX ; EBX := EBX + EBX = 2 * EBX = 4 SUB EAX, 2 ; EAX := EAX - 2 = 1 - 2 = -1 = 0FFFFFFFFh ADD AX, 1 ; AX := AX + 1 = 0FFFFh + 1 = -1 + 1 = 0 ; EAX 0FFFF0000h

    %include 'io.inc' ; (1) section .text ; (2) ; (3) global CMAIN ; (4) CMAIN: ; (5) MOV EAX, 1 ; (6) EAX := 1 MOV EBX, EAX ; (7) EBX := EAX = 1 MOV CL, 040h ; (8) CL := 040h = 0x40 = 64 MOV EAX, 0 ; (9) RET ; (10)

  • 15

    1-2

    A 0x CAFE BABE.

    AX

    .

    A ,

    AX, . IA-32

    , :

    A+2 0xFE, 0xCA.

    , AX

    0xCAFE. , 3,

    0xCB01.

    1-3

    4 a, b, c d 1

    . 32-

    EAX ,

    a, b, c, ,

    , d. , , a, b, c d

    1, 2, 3, 4 . EAX

    0x01020304.

    ,

    32- a.

    MOV AX, WORD [A + 2] ADD AX, 3

  • 16

    .

    ,

    .

    section .bss tmp resd 1 section .data a db 1 b db 2 c db 3 d db 4 section .text mov al, byte [a] mov byte [tmp + 3], al mov al, byte [b] mov byte [tmp + 2], al mov al, byte [c] mov byte [tmp + 1], al mov al, byte [d] mov byte [tmp], al mov eax, dword [tmp]

  • 17

    /

    , ,

    () , io.inc.

    , . ,

    ,

    / .

    1. /

    PRINT_UDEC size, data

    PRINT_DEC size, data

    data 10- . size , ; 1, 2, 4. data , , , ( ). , size . PRINT_UDEC , PRINT_DEC .

    PRINT_HEX size, data , 16- .

    PRINT_CHAR ch , ch. , , , ( ). 8 .

    PRINT_STRING data , 0. , ( ). , 0 .

    NEWLINE .

  • 18

    GET_UDEC size, data

    GET_DEC size, data

    10- . size, (1, 2, 4). . data , , ( ). , GET_DEC GET_UDEC. GET_UDEC , GET_DEC . ESP.

    GET_HEX size, data , 16- 0x.

    GET_CHAR data , , Enter . , Enter 0xD 0xA. , 1 , .

    GET_STRING data, maxsz

    , ( ), maxsz . data , ( ). maxsz . 0.

    1-4 Hello, World!

    Hello, World! .

    1-1: .text,

    .data,

    ( 4).

    str, .

    ,

  • 19

    , IA-32

    str. str

    str. ,

    , .

    ,

    .

    , - 0 .

    - ,

    .

    1-1 10

    PRINT_STRING. ,

    , Hello, World!\n.

    , , ,

    .

    1-1

    .

    ,

    , ,

    .

    %include 'io.inc' ; (1) ; (2) section .data ; (3) str: db `Hello, World!\n`, 0 ; (4) ; (5) section .text ; (6) ; (7) global CMAIN ; (8) CMAIN: ; (9) PRINT_STRING [str] ; (10) MOV EAX, 0 ; (11) RET ; (12)

    hello.asm:4: error: comma, colon or end of line expected

  • 20

    ()

    16-

    ()

    -67

    01110110

    28h

    135

    1-2

    ,

    16- .

    1-3

    DB, , .

    1-4

    .

    .

    b resb 1 w resw 1 y resw 1 d resd 1

    ; a DW 185Ah ; b DW 90 ; c DW 9000 ; d DW 10000, -10000

    ; e DW 'AB' ; f DW "NASM" ; g DW "Hello" ; h DW "w", "orld", "!"

    ; i DD 97 ; j DD "x" ; k DD 'CD' ; l DD "Hello, world!"

    section .data a dw -2076 b dd -1 c db 128 d dw 256 e dd -15 f db -100

  • 21

    1-5

    EAX,

    . ,

    - -

    EAX.

    section .data a dw 0xDEAD b dw 0xF00D c dw 0xCAFE d dw 0xBABE section .text movsx eax, word [a + 1] ; () movsx ax, byte [b] ; () movzx eax, word [c] ; () movsx eax, byte [b + 2] ; () movzx ax, byte [d + 1] ; () movsx eax, word [b + 1] ; () mov bx, word [a + 1] ; movsx ax, bh ; ()

    ; a mov b, 1 ; b mov byte [b], 1 ; c mov word [b], 1 ; d mov ax, bx

    ; e mov ecx, cx ; f mov bh, cl ; g mov dword [d], esi ; h mov byte [w], ch

    ; i mov word[w], word[y] ; j add 15, bx ; k sub word [y], 8 ; l sub eax, dword [d]

  • 22

    1-6

    , ,

    .

    section .data a dw 0x0DEC b dw 0x4A6F c dw 0x7921 d dw 0xFEFF section .text mov ebx, dword [b] ; mov eax, -1 ; movzx ax, bl ; () mov ecx, dword [a + 1] ; mov eax, dword [b + 1] ; movsx ax, cl ; () mov eax, dword [c] ; bswap eax ; ()

  • 23

    2.

    ADD, SUB, NEG, MUL/IMUL, DIV/IDIV. ,

    DEC INC.

    ,

    ADC SBB.

    LEA.

    EFLAGS: CF , OF , SF , ZF , PF

    .

    2. .

    T

    M ( , )

    -

    3. .

    OF SF ZF PF CF

    ADC, SBB M M M M TM

    ADD, SUB, NEG M M M M M

    MUL, IMUL M - - - M

    DIV, IDIV - - - - -

    DEC, INC M M M M

    MOV, XCHG, MOVSX, MOVZX, LEA

    .

    .

    , .

    2-1

    AL (

    ), CF, OF, ZF SF

    .

  • 24

    AL = -60, AL = 196, CF = 1, OF = 1, ZF = 0, SF = 1.

    .

    70 = 46h, 130 = 82h

    46h 82h = C4h, CF (Carry Flag)

    1, .

    (C4h) 0, , ZF (Zero Flag)

    0. SF (Sign Flag)

    , .. . 1, , SF

    1.

    :

    C4h = 196 ,

    .

    -60 (196 = 256 60 = (-60)),

    , , -

    60.

    OF (Overflow Flag)

    . ,

    ( 130) -126

    (130 = (-126)). ,

    :

    70 (-126) = 196

    (196)

    [-128, 127], , OF

    1.

    2-2

    .

    static short int a = 10; static int b = 20, ; c = a + b;

    MOV AL, 70 SUB AL, 130

  • 25

    a b

    .data. c

    .bss.

    .

    ,

    . a int.

    2-3

    .

    , integer promotions,

    .

    :

    INT_MIN < 0 < USHRT_MAX UCHAR_MAX < INT_MAX

    32- IA-32 gcc, ,

    .

    unsigned char z = 0xff; unsigned short a = 0xff00; unsigned int b; b = a * z;

    section .data a dw 10 b dd 20 section .bss c resd 1 section .text movsx eax, word [a] ; add eax, dword [b] ; mov dword [c],eax ;

  • 26

    4. .

    INT_MIN -2147483648

    USHRT_MAX

    65535

    UCHAR_MAX

    char

    255

    INT_MAX 2147483647

    limits.h.

    ,

    ,

    b. ,

    .

    2-4

    . ,

    .

    static int a, b = 1, c = -2, d = 3; ... a = b + c * d;

    section .bss b resd 1 section .data z db 0xff a dw 0xff00 section .text movzx eax, byte [z] ; ; 8 32 movzx edx, word [a] ; ; 16 32 imul eax, edx ; mov dword [b], eax ;

  • 27

    a

    .bss. .data.

    c d.

    IMUL , ,

    EAX. EDX:EAX.

    , .. EDX,

    ,

    - (

    ).

    EAX .

    2-5

    .

    x y ,

    .

    static int x, y; ... x /= -y;

    section .text mov eax, word [c] imul dword [d] add eax, dword [b] mov dword [a], eax

    section .bss a resd 1 section .data b dd 1 c dd -2 d dd 3

  • 28

    , ,

    x y , ,

    .

    2-1

    b = a; ( ) :

    // a static unsigned char a; static unsigned int b; // b static char a; static short b;

    section .text mov eax, dword [] ; eax ; x. ; ; , ; edx:eax ; , 32- ; 64 . ; 32 ; . mov edx, eax ; x edx sar edx, 31 ; 31 ; ; , .. ; , edx:eax ; . mov ecx, dword [y] ; ecx ; y neg ecx ; , .. ; (y) idiv ecx ; mov dword [x], eax ; eax ; , x

    section .bss x dd 1 y dd 1

  • 29

    2-2

    AL (

    ), CF, OF, ZF SF

    .

    2-3

    .

    2-4

    n ,

    n.

    2-5 64 32

    64- x y. .

    // a x += y; // b x -= y;

    static unsigned short n; // 100

  • 30

    2-6

    , .

    X RESD 1 ADC WORD [X], WORD [EAX] MUL AL, AH NEG CF SBB DWORD [X], 100 MOV EAX, X DIV 15 SUB EAX, WORD [X] MOVSX EBX, BL XCHG WORD[X], 100 IDIV BYTE [EAX] MOV AL, -150 IMUL EAX, 5

  • 31

    3.

    ;

    ,

    .bss.

    .

    xp.

    .bss.

    static int *xp; static int x, y; x = *xp; *xp = y;

    section .bss xp resd 1 x resd 1 y resd 1 section .text mov edx, dword [xp] ; EDX xp mov eax, dword [edx] ; EAX ; , xp mov dword [x], eax ; x mov eax, dword [y] ; EAX y mov dword [edx], eax ; EDX ; xp. ; , ; EAX

    static int *xp; static int x; xp = &x;

    section .bss xp resd 1 x resd 1 section .text mov dword [xp], x

  • 32

    3-1

    p:

    ,

    **p + 1 ,

    PRINT_DEC.

    .

    3-2

    .

    .

    ,

    . -

    short*. , short ,

    static short *px, *py; ... *px++ = --*py;

    %include 'io.inc' section .text global CMAIN CMAIN: MOV EAX, DWORD [p] ; EAX ; p MOV EAX, DWORD [EAX] ; ; , EAX ; p, *p MOV EAX, DWORD [EAX] ; EAX **p INC EAX ; PRINT_DEC EAX ; XOR EAX, EAX ; RET ;

    static int **p;

  • 33

    , IA-32 32- , ..

    4 .

    Nasm:

    .

    ,

    .bss,

    .data.

    , , . ,

    .

    .

    *px++ = --*py;

    *py = *py 1; // (1) *px = *py; // (2) px = px + 1; // (3)

    *(px++) = --(*py);

    --(*py); *px = *py; px++;

    section .bss px dd 1 py dd 1

  • 34

    3-3

    ,

    .

    .

    xp, yp zp 8, 12 16

    , ebp. decode1

    , .

    .

    mov edi, dword [ebp + 8] ; (1) mov edx, dword [ebp + 12] ; (2) mov ecx, dword [ebp + 16] ; (3) mov ebx, dword [edx] ; (4) mov esi, dword [ecx] ; (5) mov eax, dword [edi] ; (6) mov dword [edx], eax ; (7) mov dword [ecx], ebx ; (8) mov dword [edi], esi ; (9)

    void decode1(int *xp, int *yp, int *zp)

    section .text mov eax, dword [py] ; (1) eax ; py dec word [eax] ; 16- ; , ; eax, .. py mov cx, word [eax] ; (2) cx ; mov eax, dword [px] ; eax ; px mov word [eax], cx ; , ; , ; px, *py add dword [px], 2 ; (3) px. ; ; ; 1 * sizeof(short), . 2

  • 35

    , .. - ,

    ebx, esi, eax.

    edi, edx, ecx, ,

    ,

    , ebx, esi, eax.

    , -.

    y ebx, z esi, x eax.

    3-4

    -

    .

    void decode1(int *xp, int *yp, int *zp) { int y = *yp; int z = *zp; int x = *xp; *yp = x; *zp = y; *xp = z; }

    mov dword [edx], eax ; (7) *yp eax *xp mov dword [ecx], ebx ; (8) *zp ebx *yp mov dword [edi], esi ; (9) *xp esi *zp

    mov ebx, dword [edx] ; (4) ebx *yp mov esi, dword [ecx] ; (5) esi *zp mov eax, dword [edi] ; (6) eax *xp

    mov edi, dword [ebp + 8] ; (1) edi xp mov edx, dword [ebp + 12] ; (2) edx yp mov ecx, dword [ebp + 16] ; (3) ecx zp

  • 36

    , .

    p . 40

    , , 4

    .

    8- p+32,

    , .. ,

    . ,

    1, .

    3-1 -

    ,

    .

    .

    void decode2(int *xp, int *yp, int *zp)

    mov eax, dword [p + 32] mov eax, dword [eax] add eax, 1 mov dword [x], eax

    static int *p[10]; static int x; x = *p[8] + 1;

  • 37

    xp, yp zp 8, 12 16

    , ebp. decode2

    , .

    3-2

    ,

    .

    3-3

    100 . ,

    eax

    , :

    a) char,

    b) short,

    c) int.

    3-4

    -

    .

    // a int x, *px; *px++ = x -10; // b short x, *px; x = *(--px + 4);

    mov eax, dword [ebp + 12] mov edi, dword [eax] mov eax, dword [ebp + 8] mov edx, dword [eax] mov eax, dword [ebp + 16] mov eax, dword [eax] add edx, eax mov eax, dword [ebp + 12] mov dword [eax], edx mov eax, dword [ebp + 8] mov dword [eax], edx mov eax, dword [ebp + 16] mov dword [eax], edi

  • 38

    3-5 -

    -

    .

    // a short **p; ++*(*(p+=3) -= 2); // b char **q, **r, **t; r = q++; *t = (*r)++; **q = (**t)++;

    static int a[50]; static int *p, *q; static int n; p = &a[10]; q = &a[25]; n = q - p;

  • 39

    4. IA-32

    jmp Jcc, ,

    EFLAGS.

    4. .

    Jcc

    JE ZF /

    JNE ~ZF /

    JS SF

    JNS ~SF

    JG ~(SF^OF)&~ZF ( )

    JGE ~(SF^OF) ( )

    JL (SF^OF) ( )

    JLE (SF^OF)|ZF ( )

    JA ~CF&~ZF ( )

    JB CF ( )

    : (1)

    EFLAGS (2) . , ,

    CMP, EFLAGS ,

    SUB, , ..

    .

    IA-32 do-while

    . ,

    ECX (CX), .

    , LOOP/LOOPcc

    [128, 127] .

    LOOP/LOOPcc ECX ,

    , . ,

    ECX,

    232 .

  • 40

    5. .

    JCXZ/JECXZ , CX/ECX .

    LOOP , ECX .

    LOOPZ/LOOPE , ECX ZF .

    LOOPNZ/LOOPNE , ECX ZF .

    4-1

    , data_t

    , COMP . a

    EDX, b ECX.

    , ,

    data_t COMP ( ).

    SETcc L, ,

    EAX EDX 32 .

    int long,

    signed.

    >, L

    1 < 2 .

    , .

    1 < 2 ECX < EDX b < a a > b

    int comp(data_t a, data_t b) { return a COMP b; }

    CMP ECX, EDX SETL AL

  • 41

    4-2

    .

    a b.

    32-. ,

    , .

    .

    :

    3 6 12.

    ( TEST JE) .

    1-6 :

    static int a, b;

    SECTION .text GLOBAL CMAIN CMAIN: MOV ESI, DWORD [a] ; (1) TEST ESI, ESI ; (2) JE .1 ; (3) MOV ECX, DWORD [b] ; (4) TEST ECX, ECX ; (5) JE .1 ; (6) MOV EDX, DWORD [ESI] ; (7) MOV EAX, EDX ; (8) SAR EDX, 31 ; (9) IDIV ECX ; (10) SUB DWORD [ESI], EDX ; (11) .1: XOR EAX, EAX ; (12) RET ; (13)

    int comp(int a, int b) { return a > b; }

  • 42

    ,

    && , 4-6

    ,

    3.

    7-11.

    ESI, a

    , .. a ,

    .

    , , eax edx,

    edx

    , , , 10 .

    ,

    signed,

    int, .

    idiv *a b,

    ecx

    b.

    . ,

    ,

    . edx ( 11),

    .

    , ,

    a.

    .

    ,

    if, .

    *a = *a *a % b;

    static int *a, b;

    if ((0 != a) && (0 != b)) { ... }

    if (0 != a) { if (0 != b) { ... } }

  • 43

    4-1

    data_t , COMP -

    . a EX.

    , ,

    data_t COMP ( ).

    4-2

    , data_t

    , COMP . a

    EDX, b ECX.

    , ,

    data_t COMP ( ).

    int comp(data_t a, data_t b) { return a COMP b; }

    (A) TEST EX, EX SETNE AL () TEST X, X SETE AL

    () TEST L, L SETG AL () TEST X, X SETA AL

    int comp(data_t a) { return a COMP 0; }

    static int *a, b; if ((0 != a) && (0 != b)) { *a -= *a % b; }

  • 44

    4-3

    -.

    x = (y 0) { *p += a; } }

    int x, y = 100, a = 0, b = 1; x = y

  • 45

    4-7

    ,

    . : ,

    , , .

    4-8 :

    , -.

    - .

    .

    int test(int x, int y) { int val = __________; if (______) { if (______) { val = __________; } else { val = __________; } } else if (______) { val = __________; } return val; }

    mov eax, dword [ebp + 8] ; x mov edx, dword [ebp + 12] ; y cmp eax, -3 jge l2 cmp eax, edx gle l3 imull eax, edx jmp l4 l3: lea eax, dword [eax + edx] jmp l4 l2: cmp eax, 2 jg l5 xor eax, edx jmp l4 l5: sub eax, edx l4:

  • 46

    4-9 :

    , .

    -.

    4-10

    , .

    4-11 :

    :

    int dw_loop(int x, int y, int n) { //1 { //2 do { //3 x += n; //4 y *= n; //5 n--; //6 } while ((n > 0) && (y < n)); //7 return x; //8 }

    mov ebx, dword [a] mov ecx, dword [b] cmp ebx, ecx jg .L7 jl .L8 xor eax, eax jmp .L9 .L8: mov edx, dword [c] mov eax, edx sar edx, 31 sub ecx, ebx idiv ecx jmp .L9 .L7: mov edx, dword [c] mov eax, edx sar edx, 31 sub ebx, ecx idiv ebx .L9: mov dword [d], eax

    ... static _____________________ a; static _____________________ b; static _____________________ c; static _____________________ d; if (__________) { d = ________________; } else if (__________) { d = ________________; } else { d = ________________; } ...

  • 47

    , -,

    , , -.

    4-12

    ,

    :

    4-13

    (unsigned int).

    4-14

    ,

    N (N > 1). : F0

    = F1 = 1, Fk = Fk-1 + Fk-2, k 2.

    4-15

    30 . :

    a) ,

    b) (,

    ),

    c) .

    mov al, -80 cmp al, 150 jb M1 jl M2 jmp M3

    mov eax, dword [ebp + 8] ; (1) x mov ecx, dword [ebp + 12] ; (2) y mov edx, dword [ebp + 16] ; (3) n L2: ; (4) add eax, edx ; (5) imul ecx, edx ; (6) sub edx, 1 ; (7) test edx, edx ; (8) jle L5 ; (9) cmp ecx, edx ; (10) jl L2 ; (11) L5: ; (12)

  • 48

    5.

    5-1

    a, b, c, d.

    0 1.

    a.

    a, b, c d , .bss.

    ,

    .

    , (~c & d) | (c & ~d)

    , ..

    , .

    section .bss a resd 1 b resd 1 c resd 1 d resd 1 section .text mov eax, dword [c] ; eax c mov edx, dword [d] ; edx d mov ecx, eax ; c ecx not eax ; eax ~c and eax, edx ; eax ~c & d not edx ; edx ~d and ecx, edx ; ecx c & ~d or eax, ecx ; eax (~c & d) | (c & ~d) mov edx, dword [a] ; edx a and edx, dword [b] ; edx a & b not edx ; edx ~(a & b) or eax, edx ; eax ~(a & b) | ((~c & d) | (c & ~d)) mov dword [a], eax ; a ~(a & b) | ((~c & d) | (c & ~d))

    static int a, b, c, d; a = ~(a & b) | ((~c & d) | (c & ~d));

  • 49

    5-2

    a b 2 . EAX

    : 2

    a, 2 b,

    5 .

    5-3

    , ,

    .

    , .

    : x [ebp + 8], y

    [ebp + 12], z [ebp + 16].

    mov eax, dword [ebp + 12] ; (1) xor eax, dword [ebp + 8] ; (2) shr eax, 3 ; (3) not eax ; (4) sub eax, dword [ebp + 16] ; (5)

    int arith(int x, int y, int z) { int t1 = _________; int t2 = _________; int t3 = _________; int t4 = _________; return t4; }

    section .bss a resw 1 b resw 1 section .text mov ax, word [a] ; a ; 16 ; EAX shl eax, 16 ; mov ax, word [b] ; b ; EAX ror ax, 5 ;

  • 50

    .

    y eax. ,

    -.

    xor y x.

    eax. ( 3)

    3 . , ,

    .

    , , 5,

    z.

    , ,

    eax.

    ,

    .

    t4,

    5 EAX,

    .

    5-4

    32- a.

    3 1, 17 0, 23

    .

    bts, btr, btc.

    int arith(int x, int y, int z) { int t1 = y ^ x; int t2 = t1 >> 3; int t3 = ~t2; int t4 = t3 - z; return t4; }

  • 51

    5-5

    , eax 6,

    . eax.

    5-1

    x .

    , eax 1, x < 0, 0

    .

    5-2

    eax 5 5 .

    5-3

    .

    // a static int x;

    // b static short x;

    // c static char x;

    mov ebx, eax ; ebx shl ebx, 2 ; ebx 2 ; ( 4) shl eax,1 ; eax 1 ; ( 2) add eax, ebx ; , ; eax

    section .bss a resd 1 section .text bts dword [a], 3 btr dword [a], 17 btc dword [a], 23

  • 52

    5-4

    eax ( ) edx (

    ) .

    5-5

    .

    5-6

    eax 1,

    5 , 0 .

    5-7

    ,

    L , a .

    5-8

    "" .

    5-9 sign

    sign, MOV, SHR, NEG OR.

    section .data x dd 0xfeff0201 section .text mov cx, word [x + 1] mov ax, cx imul ah shl ax, cl movsx eax, ax movzx edx, ax

    // a static unsigned x, y; y = 32 * x x / 8 + x % 16; // b static long long x; x *= 2; // c static int x, y; y = x / 64 + x * 4;

  • 53

    5-10

    , ,

    1 0 .

    : 10100111 00001000

    5-11

    ROL, ROR, RCL, RCR SAR,

    , .

    ) sar eax, 2 b) rol bx, 1 c) rcr ecx, 1 d) rol ax, 8 e) rcl ebx, 31

  • 54

    6.

    1-1

    ()

    16-

    ()

    10111101 BDh -67 189

    01110110 76h 118 118

    00101000 28h 40 40

    10000111 87h -121 135

    1-5

    () EAX = 0xdde

    () EAX = 0xd

    () EAX = 0xcafe

    () EAX = 0xfffffffe

    () EAX = 0xffff00ba

    () EAX = 0xfffffef0

    () EAX = 0xffff000d

    () EAX = 0xffff006f

    () EAX = 0xff79000d

    () EAX = 0x2179fffe

    1-6

    2-1

    ; a movzx eax, byte [a] mov dword [b], eax ; b movsx eax, byte [a] mov word [b], eax

    section .bss a resd 1 b resd 1 section .text mov al, byte [a] mov byte [b], al mov al, byte [a + 1] mov byte [b + 3], al mov ax, word [a + 2] mov word [b + 1], ax

  • 55

    2-2

    (a) AL = -118, AL = 138, CF = 1, OF = 0, ZF = 0, SF = 1.

    (b) AL = 5, AL = 5, CF = 0, OF = 0, ZF = 0, SF = 0.

    (c) AL = -90, AL = 166, CF = 1, OF = 0, ZF = 0, SF = 1.

    (d) AL = 58, AL = 58, CF = 1, OF = 0, ZF = 0, SF = 0.

    3-1

    4-1

    () data_t int, unsigned, , long COMP - != () data_t short unsigned short COMP - == () data_t char COMP - > () data_t unsigned short COMP - >

    void decode2(int *xp, int *yp, int *zp) { int y = *yp; *yp = *xp + *zp; *xp = *yp; *zp = y; }

  • 56

    4-2

    4-3

    section .bss x resd 1 section .data y dd -1 a dd 0 b dd 1 section .text global CMAIN CMAIN: cmp dword [y], 0 mov eax, dword [b] cmovle eax, dword [a] mov dword [x], eax

    () data_t short COMP - >= () data_t unsigned char COMP - < () data_t int, unsigned, ; long COMP - !=

  • 57

    4-4

    4-5

    4-6

    %include 'io.inc' section .text global CMAIN CMAIN: GET_DEC 4, ecx mov eax, 1 jecxz end_label loop_body: imul eax, ecx loop loop_body end_label: PRINT_DEC 4, eax mov eax, 0 ret

    test eax, eax jz label test edx, edx jle label add dword [eax], edx label:

    %include 'io.inc' section .text global CMAIN CMAIN: GET_DEC 4, eax cmp eax, 0 jge label neg eax label: PRINT_DEC 4, eax NEWLINE xor eax, eax ret

  • 58

    4-7

    4-8

    .

    . .

    .

    CMP Jcc,

    if . ,

    .

    int test(int x, int y) { int val = x^y; if (x < -3) { if (y < x) { val = x * y; } else { val = x + y; } } else if (x > 2) { val = x - y; } return val; }

    %include 'io.inc' section .text global CMAIN CMAIN: GET_DEC 4, ebx ; GET_DEC 4, edx ; GET_DEC 4, ecx ; xor eax jexcz end_label loop_body: add eax, ebx add ebx, edx loop loop_body end_label: PRINT_DEC 4, eax mov eax, 0 ret

  • 59

    4-9

    ... static int a; static int b; static int c; static int d; if (a > b) { d = c / (a - b); } else if (a < b) { d = c / (b - a); } else { d = 0; } ...

    int test(int x, int y) { int val; if (x < -3) { if (y < x) { val = x * y; } else { val = x + y; } } else if (x > 2) { val = x - y; } else { val = x^y; } return val; }

  • 60

    4-10

    4-11

    4-12

    M3

    mov eax, dword [ebp + 8] ; (1) x mov ecx, dword [ebp + 12] ; (2) y mov edx, dword [ebp + 16] ; (3) n L2: ; (4) add eax, edx ; (5) x += n; imul ecx, edx ; (6) y *= n; sub edx, 1 ; (7) n--; test edx, edx ; (8) n v 0 jle L5 ; (9) n

  • 61

    :

    M1 , 176 > 150;

    M2 , .. -80 > -106.

    M3.

    5-4 eax = -8 edx = 65528

    mov al, -80; (-80) = 176 cmp al, 150; 150 = (-106) jb M1 jl M2 jmp M3

  • 62

    1. . , . :

    (Computer Systems: A Programmers Perspective).

    : -, 2005 . 1186 .

    2. Henry S. Warren. Hacker's Delight (2nd Edition). / Addison-Wesley Professional; 2

    edition (October 5, 2012) . 512

    3. .. , .. , .. , .. ,

    .. .

    (- 1 ). .:

    ..

    4. .. , .. , .. , .. , .. .

    ( - ). .: . - ..

    , 2012.

    5. .. , .. , .. , .. , .. ,

    .. .

    ( ). .: . - .. ,

    2012.