Fig. 1.1. Suprapunerea in timp a etapelor de extragere si executie a instructiunilor procesorului [603554]

Fig. 1.1. Suprapunerea in timp a etapelor de extragere si executie a instructiunilor procesorului
8086

Fig. 1.2. 8086 — schema bloc

Fig 1.3

Tabelul 1.1. Utilizarea implicita a registrelor de uz general

Fig. 1.4

Fig. 1.5. Indicatorii de con ditii

Fig. 1.6. Organizarea memoriei — Memorarea variabilelor si instructiunilor

Valoarea variabilei word VALOAREA POINTERULUI STOCAT LA 4H:
memorata la 246H este 8C04H ADRESA BAZA SEGMENT:3B4CH
OFFSET:65H
Fig. 1.7. Memorarea variabilelor de t ip word si pointer

Fig. 1.8. Alocarea segmentelor in memoria fizica

Fig. 1.9. Segmentele adresabile in mod curent

Fig. 1.10. Adresa fizica si adrese logice

Fig. 1.11.

Tabelul 1.2. Sursele de adresa logica

Fig. 1.12. Relocatarea dinamica a programelor

Fig. 1.13. Operatii cu stiva

Fig. 1.14. Spatiul de memorie si I/E cu precizarea "locatiilor speciale"

Fig. 1.15. Sursele de intrerupere

Fig. 1.16. Secventa de raspuns la intrerupere

Fig. 1.17. Directionarea catre rutina de trata re a intreruperii prin intermediul tabelei vectorilor
de intrerupere

Fig. 1.18. Schema bloc si configuratia pinilor circuitului INTEL 8259A

Fig. 1.19. Secventa de recunoastere a intreruperii INTR

Tabelul 1.3. Octetul vectorului de intrerupere

nume SEGMENT [tip_aliniere] [tip_combinare] ['nume_clasa']


nume ENDS
Cod 3.1

DAT1 SEGMEMT BYTE
X1 db 7 dup (?)
DAT1 ENDS
DAT2 SEGMENT WORD
x21 dw 300 dup (?)
x22 dw ?
DAT2 ENDS
DAT3 SEGMENT PARA
x3 db 5 dup (?)
DAT3 ENDS
Cod 3.2

stiva SEGMENT STACK
db 256 dup (?)
stiva_sp label WORD
stiva ENDS
cod SEGMENT
mov ax, stiva
mov ss, ax
mov sp, OFFSET stiva_sp
cod ENDS
Cod 3.3

INT_TABLE SEGMEMT AT 0
dd PROC_NIV_0
dd PROC_NIV_1


INT_TABLE ENDS
Cod 3.4

dseg1 SEGMENT PARA PUBLIC ' data'
db 100 dup (?)
dseg1 ENDS
dseg2 SEGMENT PARA COMMON
db 50 dup (?)
dseg2 ENDS
cseg SEGMENT PARA PUBLIC 'code'
db 20 dup (?)
cseg ENDS
Cod 3.5

dseg1 SEGMENT PARA PUBLIC 'data'
db 30 dup (?)
dseg1 ENDS
dseg2 SEGM ENT PARA COMMON
db 200 dup (?)
dseg2 ENDS
cseg SEGMENT PARA PUBLIC 'code'
db 70 dup (?)
cseg ENDS
Cod 3.6

Figura 3.1 Combinarea segmentelor este controlată de directiva SEGMENT

ASSUME reg_seg:expresie, …
Cod 3.7

ASSUME CS:CSEG, DS:DSEG1, ES:DS EG2, SS:SSEG
Cod 3.8

dseg SEGMENT
BETA dw 5
dseg ENDS
cseg SEGMENT
ASSUME cs:cseg, es:dseg
mov ax, dseg
mov es, ax
mov bx, BETA ; se va genera o instructiune MOV,
; cu adresare prin registrul ES
; conform asocierii ES:dseg
cseg ENDS
Cod 3.9

nume_grup GROUP nume_seg1, nume_seg2, …
Cod 3.10

d1 SEGMENT
y dw 20
d1 ENDS
d2 SEGMENT
x db 2
d2 ENDS
data GROUP d1, d2
Cod 3.11

mov ax, data
mov ds, ax
mov ax, OFFSET x
mov ax, OFFSET data:x
Cod 3.12

ASSUME ds:data
Cod 3.13

ASSUME cs:TEXT, ds:DGROUP, ss:DGROUP
Cod 3.14

