Ú-1 |
Styk
mikropočítača s prostredím |
µ |
Mikroprocesor
s pohľadu programátora |
|
µ
|
Podpora
adresovania |
|
µ
|
Adresovanie
pamäti |
µ |
Debugger |
|
µ
|
Použitie
debuggera pri ladení programu |
|
µ
|
Niektoré často
používané inštrukcie |

Základné údaje o
mikroprocesore
sú v programoch:
FHelpPC
- obsahuje okrem iného:
-
Prehľad inštrukcii assemblera
mikroprocesora 80x86.
-
Základné údaje o samotnom procesore.
-
Prehľad preušení INT.
-
Základné údaje o hardware.
-
Základné údaje o BIOS a DOS
parametroch.
FTechHelp
- obsahuje okrem iného:
-
Informácie o DOS
-
Po stlačení F6 má množstvo informácii
o parametroch
BIOS .
F Inštrukčný súbor
mikroprocesora Intel 8086
FĎalšia
literatúra, ktorá bola spomenutá v úvode.

µ |
Mikroprocesor
s pohľadu programátora |
Pre programátora sú najdôležitejšou
súčasťou mikroprocesora
registre, ktorých obsah možno programovo ovplyvňovať. Z hľadiska
objasnenie
principu činnosti je vhodný model procesora 8086 s jeho 16 bitovými
registrami,
ktoré možno rozdeliť na :
µ Univerzálne
registre AX, BX, CX, DX,
slúžiace
ako prechodná pamäť namiesto operačnej pamäti, na skrátenie prenosu
dát.
Každý z registrov 8086 má oddelený prístup k hornej 8 bitovej
časti
AH, k dolnej časti AL a aj celkove k AX, ako 16 bit registru. U novšich
32 bit procesorov je prístup k celému 32 bit registru umožnený pomocou
označenia s E, napríklad: EAX. Použitie týchto registrov môže byť
ľubovoľné,
v mnohých inštrukciach však implicitné.
-
AX - hlavný register
(akumulátor )
používaný pri aritmetických a logických operáciach na uloženie jedného
z operandov, poprípade aj výsleku.
-
BX - (nepriama adresa -
base) register
používaný ako ukazovateľ prístupu k rôznym blokom údajov a tabuľkám v
pamäti.
-
CX - (count) register
používaný ako
počítadlo prechodov cez sľučku a počítadlo opakovaní prenosu dát, počet
iterácii.
-
DX - (data ) register
používaný pri
ukladaní dát a tiež špecialne, napríklad pri delení sa do neho ukladá
zvyšok
delenia operandu uloženého v AX., resp. na uloženie adresy I/O
zariadenia.
µ Segmentové
registre CS, DS, ES, SS,
pomocou
ktorých možno v rôznych oblastiach pamäte lokalizovať oblasť
pamäte pre dáta, zásobník, vlastný kód programu a pod.
-
CS - (Code) segment,
ktorý určuje oblasť
pamäti, kde sú uložé inštrukcie alebo kód programu, ktorý sa má
aktuálne
vykonať.
-
DS, ES - (Data, Extra)
segmenty, pomocou
ktorých sa adresujú dáta (premenné) používané v programe. ES nemá
presné
implicitné určenie.
-
SS - (Stack) zásobník,
fungujúci ako
pamäť typu LIFO.
µ Registre
pre relatívny posuv (offset) IP, SP, BP, SI, DI:
-
IP - (Instruction Pointer
), register
slúžiaci ako programové počítadlo, ktoré obsahuje adresu aktuálne
vykonávanej
inštrukcie (relatívny posun voči segmentovej adrese.).
-
SP, BP - (Stack, Base
Pointer) registre,
pomocou ktorých sa uskutočňuje posuv v zásobníku. Program zriedka mení
obsah registra SP, namiesto toho používa register BP. Použitie registra
BP obdobné použitou registra BX.
-
SI, DI - (Source,
Destination ) index
registre, slúžiace ako všeobecný prostriedok na nepriame adresovanie
dát.
Tiež sa používajú pri presune a pri porovnávaní blokov dát.
µRegister
príznakov alebo indikátorov (Flag register ) - ktorý tvorí súbor
individuálnych
stavových a ovládacich bitov. Príznakové
bity pomáhajú určiť aktuálny stav procesora. Flagový bit je
nastavený
ak má logickú hodnotu 1.
V modernejšich 32 a viacej bitových
variantoch
procesora 80x86 sa používajú viac ako 16 bitové registre, vyskytujú sa
ďalšie segmentové registre, napríklad FS, GS a pre prácu procesora v
chránenom
móde je určená ďalšia skupina systémových a ladiacich registrov. Tiež
register
príznakov je rozšírený o signalizáciu módu v ktorom operuje CPU a o
signalizáciu
vnorenia tásku.

