assembly.8086.for.beginners.greek
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