ASSUME cs:nume_TEXT, ds:DGROUP, ss:DGROUP
; nume este numele din directiva .code
; sau numele fișierului sursa
Cod 3.15

ASSUME cs:DGROUP, ds:DGROUP, ss :DGROUP
Cod 3.16

.model large
.data
.const
.stack 256
.data?
.fardata
.fardata?
.code
end
Cod 3.17

SymbolName Type Value
??DATE Text "06/02/96"
??FILENAME Text "exemplu"
??TIME Text "15:21:50"
??VERSIOM Number 0200
@CODE Text EXEMPLU_TEXT
@CODESIZE Text 1
@CPU Text 0101H
@CURSEG Text EXEMPLU_TEXT
@DATA Text DGROUP
@DATASIZE Text 1
@FARDATA Text FAR_DATA
@FARDATA? Text FAR_BSS
@FILENAME Text EXEMPLU
@MODEL Text 5
@WORDSIZE Text 2

Groups & Segments Bit Size Align Combine Class
DGROUP Group
CONST 16 0000 Word Public DATA

STACK 16 0100 Para Stack STACK
_BSS 16 0000 Word Public BSS
_DATA 16 0000 Word Public DATA
EXEMPLU_TEXT 16 0000 Word Public CODE
FAR_BSS 16 0000 Para none FAR_BSS
FAR_DATA 16 0000 Para none FAR_DATA
Fișier Listing

mov ax, dgroup
mov ds, ax
mov es, ax
Cod 3.18

PUBLIC nume, nume, …
Cod 3.19

EXTRN nume:tip, nume:tip, …
Cod 3.20

; Modul M1.ASM
;
.model large
extrn var1:word, output:far
public var2
.data
var2 dw 7
.code
start:
mov ax, dgroup
mov ds, ax
add var1, 3
call output
end start

; Modul M2.ASM
;
.model large
public varl, output
extrn var2:word
.data
var 1 dw5
.code
output proc far
add var2, 1
retf
output endp
end
Cod 3.2 1

mov ax, SEG var1
mov es, ax
add es:var1, 3
Cod 3.22

END [punct_de_start]
Cod 3.23

.data ; $ = 0
db 5 dup(?)
; $ = 5
.code
; $ = 0
.data
db 7 ; $ = 5
Cod 3.24

TAB dw 1, 2, 3, 4, 5, 6, 7, 8, 9
LNG dw ($ – TAB)/2
Cod 3.25

JMP $ ; Ciclu infinit: $ este chiar adresa
; instructiunii JMP
JMP $ + 5 ; salt relativ
Cod 3.26

ORG expresie
Cod 3.27

ORG $ + 5 ; Sare 5 octeti la asamblare
ORG 100H ; Asambleaza la offset -ul absolut 100H
Cod 3.28

nume EQU expresie
Cod 3.29

CR EQU 0DH
LF EQU 0AH
Cod 3.30

nume directiva lista_de_valori
Cod 3.31

var_a db 2 dup (0, 3 dup (1))
var_b db 1, 2, 3, ?, ?, ?
adr_n dw var_a
adr_f dd var_b
Cod 3.32

var_a db 0, 1, 1, 1, 0, 1, 1, 1
Cod 3.33

B dw 10 dup(?)
Cod 3.34

mov ax, B[1]
Cod 3.35

lea bx, B
inc byte ptr [bx][4]
inc word ptr [bx][4]
Cod 3.36

nume LABEL tip
Cod 3.37

ALFAB label BYTE
ALFAW dw 1234H
Cod 3.38

adr_proc label dword
proc_off dw ?
proc_seg dw ?
Cod 3.39

nume_structura STRUC


nume_membru definitie_date


nume_structura ENDS
Cod 3.40

ALFA STRUC
a db ?
b dw 1111H
c dd 1234
d db ?
ALFA ENDS
Cod 3.41

x ALFA <, , ,777, 5>
Cod 3.42

a db ?
b dw 1111H
c dd 777
d db 5
Cod 3.43

mov si, x.b
Cod 3.44

y ALFA 5 dup <, , , 10>
Cod 3.45

mov al, y[SI*TYPE ALFA].d
Cod 3.46

PERSOANA STRUC
NUME db 30 dup (?)
PRENUME db 20 dup (?)
COD dd ?
PERSOANA ENDS
Cod 3.47

.data
om PERSOANA <'Ionescu', 'Ion', 77206>
adr_om dd om ; Pointer la om
.code
les di, adr_om
call PRELUCRARE
Cod 3.48

lea bx, e s:[di].PRENUME
Cod 3.49