u
Programátorský model mikroprocesora
AX=>
|
AH
|
AL
|
<-akumulátor |
SP
|
<-ukazovateť
zásobníka |
BX=>
|
BH
|
BL
|
<-
báza |
BP
|
<-ukazovateľ
bázy |
CX=>
|
CH
|
CL
|
<-
počítadlo |
SI
|
<index
pre zdrojový
opernad |
DX=>
|
DH
|
DL
|
<-
dáta |
DI
|
<-index
pre cieľový
operand |
IP
|
počítadlo
inštrukcii |
CS
|
kódový
segment register |
Flag
|
register
príznakov |
DS
|
dátový
segment register |
|
|
SS
|
zásobníkový
segment register |
|
|
ES
|
alternatívny
dátový segment
register |

u
Princíp segmenovania pamäti:
 |
Obr. 1. Použitie segmentových
registrov pri adresovaní
pamäte. |

µ
Podpora adresovania
Okrem už spomenutej funkcia registra ako
bufera
(prechodnej vyrovnávacej pamäte) slúžia registre na adresovanie
prístupu do pamäte. Ich funkciu možno ozrejmiť nasledovnými príkladmi,
v ktorých sa na vytvorenie adresy v reálnom modeprocesora
8086 používa kombinácia obsahu rôzneho počtu komponentov:
-
bázových registrov (BX, BP),
-
indexových registrov (SI, DI)
-
priamej hodnoty relatívneho posunutia
disp (displacement),
ktoré môžu byť súčasťou samotnej inštrikcie.
(Z hľadiska syntaxe inštrukcii assembler
nerozlišuje
malé a veľké písmená, takže rovnakú funkciu má inštrukcia mov AX, BX
ako
Mov AX, bx alebo MOV ax,BX a pod. - to má služiť ako ospravedlnenie
mojej
neporiadnosti a nesystematičnosti pri zápise inštrukcii.) Obsah
registra
môže byť interpretovaný ako :
|
Napríklad: |
Mov |
AH,
operand |
|
|
Mov |
DS:[101],
value |

-
2. Priama adresa. Implicitne
sa používa priradenie
nasledujúcich segmentov: bázových a indexových registrov.
|
SS:SP |
|
SS:BP |
|
|
DS:BX |
|
DS:SI |
DS:DI |
|
SS:BP+
kombinácia ( SI,
DI) |
|
|
|
|
DS:BX+
kombinácia ( SI,
DI) |
|
|
|
|
Niekedy je
vhodnejšie použiť iné priradenie segmentového a bázového registra
pomocou
(Atribute Overide), vztiahnuté na: |
|
a.
|
segment, namiesto
impicitného DS:BX |
|
napríklad: |
Mov AX, CS:[BX], |
|
|
Mov AX, CS:[adresa] |
|
b.
|
data,
pri zmene typu dát pomocou PTR. Napr: ak je bdef = 0FFH deklarované ako
slovo možno sa k nemu obracať pomocou vhodne zadefinovaného ukazovateľa
(byte pointra) ako k 2 bajtom |
|
|
Bdef |
DW |
0FFH |
|
|
Mov |
AL, byte
ptr |
;bdef |
|
|
Mov |
AH, byte
ptr |
;bdef+1 |

-
3. Bázová adresa.
- efektívna
adresa je súčtom hodnoty určenej bázovým registrom (BX alebo BP) a
relatívneho
posunutia disp.
|
Napríklad: |
mov |
AH,
[BP+disp] |
|
|
mov |
DX,
[BX+disp] |

-
4. Indexovaná
adresa. - efektívna
adresa je súčtom hodnoty určenej indexovým registrom (SI alebo DI) a
relatívneho
posunutia disp.
|
Napríklad: |
mov |
AH,
[disp +SI]=> iný zápis |
mov AH,
disp [SI] |

-
5. Kombinovaná
adresa - (báza +
index).
|
Napríklad: |
mov |
AH,
[BX][DI] => iný zápis |
mov AH,
[BP + DI] |

-
6. Kombinovaná
adresa - (posunutie+báza
+index).
|
Napríklad: |
mov AH,
[disp+BX+DI] |
=>
alebo iný zápis |
|
|
mov AH, disp[BX][DI] |
|

-
7. Adresovanie
reťazcov -implicitne
sa vo vybraných inštrukciach predpokladá, že zdrojový blok reťazcov je
adresovaný pomocou DS: [SI] a cieľový blok reťazcov pomocou ES:[DI] .

µAdresovanie
pamäti
Z historických príčín, pretože procesor
8086 používal
16 bitové registre, ktoré nepostačovali na
priame fyzické vytvorenie 20 bitovej adresy, potrebnej na pre
priame
adresovanie 1 MB pamäte počítača IBMPC XT, použilili IBM a MS na
adresovanie
pamäte PC XT spôsob, v ktorom sa prístup k pamäťovým objektom
zabezpečuje
tak, že sa kód programu a dáta rozdelia do segmentov. Adresovaný
priestor
je pri tom rozdelený na segmenty, ktoré sú schopné obsiahnuť určitý
rozsah
adries pamäti (v závislosti od veľkosti segmentového registra).

