Ú-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 :
  • 1. Priamy operand.


  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] .


  Napríklad:  Movsb








µ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.




 

µ  Debugger

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.


 


[Návrat]