mov ax, word ptr es:[di].COD
mov dx, word ptr es:[di].COD + 2
Cod 3.50

mov ax, word ptr es:[di + 50]
mov dx, word ptr es:[di + 52]
Cod 3.51

nume_inregistrare RECORD nume_camp:valoare, …
Cod 3.52

nume RECORD nume_camp:valoare = expresie, …
Cod 3.53

BETA record X:7, Y:4, Z:5
Cod 3.54

Figura 3.2 Definiția unei înregistrări

VAL BETA <5, 2, 7>
Cod 3.55

VAL dw 0000101001000111B
Cod 3.56

AND AX, MASK Y ; Filtreaza campul Y
AND BX, NOT MASK Z ; Forteaza campul Z la 0
Cod 3.57

MOV AL, WIDTH BETA ; AL < – 16
MOV BL, WIDTH Y ; BL < – 4
Cod 3.58

MOV AX, VAL ; Preluare inregistrare
AND AX, MASK Y ; Selectare camp Y
MOV CL, WIDTH Y ; Incarcare in CL a valorii 4
SHR AX, CL ; Deplasare cam p Y la dreapta
Cod 3.59

mov ax, 1 SHL 3 ; 1 deplasat la stanga cu 3 biti
Cod 3.60

mov ax, 100B
Cod 3.61

COUNT dw ($ – TAB)/2
Cod 3.62

and al, (1 SHL 3 ) OR (1 SHL 5)
Cod 3.63

x db 1 EQ 2
y dw 1 NE 2
z dd 1 LT 2
Cod 3.64

N EQU 1
N EQU 2
Cod 3.6 5

N = 1
N = 2
Cod 3.66

mov ax, SEG var
mov ds, ax
Cod 3.67

mov bx, OFFSET var
Cod 3.68

THIS tip
Cod 3.69

ALFA EQU THIS WORD
Cod 3.70

ALFA LABEL WORD
Cod 3.71

A DW 100 dup (?)
Cod 3.72

SIZE var = (LENGTH var) * (TYPE var)
Cod 3.73

.data
TAB dd 10 0 dup (?)
.code
mov cx, LENGTH TAB
lea si, TAB
bucla:
….
add si, TYPE TAB
loop bucla
Cod 3.74

PERSOANA STRUC
. . . . .
PERSOANA ENDS
.data
TAB PERSOAN A 50 dup <,,,>
Cod 3.75

add word ptr [bx], 2
call dword ptr [bx]
call near ptr proc
Cod 3.76

IF expresia



[ELSE]



ENDIF
Cod 3.77

FALSE equ 0
TRUE equ NOT FALSE
DATE_MARI equ TRUE
DATE_MICI equ NOT DATE_MARI
.data
X dw 100 dup (?)
IF DATE_MARI
ADR_X dd X
ELSE
ADR_X dw X
ENDIF
.code
IF DATE_MARI
lds si, ADR _X
ELSE
mov si, ADR_X
ENDIF
;
; Prelucrare TABLOU
;
Cod 3.78

FALSE equ 0
TRUE equ NOT FALSE
SUM_B equ TRUE
SUM_W egu NOT SUM_B
.code
if SUM_B
mov cx, SIZE A ; Numar de iteratii
else
mov cx, (SIZE A)/2
endif
xor bx, bx ; Indice initial
mov ax, bx ; Suma initiala
bucla:
if SUM_B
add al, byte ptr A [bx] ; Suma pe octet
inc bx ; Actualizare adresa
else
add ax, word ptr A [bx] ; Suma pe cuvant
inc bx ; Actualizare adresa
inc bx
endif
loop bucla ; Bucla

if SUM_W AND (TYPE A EQ 1) AND ((SIZE A) MOD 2) EQ 1
push ax
mov al, byte ptr A [bx] ; Un eventual
cbw ; ultim

mov dx, ax ; octet
pop ax
add ax, dx
endif
Cod 3.79

nume_macro MACRO
;
; Corp macroinstructiune
;
ENDM
Cod 3.80

init_ds_es macro
mov ax, DGROUP
mov ds, ax
mov es, ax
endm
Cod 3.81

exit_dos macro
mov ax, 4C00H
int 21H
endm
Cod 3.82

save macro rest macro
push ax pop di
push bx pop si
push cx pop dx
push dx pop cx
push si pop bx
push di pop ax
endm endm
Cod 3.83

PROCEDURA proc near
save


rest
ret
PROCEDURA endp
Cod 3.84