Fyzická adresa
pri
tomto spôsobe je zložená z dvoch častí:
-
segmentu , ktorý určuje
hrubo lokalitu
v pamäti;
-
relatívneho posunutia ( offset,co
je
vlastne efektívna adresa ).
Segment zodpovedá za adresu horných bitov
adresy,
lebo pri určovaní fyzickej adresy sa hodnota adresy v segmentovom
registre
(napríklad CS) sa posúva o 4 bit vľavo , teda násobí sa 16. K tejto
adrese
sa potom pripočíta offset (napríklad z registra IP). Napríklad ak je
adresa
CS:IP = 1234:4321 bude výsledná fyzická adresa 12340+4321= 16661, už
bude
bude tvorená 20 bitovým číslom. Z hľadiska výslednej fyzickej adresy
buňky
16661H predstavuje vyššie uvedený zápis a zápis napríklad 1666:0001
alebo
1665:0011H a pod. rovnakú fyzickú adresu.
|
Príklad určenia
výslednej fyzickej adresy FFFF:0000H = F0000:FFF0H: |
|
segment: |
FFFF0H |
F0000H |
|
offset |
+0000H |
+FFF0H |
|
fyzicky: |
FFFF0H |
FFFF0H |

Segmentový register, ktorý
má byť
použitý k výpočtu fyzickej adresy môže byť implicitne priradený
(napríklad
ako CS pre program, DS pre dáta), alebo musí byť uvedený v kóde
inštrukcie
(tvorí tzv. prefix inštrukcie, napríklad v tvare
ES:inštrukcia).
Častejšie však nie je špecialne uvedený a potom platí implicitné
priradenie
registrov:
|
CS
|
- s IP
pre kód programu |
|
SS
|
- so
zásobníkom, do ktorého
prístup cez SP alebo BP |
|
ES
|
- s
reťazcami |
|
DS
|
- s
dátami |

V chránenom móde
(protected mode)
procesorov 80286,
resp v rozšírenom móde ( enhanced mode) procesorov
vyššieho
typu ako 80386
, sa vytvára adresa s pomocou tabuľky segmentových deskriptor .(V
rozšírenom móde možno prepínať procesor z realneho do chráneného módu a
späť bez nutnosti resetovania procesora). Napríklad v adrese
segmentového
tvaru 0038:4321H určuje obsah adresy 0038 tzv. selektor (16bit),
ktorý slúži ako index do tabuľky segmentových
deskriptorov a 4321H
tvorí offset (32 bit ), ktorý má rovnakú funkciu ako pri adresovaní v
reálnom
móde. V tabuľke segmentových deskriptorov sa nachádza tzv. virtuálna
adresa ( 48 bit ), ktorú tvorí základná adresa segmentu, ktorá
sa použije na určenie fyzickej adresy (napríklad 00012340H ) a tiež aj
ďalšie parametre ako hranice veľkosti pridelenéj pamäti a prístupové
práva
do tejto pamäti, napríklad pre režim multitaskingu. Každý deskriptor v
tabuľke obsahuje 32 bitovú základnú adresu , ku ktorej sa pripočíta
offset
(32 bit v 80386) a vytvorí sa tak fyzická adresa,v
uvedenom príklade zase adresa 00012340H + 4321H = 00016661H V
procesoroch
od 80386, ktoré majú 32 bitové a väčšie registre, sa väčšinou nevyužíva
lineárny priestor 32 bit zbernice, ktorý poskytuje efektívna
adresa
samotného offsetu, ktorá umožňuje vytvoriť fyzickú adresu pre 232
= 4GB buniek pamäte, ale sa používa virtuálna pamäť dostupná pomocou logickej
adresy, tvorenej pomocou selektrora + offsetu, v dôsledku čoho
je adresný priestor virtuálnej pamäte až 16kB*4GB = 64 T MB.

