Lucifer of ZeroBit - Ja ljublju ASSEMBLY VII. rész |
ÚÄÄÄ
ÚÄÄÄ ÚÄ
ÚÄ Mielőtt még elkezdenénk, van egy kis tartozásom. A múltkor az OF bitről nem a teljes igazságot írtam, ezért újra leírom a funkcióját. Az OF (Overflow Flag) segít az ELÕJELES számok értelmezésében. Mikor egy mûveletet elvégez a proci, csak a sima bináris aritmetikát figyeli, nem foglalkozik előjel bitekkel és egyebekkel. De itt az OF bit, aminek éppen ez a feladata. Mikor
mondjuk összeadjuk a 8343h és a 8654h számokat, akkor
a proci összeadja őket, az eredmény helyére 0997h kerül
és a CF bit 1 lesz, jelezve az átvitelt. De mi van, ha én
a két számot előjelesen képzeltem el. Nézzünk
egy példát arra, hogy mikor lesz 0 az OF. Röviden az OF azt jelzi, ha egy előjelesen is értelmezhető szám nem fér el egy byteon (az előjelével együtt). Egy szón a legkisebb ábrázolható előjeles szám a -32768, a legnagyobb pedig a +32767. Egy byteon a legkisebb -128 a legnagyobb +127. Ha az eredmény előjeles értelmezése ennél kisebb vagy nagyobb lenne, az OF 1 lesz. Ahhoz,
hogy a helyes számot megkapjuk (például képernyőre
való kiíráshoz) a következőket kell tenni: 2.
Ha OF=1, Példa: az eredmény 0567h és SF=0, OF=1, akkor a helyes eredmény 10567h kettes komplemens értéke az eredmény 9234h és SF=OF=1, akkor az igazi eredmény 09234h kettes komplemensben Mindkét
esetben használható értelemszerûen byte helyett
szó. (A kettes komplemens amúgy nem csak a számok értelmezését jelenti (úgy, ahogy az előző számban leírtam, hanem azt is, hogy két szám egymásnak kettes komplemense (kiegészítője), ha összegük nulla. Ehhez viszont kell a már leírt értelmezés.) Akkor mit is számít, hogy az előjeles vagy az előjel nélküli ugróutasítást használjuk. Nem kezdek elméleti fejtegetésekbe, mert azt lehet, hogy nem mindenki értené. Inkább 4 gyakorlati példán mutatom be a különbséget. Minden példa egy-egy számpárra fog épülni, amelyeket összehasonlítunk és megnézzük, hogy melyik ugrás mikor következik be. I.
Először nézzük a 15h és a 34h számokat.
Ezek bináris alakja: 15h=00010101b, 34h=00110100b. Amint látjátok
mind a kettőt 8 bitre kiegészítve alakítottam át,
mivel egy byte 8 bites. Most meg kell nézni, hogy a jelzőbitek
hogy állítódnak be. Látható, hogy mikor a 0-1 mûveletet végezzük el (az 5. bitek kivonása), akkor a szomszédos helyiértékről kölcsönözni kell egy 1-est, hogy a 10b-1b mûveletet kapjuk, amit már el tudunk végezni. Ennek az eredménye 1b, amit le is írunk. Mehetünk tovább, de nem szabad elfelejteni a kölcsönt. A következő kivonás a 0b-0b lenne, de volt egy kölcsönzés, amit most visszaadunk, így lesz 0b-0b helyett 0b-1b. Ezt viszont megint csak kölcsönzéssel tudjuk elvégezni, de a kölcsönt megint visszaadjuk majd. Ez így megy addig, amíg van kivonandó helyiértékünk. Ha ezután is maradt még tartozásunk, akkor az leírjuk a mínusz jel alá, ahogy én is tettem. De egy byteban csak 0-7 bitek szerepelnek, a mínusz jel alatti számjegy pedig már a 8-ik bit (figyeljetek: a jobb szélső bit a 0-ik). Ezért ezt a plusz bitet a CF-be tesszük, ez jelzi, hogy a kivonás végén kölcsönzés volt, azaz a 15h kisebb, mint a 34h. A byte 7. bitje 1, ezért az SF jelzőbit 1 lesz. Mi lesz az OF-fel? A két számot előjelesnek feltételezve az eredmény -31 (0eah). Ez ábrázolható 1 byteon ezért OF=0 lesz. Végül
mely ugróutasítások ugranak ez után (csak
azokat nézem, amelyeknek van előjeles/nélküli párja).
- JB és JBE elugrik, mert CF=1. A számokat előjel nélkül nézve 15h kisebb 34h-nál. - JG és JGE nem ugrik, mert SF<>OF. Előjelesen 15h nem nagyobb, mint 34h. - JL és JLE elugrik, mert SF<>OF. Előjelesen 15h kisebb 34h-nál. II.
A következő számpár a 15h és a 87h legyen. Most
már nem részletezem a kivonások menetét. Itt
is a CMP 15h,87h az alap. Mik
ugranak: - JG és JGE elugrik, mert SF=OF. Most figyelj: 15h előjelesen NAGYOBB 87h-nál (előjel nélkül kisebb, nézd meg JB-nél) - JL és JLE nem ugrik mert SF=OF. 15h előjelesen nem kisebb, mint 87h. Figyeld meg, hogy előjel nélkül kisebb. III.
Most nézzük a 87h és 0b4h számokat. - JB és JBE ugrik, mert CF=1. Azaz előjel nélkül 87h kisebb 0b4h-nál - JG és JGE nem ugrik, mert SF<>OF. A 87h (-121) előjelesen nem nagyobb 0b4h-nál (-76). - JL és JLE ugrik, mivel SF<>OF. 87h előjelesen kisebb 0b4h-nál IV.
Legyenek 0b4h és 87h a számok (az előző fordítottja) Van még két lehetőség a számok viszonyára, mikor az I. vagy a II. pontot fordítjuk meg úgy , ahogy a IV. pont a III. fordítottja. Ezeket vezesd le magad. Az elgondolásod helyességét például Turbo Debuggerrel ellenőrizheted le.
OF - 1 lesz, ha az eredmény előjelesen értelmezve nem fér be a célba pl.: 87h+87h=10eh, a célba 0eh kerül, de a valódi érték nem 14, -242 (10eh kettes komplemense), ha előjelesen dolgozunk ZF - 1, ha az eredmény nulla SF - 1, ha az eredmény 7. bitje 1 AF - 1, ha a mvelet közben a legalsó négy bitről átvitel volt az 5. bitre PF
- 1, ha az eredményben páros számú 1-es van
Csak annyiban különbözik az ADD-tól, hogy cél=cél + forrás + CF. Minden más egyezik. Ezt például duplaszavas összeadásnál használjuk, mikor az első összeadás esetleges átvitelét fel kell használni a másodiknál. Nem csak duplaszavas, hanem akárhány szavas összeadásra is alkalmas, csak tovább kell vinni. Példa:
A cél=cél - forrás mveletet hajtja végre. A cél és a forrás lehet byte vagy szó. A forrás lehet byte hosszúságú is, ha a cél egy szó. Ekkor a byteot 16 bitesre kiterjeszti kivonás előtt. A jelzőbitek ugyanakkor állítódnak be, mint összeadáskor.
A különbség a SUB-hoz képest annyi, hogy ez a cél=cél - forrás - CF mûveletet végzi el. Több szóból álló kivonásnál hasznos, mert az előző kivonások esetleges kölcsönzéseit (borrow) figyelembe veszi. Példa:
Lucifer of ZeroBit |
Š2000. Fearless Criminal Force. Minden jog fenntartva! |