nume_macro MACRO P1, P2, …, Pn
;
; Corp macroinstructiune
;
ENDM
Cod 3.85

nume_mac ro X1, X2, …, Xn
Cod 3.86

dosint macro N
mov ah, N
int 21H
endm
Cod 3.87

dosint 2
Cod 3.88

o_read macro fname, hand
mov al, 0C0H
lea dx, fname
dosint 3DH
mov hand, ax
endm
Cod 3.89

f_read macro hand, buf, nr
mov bx, hand
mov cx, nr
lea dx, buf
dosint 3FH
endm
Cod 3.90

f_close macro hand
mov bx, hand
dosint 3EH
endm
Cod 3.91

.model large
include io.h
.stack 1024
.data
file_name db 30 dup (0) ; Spatiu nume fisier
hand dw 7 ; Spatiu handler
buf db 1024 dup (? ); Buffer citire
.code
start:
init_ds_es
putsi <'Nume fisier: '> ; Mesaj
gets file_name ; Citire nume
o_read file_name, hand ; Deschidere
jc eroare ; Eroare deschidere ?
bucla:
f_read hand, buf, 1024 ; Citire 1024 octeti
jc eroare ; Eroare citire
mov si, ax ; AX = cati octeti s -au
mov byte ptr buf [si], 0 ; citit de fapt
puts buf ; Afi sare la consola
cmp ax, 1024 ; S -au citit mai putin
jb gata ; de 1024 ?
jmp bucla ; Nu, reluare
gata:
f_close hand ; Inchidere
jmp iesire ; Salt la iesire
eroare:
; Mesaj de
putsi <'Eroare fisier'> ; eroare
iesire:

exit_dos ; Iesire în DOS
end start
Cod 3.92

o_write macro fname, hand
mov al, 0C1H
lea dx, fname
dosint 3DH
mov hand, ax
endm
f_write macro hand, buf, nr
mov bx, hand
mov cx, nr
lea dx, buf
dosint 40H
endm
Cod 3.93

trans macro X, Y
push ax
push bx
mov bx, X
mov ax, Y
mov X, ax
mov Y, bx
pop bx
pop ax
endm
Cod 3.94

trans AX, SI ; Interschimba AX cu SI (oare ?)
Cod 3.95

push ax
push bx
mov bx, AX
mov ax, SI
mov AX, ax
mov SI, bx
pop bx
pop ax
Cod 3.96

trans SP, DI ; Interschimba SP cu DI (oare ?)
Cod 3.97

push ax
push bx
mov bx, SP
mov ax, DI
mov SP, ax ; Aici se modifica SP
mov DI, bx ; si POP -urile
pop bx ; sunt
pop ax ; compromise
Cod 3.98

puts macro X
push si
lea si, X
call puts_proc
pop si
endm
Cod 3.99

.data
STRING db "abcdefghijklmnopqrstuvwxyz", 0
Cod 3.100

.code
puts STRING ; Adresare directa
lea bx, STRING
puts [bx] ; Adresare indirecta
Cod 3.101

eroare macro text
%OUT text ;; Mesaj la consola
.err ;; Fortare er oare la
;; asamblare
endm
Cod 3.102

puts macro X, IN_PLUS
ifb <X>
eroare <PUTS – lipsa parametru>
exitm
endif
ifnb <IN_PLUS>
eroare <PUTS – parametri in plus>
exitm
endif
lea si, X
call puts_proc
endm
Cod 3.103

.data
sir db 10 dup (0)
.code
puts [si]
puts [bx] [si]
puts [bx],[si]
puts
puts [bx],sir
puts sir
end
Cod 3.104
PUTS – parametri in plus
PUTS – parametri in plus
PUTS – lipsa parametru
PUTS – parametri in plus
**Error** t_macro.asm(26) EROARE(2) User generated error
**Error** t_macr o.asm(27) EROARE(2) User generated error
**Error** t_macro.asm(28) EROARE(2) User generated error
**Error** t_macro.asm(29) EROARE(2) User generated error
Cod 3.105

LOCAL simb_1, simb_2, …
Cod 3.106

test_local macro
local aici
jmp aici
aici:
endm
Cod 3.107

.code
.xall
test_local
test_local
test_local
end
Cod 3.108

test_local
jmp ??0000
??0000:
test_local
jmp ??0001
??0001:
test_local
jmp ??0002
??0002:
Cod 3.109

m_mesaj macro
db 'Mesaj ', '0'+n, 0
n = n + 1
endm
Cod 3.110

n = i
.data
m_mesaj
m_mesaj
m_mesaj
Cod 3.111