Debager (Debbuger) - program na
odlaďovanie a
kontrolu programu. Môže tiež poslužiť na tvorbu jednoduchých programov
v assembleri - typu subor.com. Najrozširenejší variant debagera
debugg.exe
je súčasťou každého MS DOS. Samozrejme existuje veľa ďalšich variantov
odlaďovacích programov s prijemnejším prostredím, napríklad Turbo
Debbuger fy Borland a pod.
Popis základných
príkazov (z
DOS programu debugg.exe)
Vďaka tomu, že program debug.com, resp.
debug.exe
tvorí súčasť dodávaného operačného systámu DOS je určite
najdostupnejšim
a možno aj najpoužívanejšim testovacím a odlaďovacím programom.
Samozrejme,
že existujú aj iné podobné programy, spolu s pekným prostredím na
kontrolu
behu programu, napríklad produkt fy Borland Turbodebugger - td.exe.
F |
START
programu: |
|
|
|
debug
=> štart samotného
debuggera. |
|
|
debug
d:\[path] súbor
[.ext] - s aplikáciou. |
FASSEMBLE
v tvare : A[adresa] - umožňuje ukladať
program v jazyku
ASSEMBLERA priamo k zobrazenej adrese na obrazovke.
|
Napríklad: |
- a enter |
|
|
zobrazí
aktuálne cs:ip,
napríklad: 154F:0100 |
|
|
a teraz
treba uložit požadované
inštrukcie,
napríklad jmp 502. |
|
|
Po
stlačení enter |
|
|
sa
nastaví nová adresa
pre inštrukciu atď |
F
COMPARE v tvare : C range address - porovnáva
vyšpecifikovanú
oblasť pamäte od zadanej adresy.
|
Napríklad: |
C 1
00,1FF 300 = |
C
100L100 300 |
|
porovná pamäť
od 100 po 1FFH s obsahom pamäte 300 po 3FFH. |
F
DUMP v tvare : D [range] - vypíše obsah buniek
pamäte
. Napríklad :
|
d cs:100
110 |
zobrazí
od napríklad cs:100
po cs:110 |
|
d |
zobrazí
od aktuálnej adresy
8 riadkov výpisu po 16 byte |
|
d cs:100 |
zobrazí
od cs:100 |
|
d cs:100
L 20 |
zobrazí
20H byte od cs:100 |
|
d ds:100
L 20 |
zobrazí
20H byte od ds:100 |
|
d:4DC9
4DCE |
rovnaký
účinok ako -d:4DC9
L 6 t.j.6 byte |
F
ENTER v tvare : E address [list] - uloži byte do
špecifikovanej
bunky pamäte. Napríklad :
|
e
cs:100 |
zobrazí
cs:100 po ďalšom
zadaní: |
|
12 +
space |
prepíše
aktualny obsah
bunky s 12 a ďalej pokračuje |
|
EB+ enter |
prepíše
aktualny obsah
bunky s 0EB H a koniec |
|
medzerník |
postup
zobrazovania pokračuje
až do stlačenia enter |
F
FILL v tvare : F range list zaplní oblasť pamäte
hodnotami špecifikovanými
ako list. Napríklad :
|
F 04BA:100
L 100 42 45 52 54 41 |
|
Zaplní oblasť
pamäte od 04BA:100 po 04BA:1FF 5 uvedenými znakmi tak, že sa budú
postupne
opakovať |
|
F 100 D000
0 |
zaplni 0
od 100H po D000H |
|
F 100 L 1
0E |
zapíše 1
byte => 0E |
|
|
|
F
GO v tvare : - G[=address [addresses]] vykoná
program
od =adresy po breakpoint adresu. Po zastavení ako po príkaze -R, t.j.
zobrazí
výpis obsahu registgrov. Napríklad :
|
G CS:7550 |
vykoná
program od aktuálnej
adresy až po adresu CS:7550. Po eventuálnom ďalšom G pokračuje
inštrukciou
za Breakpoitom |
|
G=100,110 |
odštartuje
od 100 po 110 |
F
HEX v tvare : H value value vykoná súčet a rozdiel
HEX.
Napríklad :
|
H 19F
10A |
zobrazí
02A9=súčet, 0095
=rozdiel |
F
INPUT v tvare : - I value zobrazí 1 bajt , ktorý
prečítalo
z portu špecifikovaného value. Napríklad :
|
Napríklad:
I 2F8 |
prečíta
bajt z portu=
2F8 |
F
LOAD v tvare : L [address[drive:record record]] - uloží
súbor do pamäti. Predtým treba nastaviťt BX:CX ako počítadlo a
pomenovať
súbor (pomocou N napríklad Nfile.COM).
|
L bez
parametrov |
- uloží
od CS:100 po 100
+ v (BX:CX) počet uložených byte. |
|
L address |
-
ukladanie začína od
adr. Address |
|
L +
všetky param. |
- uloží
namiesto súboru
celý sektor . |
Napríklad: |
L
04BA:100 2 0F 6D |
- uloží
počet záznamov
6DH, počnúc logickým záznamom 0FH do pamäti od adresy 04BA:0100. |
F
QUIT - Q zakončí debugger a
prechod
do MSDOS.
F
MOVE v tvare : M range address presunie obsah z
adresy
špecifikovanej range do oblasti pamäte od address. Napríklad:
|
M CS:100
110 CS:500 |
- presun
z buňky 100 do
500, zo 101 na 501 atď. |
|
M 113 L
6 119 |
- posun
6 bajtov |
|
M F000:0
L 2C B800:0 |
=>
copy na obrazovku 2CH=44
bajtov |
F
NAME v tvare : N filename [filename.] pomenuje
súbor
buď pri jeho uložení pomocou L resp. W alebo pri debuggovaní a
spustení.
Napríklad :
|
C:\DOS\
kkk.com |
pomenuje
súbor kkk.com
v adresári C:\DOS |
F
OUTPUT v tvare : O value byte zašle na port value(
16
bitová adresa) hodnotu byte. Napríklad :
|
O 2FB 4F |
- zašle
4FH do portu 02FBH. |
F
REGISTER v tvare : R [register-name] zobrazí obsah
jedného
alebo viacerých registrov mikroprocesora. Napríklad:
|
R |
- výpis
všetkých registrov. |
|
R
meno_registra |
-
zobrazí obsah a umožní
zmenu
obsahu príslušeho registra. |
Indikátory (Flagy)
aritmeticko
logickej jednotky ALU:
flag
name |
nastavenie |
Nulovanie |
Pretečenie
- Overflow |
OV |
NV |
Smer -
Direction |
DN
decrement |
UP
increment |
Prerušenie
- Interrupt |
EI
ennable |
DI
disable |
Znamienko
- Sign |
NG
negativ |
PL plus |
Nula -
Zero |
ZR |
NZ |
Pomocný
.prenos - Auxilliary
CY |
AC |
NA |
parita -
Parity |
PE Even
párna |
PO Odd
nepárna |
Prenos -
Carry |
CY |
NC |
Pri začatí programu Debbugg sa nastaví
CS na začiatok
voľnej pamäte ,IP = 100H. Všetky flagy sa vynulujú. Všetky registre sa
vynulujú. Napríklad :
|
-RF |
=> |
NV UP DI
NG
NZ AC PE CY |
|
|
|
-
spravím zmenu: PL EI
CY a výsledok: |
|
-RF |
=> |
NV UP EI
PL
NZ AC PE NC - |
FSEARCH
v tvare: S range list - vyhľadá
špecifikovanú postupnosť
bajtov - list of byte (oddelenných medzerou alebo čiarkou) v oblasti
pamäte
range. Napríklad :
|
S CS:100 110
41 |
hľadá
41H od 100H po 110H. |
|
|
ako
výsledok vypíše: napríklad
xxxx:0104 t.j. tu je 41H. |
|
S 100 L 10
"A" |
=>
hľadá A v oblasti 10H=16
bajtov |
F
TRACE v tvare: T [=address][value] - krokuje
od
začiatočnej adresy address, pričom počet vykonaných inštrukcii = počet
krokov a určuje ho value. Po skončení zobrazí registrový výpis.
Napríklad
:
|
T=011A
10 |
-
krokuje od adr. 011AH
10H=16 krokov |
|
|
inštrukcii.CTRL+S
zastaví
rollovanie. |
F
UNASSEMBLE v tvare: U [range] - prekóduje obsahy
buniek
do assemblerovských inštrukcii.
|
U - bez
parametrov |
-
dissasembluje 20H bajtov
od aktuálnej adresy |
Napríklad:
|
U
04BA:100 L 10 |
-
preloži 10H=16 bajtov
od adr=04BA:100 |
|
U
04BA:0100 0108 |
-
preloži od adresy 100
po 108. |
F
WRITE v tvare: W [address [drive:record record]] zapíše
počet bajtov nastavených v počítadle (BX:CX). Začiatočná adresa
zapísaného
súboru.com je CS:100.
|
W |
- zapis
do súboru s menom
vopred zadaným pomocou príkazu N. |
|
W
adresa |
- zapíše
súbor od zadanej
adresy. |
|
|
Pozor,
zápis do absolutných
sektorov disku riskantný. |
Napríklad :
|
W CS:100
1 37 2B |
- zapíše
na disk B (1)
počnúc adresou CS:100. |
|
|
Zapísané
data na disku
začínajú od logického záznamu 37H a pozostávajú z 2BH záznamov. |
CHYBOVÉ HLÁSENIA.
|
BF |
Nesprávny
flag. Pomocou
R prekontrolovať. |
|
BP |
Priveľa
brekpointov. |
|
BR |
Nesprávny
register, t.j.
zlé písmeno. |
|
DF |
Dvojitý
flag. Zadali ste
dvakrát ten istý flag. |
Poznámka:
|
CTRL
+ P alebo
CTRL + < PrtSc> |
zapne/vypne
výpis na tlačiareň. |

