assembly.8086.for.beginners.greek

42
 1 ΠΑΝΕΠΙΣΤΗΜΙΟ ΔΥΤΙΚΗΣ ΜΑΚΕΔΟΝΙΑΣ  ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ Οδηγός Εκμάθησης στην Assembly 8086 Διδάσκων: Μηνάς Δασυγένης Μάθημα: Αρχιτεκτονική Υπολογιστών Οδηγός Εκμάθησης στην Assembly Μετάφραση του κειμένου "8086 Assembler Tutorial for Beginners" Ημερομηνία: 16/01/2013 Βεντούρης Αντώνιος Μπάτσου Ελευθερία

Upload: dimitris-leivaditis

Post on 08-Oct-2015

10 views

Category:

Documents


0 download

DESCRIPTION

Assembly - Ελληνικά

TRANSCRIPT

  • 1

    Assembly 8086

    :

    :

    Assembly

    "8086 Assembler Tutorial for

    Beginners"

    : 16/01/2013

  • 2

    Assembler

    ( 1)

    assembler .

    (Basic, C/C++,

    Pascal...) .

    assembler

    emu8086.

    (HEX/BIN),

    Numbering Systems Tutorial .

    assembly;

    assembly

    .

    . :

    ( )

    .

    CPU ,

    .

  • 3

    RAM

    .

    CPU

    8086 CPU 8 ,

    .

    AX ( AH/AL).

    BX ( BH/BL).

    CX ( Ch/CL).

    DX ( DH/DL).

    SI .

    DI .

    BP .

    SP .

    ,

    .

    ().

    16 bit, :

    0011000000111001b ( ), 12345

    () .

    4 (AX, BX, CX, DX)

    8 bit , AX=

    0011000000111001b, AH=00110000b AL=00111001b.

    8 bit

    16 bit .

    3 , "H" high () "L" low

    () .

  • 4

    CPU,

    .

    , .

    .

    .

    ,

    ,

    .

    CS .

    DS .

    ES extra ,

    .

    SS .

    , .

    -

    .

    .

    12345h (), DS = 1230h

    SI = 0045h. ,

    16 bit.

    CPU 10h (1230h * 10h + 45h = 12345h):

    2

    . BX, SI DI

    DS, BP SP

    SS.

    . BX

    , BH BL !

    IP .

    Flags Register .

  • 5

    IP CS

    .

    CPU

    ,

    .

    .

  • 6

    ( 2 )

    4 : BX, SI, DI, BP.

    [] ,

    . ():

    [BX + SI] [SI] [BX + SI] + d8

    [BX + DI] [DI] [BX + DI] + d8

    [BP + SI] d16 ( ) [BP + SI] + d8 [BP + DI] [BX] [BP + DI] + d8

    [SI] + d8 [BX + SI] + d16 [SI] + d16

    [DI] + d8 [BX + DI] + d16 [DI] + d16

    [BP] + d8 [BP + SI] + d16 [BP] + d16

    [BX] + d8 [BP + DI] + d16 [BX] + d16

    d8 8 bit .

    d16 16 bit .

    . compiler.

    [],

    compiler .

    ,

    .

    compiler d8

    d16 .

    , DS = 100, BX = 30, SI = 70. [BX + SI] + 25 : 100 * 16 + 30 + 70 + 25 = 1725.

    DS

    BP, SS. , :

  • 7

    . BX BP

    . SI PI.

    : [BX+5].

    (CS, DS, SS, ES)

    (segment),

    (offset). DS 1234h

    SI 7890h 1234:7890.

    1234h * 10h + 7890h = 19BD0h.

    compiler

    :

    BYTE PTR byte. WORD PTR ( bytes). :

    BYTE PTR [BX] ; byte.

    WORD PTR [BX] ; .

    MicroAsm : b. BYTE PTR

    w. WORD PTR compiler ,

    .

    MOV

    () ().

    , .

    .

    , byte .

  • 8

    :

    MOV , MOV , MOV , MOV , MOV ,

    : AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.

    : [BX], [BX+SI+7], , ...

    : 5, -24, 3Fh, 10001101b,...

    MOV:

    MOV . , MOV , . MOV , . MOV . ,

    . : DS, ES, SS, : CS.

    : AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.

    : [BX], [BX+SI+7], , ...

    MOV

    CS IP.

    MOV:

    #MAKE_COM# ; o compiler COM file. ORG 100h ; COM. MOV AX, 0B800h ; AX ; B800h. MOV DS, AX ; AX DS. MOV CL, 'A' ; CL ASCII ; 'A', 41h. MOV CH, 01011111b ; CH ; . MOV BX, 15Eh ; BX 15Eh. MOV [BX], CX ; CX, B800:015E RET ; .

  • 9

    MicroAsm, [Compile] (

    F5 ).

    & :

    1. ,

    .

    2. Ctrl + C .

    3. MicroAsm

    Ctrl + V .

    , ; ,

    ; compiler.

    :

    ( emu8086 microprosessor emulator).

    , MOV

    .

  • 10

    ( 3)

    .

    var1 5A73:235B, 10

    .

    compiler : BYTE WORD.

    :

    DB DW

    DB Define Byte. DW Define Word.

    - , . ( ).

    value (, ,

    ), "?" .

    2 ,

    MOV

    .

    MOV:

    #MAKE_COM#

    ORG 100

    MOV AL, var1 MOV BX, var2 RET ; .

    VAR1 DB 7

    var2 DW 1234h

    MicroAsm source editor,

    F5 compile.

    assemply (emu8086 ).

  • 11

    compiler , "VAR1"

    "var1" .

    VAR1 0108h.

    VAR2 0109h, WORD

    2 BYTES. low byte

    , 34h

    12h.

    RET,

    assembly ,

    8086 ( ).

    DB:

    #MAKE_COM#

    ORG 100

    DB 0A0h DB 08h DB 01h

    DB 8Bh DB 1Eh DB 09h DB 01h

    DB 0C3h

    DB 7

    DB 34h DB 12h

    MicroAsm, F5 compile,

    (emulator).

    .

    , compiler

    bytes,

    , .

    ORG 100h compiler ( compiler

    ).

    . compiler

    100h (256 bytes),

    compiler

    .

    .

  • 12

    100h;

    256 bytes CS ( ),

    . COM,

    EXE 0000,

    . EXE

    .

    . byte , ASCII (0..255).

    : a DB 48h, 65h, 6Ch, 6Ch, 6Fh, 00h

    b DB Hello, 0

    b , compiler , bytes. :

    , :

    MOV AL, a[3]

    BX, SI, DI, BP, :

    MOV SI, 3

    MOV AL, a[SI]

    DUP.

    DUP :

    DUP ( / )

  • 13

    - (

    ).

    DUP .

    :

    c DB 5 DUP(9)

    :

    c DB 9, 9, 9, 9, 9

    :

    d DB 5 DUP(1, 2)

    :

    d DB 1, 2, 1, 2, 1, 2, 1, 2, 1, 2

    , DW DB,

    255, -128. DW

    .

    DUP 1020 ! (

    13 ),

    ( ).

    LEA (Load Effective Address)

    OFFSET. OFFSET LEA

    . LEA

    .

    ,

    .

  • 14

    :

    compiler

    :

    BYTE PTR byte. WORD PTR ( bytes). :

    BYTE PTR [BX] ; byte.

    WORD PTR [BX] ; .

    MicroAsm : b. BYTE PTR

    w. WORD PTR compiler ,

    .

    :

    ORG 100h

    MOV AL, VAR1 ; VAR1 AL.

    LEA BX, VAR1 ; VAR1 BX.

    MOV BYTE PTR [BX], 44h ; VAR1.

    MOV AL, VAR1 ; VAR1 AL.

    RET

    VAR1 DB 22h

    END

    , OFFSET LEA:

    ORG 100h

    MOV AL, VAR1 ; VAR1 AL.

    MOV BX, OFFSET VAR1; VAR1 BX.

    MOV BYTE PTR [BX], 44h ; VAR1.

    MOV AL, VAR1 ; VAR1 AL.

    RET

    VAR1 DB 22h

    END

  • 15

    .

    : LEA BX, VAR1 MOV BX, OFFSET VAR1

    compiler : MOV BX, num

    num 16 bit offset. ( ): BX, SI, DI, BP! ( ).

    , compile (assembled). . EQU :

    EQU < >

    :

    k EQU 5

    MOV AX, k

    MOV AX, 5

    emu8086:

    "Variables" "View" emulator.

  • 16

    elements .

    Assembly ,

    .

    .

    HEX ( 16).

    BIN ( 2).

    OCT ( 8).

    SIGNED ( 10).

    UNSIGNED ( 10).

    CHAR ASCII ( 256 ,

    ).

    , ,

    Edit.

    ,

    "h", "b"

    "o", .

    : 'hello

    world', 0 ( ).

    :

    1, 2, 3, 4, 5 ( byte words,

    BYTE WORD).

    , :

    :

    5 + 2 7 ...

  • 17

    ( 4)

    (interrupts)

    .

    ,

    .

    (disc drive)

    (hardware).

    .

    hardware,

    hardware.

    .

    INT,

    :

    0 255 ( 0

    0FFh), .

    256 ,

    . -.

    -

    AH .

    256 ( 256 * 256 =

    65536 ). ,

    .

    .

    INT 10h 0h "Hello!".

    .

  • 18

    #MAKE_COM# ; compiler

    ;COM file. ORG 100h

    - , .

    MOV AH, 0Eh ; . INT 10h / 0Eh ASCII AL .

    MOV AL, 'H' ; ASCII : 72 INT 10h ; !

    MOV AL, 'e'

    ; ASCII

    :101 INT 10h ; !

    MOV AL, 'l' ; ASCII : 108 INT 10h ; !

    MOV AL, 'l' ; ASCII : 108 INT 10h ; !

    MOV AL, 'o' ; ASCII : 111 INT 10h ; !

    MOV AL, '!' ; ASCII : 33 INT 10h ; !

    RET ; .

    , compile. !

    list of basic interrupts .

  • 19

    ( 5)

    emu8086.inc

    .

    INCLUDE

    . compiler

    ,

    Inc.

    emu8086.inc ( Inc),

    ,

    .

    emu8086.inc

    :

    include 'emu8086.inc'

    emu8086.inc (macros): PUTC char 1 , ASCII

    . GOTOXY col, row 2 ,

    . PRINT string 1 ,

    . PRINTN string 1 ,

    . PRINT .

    CURSOROFF . CURSORON .

    :

  • 20

    include emu8086.inc

    ORG 100h

    PRINT 'Hello World!'

    GOTOXY 10, 5

    PUTC 65 ; 65 - ASCII 'A' PUTC 'B'

    RET ; . END ; compiler.

    compiler

    emu8086.inc

    . ,

    ,

    (

    ).

    emu8086.inc :

    PRINT_STRING , DS:SI. : DEFINE_PRINT_STRING END.

    PTHIS - , ( PRINT_STRING), . CALL. :

    CALL PTHIS db 'Hello World!', 0

    : DEFINE_PTHIS END.

    GET_STRING -

    .

    DS:DI, DX.

    'Enter'.

    : DEFINE_GET_STRING END.

    CLEAR_SCREEN , ( ), . : DEFINE_CLEAR_SCREEN END.

  • 21

    SCAN_NUM CX. : DEFINE_SCAN_NUM END.

    PRINT_NUM AX. : DEFINE_PRINT_NUM DEFINE_PRINT_NUM_UNS END.

    PRINT_NUM_UNS AX. : DEFINE_PRINT_NUM_UNS END.

    ( END), CALL .

    :

    include 'emu8086.inc' ORG 100h

    LEA SI, msg1 ; CALL print_string CALL scan_num ; CX.

    MOV AX, CX ; ; AX.

    ; string: CALL pthis DB 13, 10, 'You have entered: ', 0

    CALL print_num ; ; AX.

    RET ; .

    msg1 DB 'Enter the number: ', 0

    DEFINE_SCAN_NUM DEFINE_PRINT_STRING DEFINE_PRINT_NUM DEFINE_PRINT_NUM_UNS ; print_num. DEFINE_PTHIS END ; compiler.

  • 22

    compiler ( ). compiler CALL . CALL . , 100 , . , ; , , .

  • 23

    ( 6)

    ( ) .

    16bit . bit 0 1 . (CF) - 1 ,

    . , bytes 255+1 ( 0...255) . 0 .

    (ZF) - 1 0 . 0 .

    (SF) - 1 . , 0 . , (MSB) .

    (OF) - 1 . , bytes 100+50 ( -128...127)

    (PF) - 1 0 . , 8 bit .

    (AF) - 1 (4 bits) .

    (IF) - 1 , .

    (DF) - . 0 - , 1 .

  • 24

    3 .

    : ADD, SUB,CMP, AND, TEST, OR, XOR

    :

    REG(), memory( ) memory, REG REG, REG memory, immediate( ) REG, immediate

    REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP. memory: [BX], [BX+SI+7], , ... immediate: 5, -24, 3Fh, 10001101b, ...

    , . CMP TEST . :

    CF, ZF, SF, OF, PF, AF.

    ADD - . SUB - . CMP - ( ). AND - 2 .

    :

    1 AND 1 = 1 1 AND 0 = 0 0 AND 1 = 0 0 AND 0 = 0

    1 , 2 bit 1 .

    TEST - AND .

    OR - 2 .

    : 1 OR 1 = 1 1 OR 0 = 1 0 OR 1 = 1 0 OR 0 = 0

    1 , 1() bit .

  • 25

    XOR - XOR ( ) 2 .

    : 1 XOR 1 = 0 1 XOR 0 = 1 0 XOR 1 = 1 0 XOR 0 = 0

    1 bit .

    : MUL, IMUL, DIV, IDIV :

    REG memory

    REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.

    memory: [BX], [BX+SI+7], , ...

    MUL IMUL :

    CF, OF

    1 . , 0 .

    DIV IDIV .

    MUL - :

    byte: AX = AL * .

    word(): (DX AX) = AX * .

    IMUL - :

    byte: AX = AL * . word: (DX AX) = AX * .

    DIV - :

  • 26

    byte: AL = AX /

    AH = .

    word:

    AX = (DX AX) /

    DX = .

    IDIV - :

    byte: AL = AX /

    AH = .

    word: AX = (DX AX) /

    DX = .

    : INC, DEC, NOT, NEG

    :

    REG memory

    REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.

    memory: [BX], [BX+SI+7], , ...

    INC , DEC :

    ZF, SF, OF, PF, AF.

    NOT !

    NEG :

    CF, ZF, SF, OF, PF, AF.

    NOT - bit .

    NEG - ( 2) . bit 1 . , 5 -5 -2 2 .

  • 27

    ( 7)

    . , .

    JMP . JMP :

    JMP

    , ":" . , . , 3 :

    label1: label2: a:

    . :

    x1: MOV AX, 1 x2: MOV AX, 2

    JMP:

    ORG 100h

    MOV AX, 5 ; AX 5. MOV BX, 2 ; BX 2.

    JMP calc ; 'calc'.

    back: JMP stop ; 'stop'.

    calc: ADD AX, BX ; BX AX. JMP back ; 'back'.

    stop:

    RET ; .

    END ; compiler .

  • 28

    , 2 , JMP .

    , JMP , . (65 , 535 bytes) .

    JMP , ( , ) . 3 . . , , .

    JZ , JE . ZF = 1 JNZ, JNE

    JS . SF = 1 JNS

    JO OF = 1 JNO . JPE, JP . PF = 1 JPO JNZ , JNE . ZF = 0 JZ, JE

    JNS . SF = 0 JS JNO OF = 0 JO . JPO, JNP . PF = 0 JPE, JP

    , , , JE - :JZ .

    , , .

    JC , JB, JNAE .

    CF = 1 JNC, JNB, JAE

    JNC , JNB,

    JAE

    .

    CF = 0 JC, JB, JNAE

  • 29

    JL , JNGE .

    - () .

    ZF = 1

    ZF = 0

    ZF = 0

    and

    SF = OF

    SF OF

    SF = OF

    ZF = 1

    or

    SF OF

    JNE, JNZ

    JE, JZ JNG, JLE

    JNL, JGE

    JNGE, JL JNLE, JG

    JE , JZ (=) 0 .

    JNE , JNZ () 0 .

    JG , JNLE ( .

    JGE , JNL .

    JLE , JNG .

  • 30

    JA , JNBE . .

    .

    JAE , JNB, JNC .

    , CMP ( SUB() , , ) .

    . : 5 2 , 5-2=3 ( 0) . : 7 7 , 7-7=0

    ZF = 1

    ZF = 0

    CF = 0

    and

    ZF = 0 CF = 1 CF = 0

    CF = 1

    or

    ZF = 1

    JNE, JNZ

    JE, JZ JNA, JBE JNB, JAE, JNC JNAE, JB

    JNBE, JA

    JE , JZ (=) 0 .

    JNE , JNZ () 0 .

    JB , JNAE, JC

    JBE , JNA .

  • 31

    ! ( 1 JZ JE ) .

    CMP :

    include emu8086.inc

    ORG 100h

    MOV AL, 25 ; AL 25. MOV BL, 10 ; BL 10.

    CMP AL, BL ; AL - BL.

    JE equal ; AL = BL (ZF = 1).

    PUTC 'N' ; , AL BL, JMP stop ; '' stop.

    equal: ; , PUTC 'Y' ; AL = BL, 'Y'.

    stop:

    RET ; , . END

    AL BL , , click [FLAGS] . [Single Step] . , ( F5).

    . CMP 127 bytes 128 bytes ( 3 bytes) .

    :

    o _x . o JMP . o _x: JMP .

    _x: - .

  • 32

    :

    include emu8086.inc

    ORG 100h

    MOV AL, 25 ; AL 25. MOV BL, 10 ; BL 10.

    CMP AL, BL ; AL - BL.

    JNE not_equal ; if AL BL (ZF = 0). JMP equal

    not_equal: ; ; ; 127 bytes... PUTC 'N' ; , AL BL, JMP stop ; 'N', stop.

    equal: ; , PUTC 'Y' ; AL = BL, 'Y'.

    stop:

    RET ; , .

    END

    , , . "$" , , . :

    ORG 100h

    ; : ; 2 byte, JMP $2

    a DB 3 ; 1 byte. b DB 4 ; 1 byte.

    ; JCC 7 bytes: ; (JMP 2 byte ) MOV BL,9

    DEC BL ; 2 bytes. CMP BL, 0 ; 3 bytes. JNE $-7

    RET END

  • 33

    ( 8)

    , . . , .

    :

    PROC

    ; ; ...

    RET ENDP

    - . , . . , RET . . ( , ) . PROC ENDP , . . CALL . :

    ORG 100h

    CALL m1

    MOV AX, 2

    RET ; .

    m1 PROC MOV BX, 5 RET ; . m1 ENDP

    END

    m1 , MOV BX, 5 CALL MOV AX, 2.

  • 34

    . , . 2 AL BL , AX:

    ORG 100h

    MOV AL, 1 MOV BL, 2

    CALL m2 CALL m2 CALL m2 CALL m2

    RET ; .

    m2 PROC MUL BL ; AX = AL * BL. RET ; . m2 ENDP

    END

    AL . BL . 2 4 , AX 16 ( 10h)

    , "Hello World!":

    ORG 100h LEA SI, msg ; SI msg . CALL print_me

    RET ; .

    ; ========================================================== ; . ; 0 , ; SI: print_me PROC

    next_char: CMP b.[SI], 0 ; 0 . JE stop ;

    MOV AL, [SI] ; ASCII .

    MOV AH, 0Eh ; . INT 10h ; AL . ADD SI, 1 ; .

  • 35

    JMP next_char ; .

    stop: RET ; . print_me ENDP ; ==========================================================

    msg DB 'Hello World!', 0 ; .

    END

    "b." - [SI] 2bytes . "w." . , .

  • 36

    ( 9)

    . CALL . RET . INT . . IRET . . : PUSH - 16byte . POP - 16byte .

    PUSH:

    PUSH REG PUSH SREG PUSH memory PUSH immediate

    REG: AX, BX, CX, DX, DI, SI, BP, SP. SREG: DS, ES, SS, CS. memory: [BX], [BX+SI+7], 16 bit , ... immediate: 5, -24, 3Fh, 10001101b, ...

    POP:

    POP REG POP SREG POP memory

    REG: AX, BX, CX, DX, DI, SI, BP, SP.

    SREG: DS, ES, SS, ( CS). memory: [BX], [BX+SI+7], 16 bit , ...

    PUSH POP 16byte! : PUSH 80186 !

    LIFO ( ) . PUSH :

  • 37

    1, 2, 3, 4, 5

    5, 4, 3, 2, 1.

    PUSH POP , , ( 0000h) .

    PUSH POP . :

    ( PUSH) . . ( POP) .

    :

    ORG 100h

    MOV AX, 1234h PUSH AX ; AX .

    MOV AX, 5678h ; AX .

    POP AX ; AX AX .

    RET

    END

  • 38

    . :

    ORG 100h

    MOV AX, 1212h ; 1212h AX . MOV BX, 3434h ; 3434h BX .

    PUSH AX ; AX . PUSH BX ; BX .

    POP AX ; AX . POP BX ; BX .

    RET

    END

    LIFO , PUSH 1212h 3434h , POP 3434h 1212h .

    SS( ) SP( ) . .

    "PUSH " :

    2 SP .

    SS:SP .

    "POP " :

    SS:SP .

    2 SP .

    SS:SP . COM , 0FFFEh . SS:0FFFEh RET . emu8086 click [Stack] . "

  • 39

    ( 10)

    , . , . . , . Emu8086.inc . . :

    MACRO [,...]

    ENDM

    , . :

    MyMacro MACRO p1, p2, p3

    MOV AX, p1 MOV BX, p2 MOV CX, p3

    ENDM

    ORG 100h

    MyMacro 1, 2, 3

    MyMacro 4, 5, DX

    RET

    :

    MOV AX, 00001h MOV BX, 00002h MOV CX, 00003h MOV AX, 00004h MOV BX, 00005h MOV CX, DX

  • 40

    :

    CALL . :

    CALL MyProc

    . :

    MyMacro

    100 , . RET . . CALL 3byte , , .

    . 100 , 100 , , .

    .

    , . :

    MyMacro 1, 2, 3

    ENDM .

    , ENDP .

    , " " 2 . , LOCAL , . :

    MyMacro2 MACRO

    LOCAL label1, label2

    CMP AX, 2 JE label1 CMP AX, 3

    JE label2

  • 41

    label1:

    INC AX

    label2:

    ADD AX, 2

    ENDM ORG 100h

    MyMacro2

    MyMacro2

    RET

    , . Inc INCLUDE file-name . - emu8086.inc

  • 42