db 'Mesaj ', '0' + 1, 0
db 'Mesaj ', '0' + 2, 0
db 'Mesaj ', '0' + 3, 0
Cod 3.112

db 'Mesaj 1', 0
db 'Mesaj 2', 0
db 'Mesaj 3', 0
Cod 3.113

rept n
;
; Corp macroinstructiune
;
endm
Cod 3.114

rept 3
m_mesaj
endm
Cod 3.115

n = 0
alfabet label byte
rept 26
db 'A'+ n
n = n + 1
endm
Cod 3.116

irp p_formal, <lista_par_act>
;
; Corp macroinstructiune
;
endm
Cod 3.117

irp x, <'a', 'b', 'c'>
db x
endm
Cod 3.118

db 'a'
db 'b'
db 'c'
Cod 3.119

mesaj_1 db 'Text 1', 0
mesaj_2 db 'Text 2', 0
mesaj_3 db 'Text 3', 0
mesaj_4 db 'Text 4', 0
Cod 3.120

irp x, < 1, 2, 3, 4 >
mesaj_x db 'Text x', 0
endm
Cod 3.1 21

irp x, < 1, 2, 3, 4 >
mesaj_&x db 'Text &x', 0
endm
Cod 3.122

genereaza macro fix, n
x = 1
rept n
fix&&x db 'Text &x', 0
x = x + 1
endm
endm
Cod 3.123

genereaza mesaj_ , 4
Cod 3.124

init macro x
irp y, <x>
db y
endm
endm
Cod 3.125

init <'A', 'B', 'C', 'D'>
Cod 3.126

err_gen macro N, X
err_&N db 'Eroare &N : &X', 0
endm
Cod 3.127

err_gen 23, <Parametr u ilegal>
Cod 3.128

err_23 db 'Eroare 23 : Parametru ilegal', 0
Cod 3.129

err_gen 24, <par_1 !> par_2>
Cod 3.130

err_24 24, 'Eroare 24 : par_1 > par_2', 0
Cod 3.131

def macro a, b
db '&a', 0
db '&b', 0
endm
Cod 3.132

alfa equ 100
beta equ 200
def <alf a + beta>, %(alfa + beta)
Cod 3.133

db 'alfa + beta', 0
db '300', 0
Cod 3.134

push_all_1 macro r1, r2, r3, r4, r5, r6
ifnb r1
push r1
push_all_1 r2, r3, r4, r5, r6
endif
endm
Cod 3.135

push_all_1 ax, bx, cx, dx
Cod 3.136

push_all_2 macro X
irp y, <x>
push y
endm
endm
Cod 3.137

push_all_2 <ax, bx, cx, dx>
Cod 3.138

m_shr ax, 5
Cod 3.139

mov cl, 5
shr ax, cl
Cod 3.140

m_shr bx, 3
Cod 3.141

shr bx, 1
shr bx, 1
shr bx, 1
Cod 3.142

gen macro operation
m_&operation macro operand, nr
if nr lt 4
rept nr
operation operand, 1
endm
else
mov cl, nr
operation operand, cl
endif
endm
endm
Cod 3.143

gen shl
Cod 3.144

m_shl macro operand, nr
if nr lt 4
rept nr
shl operand, 1
endm
else
mov cl, nr
shl operand, cl
endif
endm
Cod 3.145

irp X, <RO, RC, SH, SA>
irp Y, <R, L>
gen X&&Y
endm
endm
Cod 3.146

macsub macro
local gata
call subr
jmp gata
subr proc near
;
; Corpul macroinstructiunii

;
ret
subr endp
gata:
macsub macro
call subr
endm
endm
Cod 3.147

call subr
jmp ??0000
subr proc near
;
; Corp macroinstructiune
;
ret
subr endp
??0000:
Cod 3.148

call subr
Cod 3.14 9

putsi <'Acesta este un mesaj la consola'>
Cod 3.150

putsi macro X
local string
.data
string db X, 0
.code
push si
lea si, string
call puts_proc
pop si
endm
Cod 3.151

putsi <'Acesta este un mesaj la consola'>
Cod 3.152

.data
??0001 db 'Acesta este un mesaj la consola', 0
.code
push si
lea si, ??0001
call puts_proc
pop si
Cod 3.153

geti macro
local string
.data
buffer db 8 dup (0)
.code
push si
lea si, buf
mov cx, 7
call gets_pro c
lea si, buf
call atoi_proc
pop si
endm
Cod 3.154

Similar Posts