µ
Použitie debuggera pri ladení programu
Nasledujúce príklady majú slúžiť na
ilustráciu
rôznych typov inštrukcii mikroprocesora, na ozrejmenie funkcii jeho
rôznych
registrov (predovšetkým univerzálnych, segmentových a zásobníka) a
spôsobov
adresovania (použitie fyzickej a logickej adresy) predovšetkým pomocou
príkazov Debuggera:
-
A - assemble na vkladanie inštrukcii
-
U - unassemble na prekodovanie
binárneho kódu na
tvar inštrikcii assemblera.
-
D - dump na výpis obsahu pamäte v
binárnom tvare.
-
E - na priame modifikovanie obsahu
pamäte.
-
R = register na výpis obsahu registov
-
S - search na hľadanie zadaného kódu.
-
T - trace na krokovanie programu.
Jedným z možných spôsobov prekontrolovania
funkcie
rôznych príkazov assemblera je kontrola už pripravených postupností
inštrukcii
(tak ako je to v nasledujúcich príkladoch) pomocou krokovania programu.
Pred vykonaním príkazu treba do príslušných registrov, resp. do buniek
pamäti uložiť vhodné číselné operandy a po vykonaní príkazu si overiť
výsledok.
Pri výpise pamäťových buniek netreba zabudnúť, že výpis prebieha v
opačnom
poradí, najprv MSB a potom LSB hexadecimálneho 16 bitového čísla. Pri
adresovaní
pamäte používa assembler impicitné spojenie operandu so segmentom DS
(pokiaľ
nie je použitý prefix meniaci tento spôsob). Pri kontrole obsahu
zápisníka
treba mať na zreteli, že ukladanie do zápisnika a tým aj obsah SP sa po
uložení dát zmenšuje.

µPríklady
na demonštrovanie činnosti debuggera
|
hexaritmetika |
|
|
|
-h 3 2 |
|
0005
0001=> súčet
a rozdiel |
|
|
|
-h c000
d000 |
|
9000
F000 => súčet
a rozdiel |
|
---------------------------------------------------------- |
|
Vkladanie
dat(
s medzerou) zakoncit ENTER |
|
-e 100 |
|
19D0:0100
06.11 E6.22
05.33 E8.44 AF.55 |
|
---------------------------------------------------------- |
|
Asemblovanie
- vkladanie instrukcii |
|
-a |
|
19D0:0100
mov ax,11 |
|
19D0:0103
mov dx,22 |
|
19D0:0106
mov bx,33 |
|
19D0:0109
mul bx |
|
19D0:010B
ret |
|
-a |
|
19D0:0100
mov ah,2 |
|
19D0:0102
mov dl,2a |
|
19D0:0104
int 21 |
|
19D0:0106
int 20 |
|
-a |
|
19D0:0108
mov ah,09 |
|
19D0:010A
mov dx,09 |
|
19D0:010D
int 21 |
|
19D0:010F
int 20 |
|
---------------------------------------------------------- |
|
Disassembler
- vypis obsahu |
|
-u 100
106 |
|
19EA:0100
B402 MOV AH,02 |
|
19EA:0102
B22A MOV DL,2A |
|
19EA:0104
CD21 INT 21 |
|
--------------------------------------------------------- |
|
Vypis
obsahu registrov |
|
-r |
|
AX=0000
BX=0000 CX=0006
DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 |
|
DS=19EA
ES=19EA SS=19EA
CS=19EA IP=0100 NV UP EI PL NZ NA PO NC |
|
19EA:0100
B402 MOV AH,02 |
|
---------------------------------------------------------- |
|
Nastavenie
obsahu regCX=6,
t.j. aky dlhý súbor chcem v ďalšom zapisať. |
|
-r cx |
|
CX 0006 |
|
:6 |
|
---------------------------------------------------------- |
|
Pomenovanie
suboru |
|
-n
jano.com |
|
---------------------------------------------------------- |
|
Zápis
súborudo
aktuálneho adresara |
|
-w |
|
Writing
0006 bytes |
|
---------------------------------------------------------- |
|
Koniec |
|
-q |

Beep.com -
demopríklad -
výstup
na obrazovku znaku 07H, ktorý spôsobí 1 beep
1195:0100 B203 MOV
DL, 07 H ; znak
do DL |
1195:0102 B402 MOV
AH, 02 H |
1195:0104 CD21 INT
21 H |

Heart.com -
demopríklad na zaplnenie obrazovky znakom, napríklad 03H. Ďalšie
zaujimavé výplňové znaky B0-B2, F8-FA, OB, 0C, 0E a pod.
Heart.com ;730H=1840D=> |
1195:0100 B93007 MOV
CX, 0730 H
;23 riadkov*80 znakov |
1195:0103
B203 MOV
DL, 03 H ; znak do DL |
1195:0105
B402 MOV
AH, 02 H |
1195:0107
CD21 INT
21 H |
1195:0109
E2FC LOOP
0107 H |
1195:010B
C3
RET |

µ Niektoré
často používané inštrukcie
Súbor inštrukcii CPU x86 pozostáva z
okolo 20
tried inštrukcii. Z nich 7 typov inštrukcii má 2 operandy, 8 typov má 1
operand a 5 typov je bez oparandu. Mezi základné typy inštrukcii patria:
-
presuny (mov ),
-
aritmetické a logické inštrukcie a
-
inštrukcie na riadenie postupu programu.
-
Presuny:
Zápis inštrukcie
v tvare:
|
|
MOV |
ciel, |
Zdroj |
|
|
Napríklad: |
MOV |
ax, |
bx. |
|
Mov nepôsobí na flagy => pozor pri
testovaní.

Bfig.4.2 -
Priklady rôznych typov instrukcii MOV.
(Na začiatku a na konci zápisu sú použité
rôzne
deklarácie, ktoré s debuggerom nemajú nič spoločného. Na formálny zápis
postupnosti inštrukcii bol použitý assembler => neskôr o tomto
programe
bude zmienka.)
CSEG SEGMENT |
ASSUME
CS:CSEG,DS:cSEG,SS:cseg |
|
code = 1234h |
exword label
word
;Specifikuje typ premenej!! |
exbyte label
byte
; príklady uloženia priamych operandov |
|
our_prog
proc
; Fiktivny program |
|
;medziregistové
presuny |
mov
ax,bx
;Register bx --> ax |
mov
bx,ax
;Register ax --> bx |
|
;presuny medzi
pamäťou a registrami |
mov
cx,exword
;Memory -->register |
mov
exword,cx
;Register --> memory |
mov
ch,exbyte
;Memory --> register (byte) |
mov
exbyte,dh
;Register --> memory (byte) |
|
;presun priamy
operand do registra / pamäte |
mov
si,1000h
;Priamy operand --> register |
mov
bl,23
;Priamy oprd --> register(byte) |
mov
exword,2000
;Priamy operand --> memory |
mov
exbyte,46
;Priamy operand --> memory (byte) |
|
;presun do / z
segmentového registra uskutočnuje nepriamo cez iný register |
mov
ds,exword
;Memory --> segment register |
mov
ds,ax
;Register -->segment register |
mov
exword,ds
;Segment register-->memory |
mov
ax,es
;Segment register-->register |
|
;Priama hodnota
do segment registra |
mov
ax,code
;Zadat priamu hodnotu |
mov
ds,ax
;do segment registra |
OUR_PROG ENDP |
CSEG ENDS |
END OUR_PROG |
|

-
Výmena: obsahov
registrov, resp. pamäte o dlžke 8 bit, resp. 16 bit
|
Napríklad: |
XCHG |
reg8, |
reg8 . |
|
|
Respektíve |
XCHG |
reg16, |
reg16 |
|
|
Respektíve |
XCHG |
mem8, |
reg8. |
|
|
Respektíve |
XCHG |
mem16, |
reg16 |
|
|
|
|
|
|
|
|
Napríklad |
XCHG |
bl, |
cl |
=>zamení
obsahy bl a cl |

-
Uloženie adresy:
pomocou
inštrukcii Load Pointer, alebo mov
|
LEA(Load
effeective sddress) |
|
|
|
|
|
|
Napríklad: |
LEA |
AX, |
Exword |
|
|
|
Táto inštrukcia
má rovnako pôsobí ako inštrukcia |
|
|
MOV |
Ax, |
Offset Exword
bx. |
|
|
|
LDS(Load
Pointer DS:SI<--mem) => SI<--mem a DS<-- mem+2 |
|
|
|
|
|
|
|
|
|
LES(Load
Pointer ES:SI<--mem) => SI<--mem a ES<-- mem+2 |
|
|
|
|
|
Napríklad
ak je obsah pamäti od: adresy |
|
|
DS:200 |
11 22 33 44 |
|
=> DS:200
= 2211DS:202 = 4433 |
|
|
|
potom postupnosť
príkazov |
|
|
mov |
bx, 0100h |
|
|
|
|
|
|
lds |
si, [bx+100]ˇ |
|
|
|
|
|
|
|
spôsobí nastavenie
obsahov registrov (SI) = 2211 (DS) = 4433 |

Bfig_4-3.asm -
Príklady použitia inštrukcii XCHG, IN, OUT, LEA, LDS, LAHF:
Priklad
rôznych iných typov
presunu dat-( okrem MOV) |
CSEG SEGMENT |
ASSUME
CS:CSEG,DS:cSEG |
;------------------------------ |
exdword label dword |
exword label word |
exbyte label byte |
;-------------------- |
our_prog
proc
;Fiktivny program |
|
;výmena obsahu
registrov |
xchg
bx,cx
;Register bx <--> register cx |
xchg
bx,exword
;Register bx <--> memory |
xchg
ax,bx
;Register ax <--> register bx |
|
;Na
adresovanie portov bud priamo
0-255 alebo cez DX (aj 0-255) |
in
al,20h
;Port 20h --> AL |
in
al,dx
;Port(DX) --> AL |
out
21h,al
;AL --> port 21h |
out
dx,al
;AL --> port(DX) |
|
;Ozrejmenie
LEA --> pomocou
MOV s rovnakým účinkom |
lea
si,exword
;Adresa(exword) --> si |
mov si,offset
exword
; detto |
;Napríklad
nasleduj[ca inštrukcia
uloži do BX adresu 10. bajtu poľa na ktoré ukazuje DI |
lea bx,10[di] |
|
;Ulozenie
celej adresy => segment+posunutie
do DS:SI |
lds
si,exdword
;M(exdword) --> SI |
;M(exdword+2) --> DS |
|
;Ulozenie
celej adresy => segment+posunutie
do ES:SI |
les
di,exdword
;M(exdword)-->DI |
;M(exdword+2)-->ES |
|
;Precitanie a
ulozenie flagov |
lahf
;Flagy --> ah |
sahf
;AH --> flagy |
|
;XLAT-Translate-Prekonveruje
hodn z (AL) na inu podla tab (BX) |
xlat
exbyte
;M(BX+AL)-->AL |
OUR_PROG ENDP |
CSEG ENDS |
END OUR_PROG |

-
Sľučky : (Loop)
- Inštrukcia sa opakovane vykonáva v sľučke pokiaľ nebude (cx) =0
|
Napríklad: |
|
|
|
|
Mov cx, počet_prechodov_cez_slučku |
|
Label_1: |
Loop Label_1 |
;=>
ako jnz label_1 =>
pokial (cx) = 0 |

-
Inštrukcie operujúce
s reťazcami:
|
LODS=>(A)<--
DS:SI |
|
STOS
=> ES:SI-->(A) |
|
MOVS
=> DS:SI -->ES:SI a zmení obsah DS, SI |
|
|
Podľa
flagu DF buď inc/dec
index registra |
|
CMOS
=>porovnáva ES:DI s DS:SI |
|
SCAS
=> porovnáva ES:DI s (A) a po vykonaní inr/dec DI |
|
REP=>
(Repeate Prefix): - predpona zopakovania inštrukcie : |
|
|
Až
(cx)=0. Je možný aj
jej podmienený tvar |
|
REPE
=> (Rep while equal) pokiaľ nebude cx=0 alebo |
|
REPZ
=> zhodné s REPE opakuje pokiaľ nie je ZF (Zero
flag)= 1 |
|
REPNE=>
opakuje pokiaľ je cx=0 alebo ZF = 0 |
Napríklad vynulovať pamäť od adresy
2000H (pomocou
stosw => cez ES:DI), celkom 2000h buniek t.j. pokiaľ nebude (cx) =
0).
|
|
mov |
ax, 200h |
;segment
adr 2000h/16=200h |
|
|
mov |
es, ax |
|
|
|
mov |
di, 0 |
|
|
|
mov |
cx, 2000 |
|
|
|
cld |
|
;clear
flag => DF=0 a
inc |
|
|
mov |
ax, 0 |
|
|
REP |
STOSW |
|
;opakuje
slovo=0 pokiaľ
cx<>0 |

Bfig_4-22.asm -
Príklady použitia rôznych typov reťazcových inštrukcii
|
Title
Bfig.4.22 -
Priklad rôznych typov reťazcovych inštrukcii |
|
Code
SEGMENT |
|
ASSUME
CS:Code,DS:code,ES:code |
|
exword
label word |
|
exbyte
label byte |
|
exbyte1
label byte |
|
exword1
label word |
|
|
|
our_prog
proc
;Fiktivny program |
|
lods
exbyte
;Load AL z DS:SI |
|
lods
exword
;Load AX z DS:SI |
|
lodsb
;Load AL z DS:SI |
|
stos
exbyte
;Store (AL) doES:DI |
|
stos
exword
;Store (AL) do ES:DI |
|
stosw
;Store (AL) do ES:DI |
|
rep
stosb
;Store (AL) do ES:DI (CX)krat |
|
movs
exbyte1,exbyte
;Presun bajtu ES:DI<--DS:SI |
|
movs
exword1,exword
;Presun slova ES:DI<--DS:SI |
|
movsb
;Presun bajtu ES:DI<--DS:SI |
|
rep
movsw
;Presun slova (CX) krat |
|
scas
exbyte1
;Test AL s [ES:DI] |
|
repe
scasb
;Test AL s [ES:DI] pokial = |
|
repne
scasw
;Test AX s [ES:DI] pokial <> |
|
cmps
exword,exword1
;Porovna slovo [DS:SI] s [ES:DI] |
|
repe
cmpsw
;Porovna slovo pokial=and CX<>0 |
|
repne
cmpsb
;Porovna bajt pokial NE,CX<>0 |
|
our_prog
endp |
|
CODE ENDS |
|
END
OUR_PROG |

-
Posuvy (shift) a
kruhové posuvy
(rotacie)
Bfig_4-21.asm -
Príklady použitia rôznych typov inštrukcii pre posuv a kruhový posuv
Overte si, že posuv vpravo má za
následok
vydelenie číselného obsahu registra dvomi a posuv vľavo vedie k
dvojnásobnému
zväčšeniu čísla uloženého v registri alebo v pamäťovej bunke.
|
TITLE
Bfig.4.21 -
Priklad na posuvy |
|
Code
SEGMENT |
|
ASSUME
CS:Code,DS:code |
|
;---------------------------------------------------- |
|
;Program
vynasobi (AX)*9
bez instrukcie pre nasobenie |
|
;---------------------------------------------------- |
|
our_prog
proc near |
|
mul9:
push cx |
|
push ax |
|
mov cx,3 |
|
sal
ax,cl
;Posuv vlavo o 3 |
|
mov
cx,ax
;CX<--(AX)*8 |
|
pop
ax
;orginalna (AX) |
|
add
ax,cx
;(AX)<--9*(AX) |
|
pop cx |
|
ret |
|
;-------------------------------------------------------- |
|
;Fragment
programu izoluje
z (AX) bit, specifikovany (CX), |
|
;ktory
treba vpred zvonka
zadat. |
|
;-------------------------------------------------------- |
|
push bx |
|
mov
bx,1
;Dat 1 do pozicie bit 0 |
|
rol
bx,cl
;Posunut do polohy (CX) |
|
and
ax,bx
;Zamaskovanie zbytoc bitov |
|
pop bx |
|
our_prog
endp |
|
CODE ENDS |
|
END
OUR_PROG |

Nevýhodou Debuggera je pomerná pracnosť pri
písaní
programov. Zpríjemniť prostredie pre programovanie unožňuje zautomatizovanie
postupu, uvedený v ďalšom texte.

|